反调试——jmp到那个地址

时间:2023-03-08 18:12:35

目录

1.前言

2.原理讲解

3.代码实现

前言

这节的反调试是通过构造代码来干扰正常的分析。反调试参考CrypMic勒索病毒

原理讲解

在逆向分析汇编代码时,一般都是通过汇编指令call或jmp跳到一个函数内进行执行,这次的反调试就是利用特殊构造代码实现指定跳转

反调试——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就是前面保存的返回地址

反调试——jmp到那个地址

上面是正常的函数调用,但是我们可以通过对汇编代码进行构造跳转到指定的地址。我们前面看到call是首先把返回地址入栈,然后jmp到指定地址执行,执行到汇编指令retn的时候就把返回地址pop出来,然后跳转回去执行。如果我们自己构造push address 再jmp到一个地址,那么通过retn返回的时候就可以返回到前面push进去的指定address了。如图中的执行流程。

反调试——jmp到那个地址

代码实现

代码实现处借助了API函数getchar进行中间跳板,然后跳转到指定函数中执行代码,跳转到指定的函数后需要自己结束程序,否则会由于没有指定返回地址而导致程序崩溃

 #include<Windows.h>
#include<stdio.h> /*
注意事项:使用这种方式不会跳回来原来的函数,不过可以定向跳到其他函数去实现功能
*/
void test();
void test2(); int main()
{
__asm
{
push test
jmp getchar
}
printf("原来的函数地址!!!!\n");
return ;
} void test()
{
printf("test!!!\n");
test2();
exit();
} void test2()
{
printf("test2!!!!\n");
}

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

反调试——jmp到那个地址

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

反调试——jmp到那个地址