反调试——jmp到那个地址
目录
1.前言
2.原理讲解
3.代码实现
前言
这节的反调试是通过构造代码来干扰正常的分析。反调试参考CrypMic勒索病毒
原理讲解
在逆向分析汇编代码时,一般都是通过汇编指令call或jmp跳到一个函数内进行执行,这次的反调试就是利用特殊构造代码实现指定跳转
在汇编中call address可以分解为两条指令:push eip+6,jmp address。这里的push eip+6是保存call指令的下一个指令地址作为返回地址,一般eip+6就是指向call指令的下一条指令,jmp address是跳到指定的地址里执行命令。函数执行完后通过retn返回到原来的地址中继续执行。retn可以分解为:pop eip,jmp eip。这里pop的eip就是前面保存的返回地址
上面是正常的函数调用,但是我们可以通过对汇编代码进行构造跳转到指定的地址。我们前面看到call是首先把返回地址入栈,然后jmp到指定地址执行,执行到汇编指令retn的时候就把返回地址pop出来,然后跳转回去执行。如果我们自己构造push address 再jmp到一个地址,那么通过retn返回的时候就可以返回到前面push进去的指定address了。如图中的执行流程。
代码实现
代码实现处借助了API函数getchar进行中间跳板,然后跳转到指定函数中执行代码,跳转到指定的函数后需要自己结束程序,否则会由于没有指定返回地址而导致程序崩溃
1 #include<Windows.h> 2 #include<stdio.h> 3 4 /* 5 注意事项:使用这种方式不会跳回来原来的函数,不过可以定向跳到其他函数去实现功能 6 */ 7 void test(); 8 void test2(); 9 10 int main() 11 { 12 __asm 13 { 14 push test 15 jmp getchar 16 } 17 printf("原来的函数地址!!!!\n"); 18 return 0; 19 } 20 21 void test() 22 { 23 printf("test!!!\n"); 24 test2(); 25 exit(1); 26 } 27 28 void test2() 29 { 30 printf("test2!!!!\n"); 31 }
结果如图,跳转到push进去的地址处打印字符
利用IDA的反汇编结果,可以看到F5大法已经失效了,如果要进行分析,只能通过汇编进行分析
谦谦君子,卑以自牧