zoukankan      html  css  js  c++  java
  • c++反汇编代码分析偷调函数

    推荐阅读:

    C++反汇编代码分析–函数调用

    C++反汇编代码分析–循环结构

    C++反汇编代码分析–偷调函数

    走进内存,走进汇编指令来看C/C++指针

    注:不知道说“偷调函数”说法合不合适,在此也就这样一说了~

    主要有两点:

    一、再说C++反汇编函数调用,重点是怎样通过堆栈实现由被调用函数转到调用者

    二、在 1 的基础上,在WinDbg下通过修改EIP实现如下一个功能:

      有两个函数foo()和hack(),在main函数中调用foo,但是在foo执行过程中,通过修改EIP来调用hack函数,最后再回到main中foo函数的下一条语句

    一、再说C++反汇编函数调用,重点是怎样通过堆栈实现由被调用函数转到调用者

    程序如下(很简单):

    1 #include "stdafx.h"
    2
    3  int MyAdd(int a,int b)
    4 {
    5 return a+b;
    6 }
    7
    8  void main()
    9 {
    10 MyAdd(1,2);
    11 }

    反汇编后如下:

    void main()
    11:   {
    00401080   push        ebp
    00401081   mov         ebp,esp
    00401083   sub         esp,40h
    00401086   push        ebx
    00401087   push        esi
    00401088   push        edi
    00401089   lea         edi,[ebp-40h]
    0040108C   mov         ecx,10h
    00401091   mov         eax,0CCCCCCCCh
    00401096   rep stos    dword ptr [edi]

    12:       MyAdd(1,2);
    00401098   push        2
    0040109A   push        1 

    ;程序执行到这,堆栈内容如下(至于为什么是这,请参看《c++反汇编代码分析--函数调用》)

     

    0040109C   call        @ILT+15(hook) (00401014);

    --------------------------------开始转入MyAdd函数去执行--------------------------

    ;在执行0040109C   call        @ILT+15(hook) (00401014)到这句时,F11单步调试,会依次执行下边的反汇编代码:

    00401014   jmp         MyAdd (00401030) 

    ;执行到此句时,ESP和EBP还是原来的值吗?
    ;我们可能会觉得,现在也没有push操作,ESP和EBP应该还是应该如上图一样没有变化吧
    ;非也,其实执行到这一句时,已经有一个自动的入栈操作,入栈的是0040109C   call        @ILT+15(hook) (00401014)
    ;这条指令的下一条指令的地址,具体如下图所示:
    ;执行到0040109C   call        @ILT+15(hook) (00401014)这条语句时,如图:
    ;执行到0040109C   call        @ILT+15(hook) (00401014)这条语句,按F11后,如下图:
    ;此时的堆栈情况如下图

    ;之后,转入下边的程序执行
    5:    int MyAdd(int a,int b)
    6:    {
    00401030   push        ebp

     
    ……
        }
    ……
     
     
     
    ;执行过ret后,会自动将堆栈中retAddr的值弹给EIP,从而完成从被调用函数MyAdd转到main函数中去执行。
    ;这一点十分重要,也就是 二 的理论基础了吧。
    00401053   pop         ebp
    00401054 ret
    --------------------------MyAdd子函数执行完毕,在此进入main函数执行------------------------------------


    004010A1   add         esp,8
    13:   }
    004010A4   pop         edi
    ......

    二、在 一 的基础上,在WinDbg下通过修改EIP实现如下一个功能:......

    程序如下:

     

    #include <iostream>
    usingnamespace std;
    void foo()
    {
    printf(
    "--foo--\n");
    }
    void hook()
    {
    printf(
    "--hook--\n");
    }

    void main()
    {
    foo();
    hook();
    }

    理论如图:

     

    输出为:

    --foo--

    --hack--

    --hack--

    (具体实现参考 第一部分 结合这里给出的图示,应该很快可以出来了,嘿嘿,困了,偷懒~有时间会将如何看反汇编代码,如何查看寄存器,以及如何在windbg这个终极利器下调试程序等等做下总结,都是很基本的,包括今天费了老大劲,写到半夜的东西,也没有什么用,只是帮助理解,大侠们莫嘲笑,我只是初学阶段,正在努力!) 

  • 相关阅读:
    监控里的主码流和子码流是什么意思
    监控硬盘容量计算
    一个能让你了解所有函数调用顺序的Android库
    电工选线
    oracle linux dtrace
    list all of the Oracle 12c hidden undocumented parameters
    Oracle Extended Tracing
    window 驱动开发
    win7 x64 dtrace
    How to Use Dtrace Tracing Ruby Executing
  • 原文地址:https://www.cnblogs.com/shitouer/p/1705893.html
Copyright © 2011-2022 走看看