利用编译器实现汇编代码转换机器码/shellcode
来52那么久了,一直潜水。。第一次发贴。。先上效果图
原理就是
利用把汇编代码插入到cpp源文件种利用vc编译器生成目标程序,再从相应的位置种读取我们的机器码就行了,是不是很简单。。
代码送上
窗口为了方便直接易语言写了
注意:代码中中文部分请自行更改,不要copy直接f5
#include "windows.h"
/* 特征码搜索 */
union MyUnion
{
CHAR code2;
int code;
};
int main()
{
/* 读入到内存 */
DWORD dwFileSize = 文件_获取文件大小(TEXT("c:\\C.exe"));
if (INVALID_FILE_SIZE == dwFileSize) { cout << "获取文件大小失败"; return 0; }
/* 分配大小并读入 */
wstring strpath = 文件_取程序执行目录() + wstring(TEXT("\\c.exe"));
CHAR *pFilrBuff = new char;
文件_读入文件((WCHAR*)strpath.data(), pFilrBuff);
/* 特征码定位 */
CHAR *startCode = pFilrBuff + 0x1002;
CHAR *endCode;
/* 结尾需要搜索下 */
/*此处代表结尾
.text:00401003 59 pop ecx
.text:00401004 5B pop ebx
.text:00401005 58 pop eax
.text:00401006 C3 retn
*/
MyUnion code;
code.code2 = 0x59;
code.code2 = 0x5b;
code.code2 = 0x58;
code.code2 = 0xc3;
for (int n = 0; n <= 1000;n++)//搜索1000次找不到就算了
{
if (*((int*)(startCode + n)) == code.code)//找到
{
endCode = (startCode + n);
break;
}
}
/* 找到后输出两指针中间的数据即为机器码 */
/* 例如startCode此时指向51那个地方endCode指向59
.text:00401000 50 push eax
.text:00401001 53 push ebx
.text:00401002 51 push ecx
.text:00401003 B8 01 00 00 00 mov eax, 1
.text:00401008 BB 02 00 00 00 mov ebx, 2
.text:0040100D 59 pop ecx
.text:0040100E 5B pop ebx
.text:0040100F 58 pop eax
.text:00401010 C3 retn
*///输出机器码
cout << "The shellcode is:";
while (++startCode != endCode)
{
cout << hex << (int)((unsigned char)*startCode)<<" ";
}
/* 删除 */
delete []pFilrBuff;
MessageBoxA(NULL, "生成完毕!", NULL, MB_OK);
return 0;
}
易语言部分更简单了
.版本 2
.子程序 _按钮1_被单击
' 生成cpp源文件
写到文件 (“C.CPP”, 到字节集 (#常量1 + #换行符 + 编辑框1.内容 + #换行符 + #常量2))
' 调用vc编译器生成程序
运行 (“编译.bat”, 假, )
运行 (“Main.exe”, 假, )
编译.bat 会用vc编译器编译C.CPP
然后Main.exe 从编译的文件种读取机器码
完。。。
如果你觉得有用的,,记得点个赞再走 。。
自顶。。。评论多的话打包全部附件。。 lz经过一番挣扎 已经封装好了 及其方便{:1_886:}
更新了。火钳刘明 不错,是个好帖子! 源码放在老家电脑硬盘了,可能国庆回家带过来 原来是这样做出来的,最近一直在好奇什么是特征码,原来就是汇编变成机器代码
页:
[1]