[原创]写花指令
2013-8-16 15:41
9889
[原创]写花指令
2013-8-16 15:41
9889
花指令,就是一串用来迷惑反编译器的汇编指令,它是利用编译器线性扫描算法的缺陷来达到的,比如说反编译器读取到E8(对应CALL汇编码)这机器码,接着会往下读取四个字节的数据作为跳转地址,如果我们在写程序的时候嵌入_asm _emit 0E8,反编译器就会把下一条指令当做地址数据,不管下一条指令的四个字节是地址数据还是操作指令。
在EXE中加入花指令,只要记住程序原入口点,在程序中找个地方写一段保持堆栈平衡的花指令,然后跳转回原入口点,再用PE工具改写下入口点,使花指令开头段为程序入口点。
在源码中加入花指令,可以加个头文件,用定义的方式#define来写,在cpp中包含进来直接使用,下面是一些代码。
//添加花指令开关 注释掉 就可以无花指令调试程序
#define _start_add_FLOWER
#ifndef _start_add_FLOWER
#define _FLOWER_XX0 _asm nop
#else
#define _FLOWER_XX0 _asm \
{\
_asm jle $+0dh \ // 如果小于或等于 就跳转到当前地址加13的地址
_asm jg $+07h \ //如果大于 就跳转到当前地址加7的地址
_asm _emit 0E8h \ //花指令 程序执行前面两条指令会直接跳转过去,不会执行这条语句,只是迷惑反编译器
#endif
#ifndef _start_add_FLOWER
#define _FLOWER_XX1 _asm nop
#else
#define _FLOWER_XX1 _asm \
{\
_asm _emit 090h\
_asm _emit 090h \
_asm _emit 090h \
_asm pushad\ //保持堆栈平衡
_asm jmp $+36h\ //直接跳到popad处 这条指令开始往下数一共有36个字节
_asm mov ebp,esp \
_asm push -1 \
_asm push 112233h \
_asm push 332211h \
_asm mov eax,DWORD ptr fs:[0] \
_asm push eax \
_asm mov DWORD ptr fs:[0],esp \
_asm pop eax \
_asm mov dword ptr fs:[0],eax \
_asm pop eax \
_asm pop eax \
_asm pop eax \
_asm pop eax \
_asm mov ebp,eax\
_asm mov eax,401050h\
_asm push eax\
_asm _emit 0xE8\
_asm retn\
_asm popad\ // 保持堆栈平衡
}
#endif
……
可以定义从_FLOWER_XX0到_FLOWER_XX9等多个花指令
然后在CPP中使用
void test()
{
_FLOWER_XX0;
printf("you are writing flower_xx0,\n");
_FLOWER_XX1;
printf("you are writing flower_xx1,\n");
……
}
也可以定义花指令组,
#ifndef _start_add_FLOWER
#define _FLOWER_XX_GROUP0
#else
#define _FLOWER_XX_GROUP0 _FLOWER_XX0;_FLOWER_XX1;_FLOWER_XX2
#endif
第一次写,写的不好请见谅。