反调试——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("原来的函数地址!!!!
");
18     return 0;
19 }
20 
21 void test()
22 {
23     printf("test!!!
");
24     test2();
25     exit(1);
26 }
27 
28 void test2()
29 {
30     printf("test2!!!!
");
31 }

结果如图,跳转到push进去的地址处打印字符

 

 利用IDA的反汇编结果,可以看到F5大法已经失效了,如果要进行分析,只能通过汇编进行分析

 

原文地址:https://www.cnblogs.com/QKSword/p/10673642.html