zoukankan      html  css  js  c++  java
  • 反调试——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大法已经失效了,如果要进行分析,只能通过汇编进行分析

     

  • 相关阅读:
    Arrays类的使用
    System类的使用
    <---------------------装箱,拆箱的过程-------------------------->
    Calendar类的使用——闰年的计算
    Eclipse无法编译,提示错误“找不到或者无法加载主类”解决方法
    <--------------------------Date类的使用------------------------------>
    正则表达式
    <--------------------------StringBuffer的常用方法------------------------------>
    Object 及toString() 方法的重写
    <---------------线程修改名字、得到名字及开启------------------>
  • 原文地址:https://www.cnblogs.com/QKSword/p/10673642.html
Copyright © 2011-2022 走看看