代码之家  ›  专栏  ›  技术社区  ›  Toribio

用汇编和C++调用函数两次

  •  4
  • Toribio  · 技术社区  · 15 年前

    我有一个代码可以将要调用的函数更改为新函数,但我不想只调用新函数,我还想调用旧函数。 这是一个例子,所以你可以理解我的意思:

    如果我分解.exe,我将查看以下部分:

    L00123456:
          mov   eax, [L00654321] //doesn't matter
          mov   ecx, [eax+1Ch]   //doesn't matter
          push  esi              //the only parameter
    0x123 call  SUB_L00999999    //this is the function I wanna overwrite
          //...
    

    (0x123是该行的地址) 所以,我用了这个代码:

    DWORD old;
    DWORD from = 0x123;
    DWORD to   = MyNewFunction;
    VirtualProtect(from, 5, PAGE_EXECUTE_READWRITE, &old);
    
    DWORD disp = to - (from + 5);
    *(BYTE *)(from) = 0xE8;
    *(DWORD *)(from + 1) = (DWORD)disp;
    

    现在,它不再调用Sub_,而是调用MyNewFunction…

    所以…关于如何调用旧函数有什么想法吗?

    我尝试过这样的方法(在很多方面),但它会使我的应用程序崩溃:

    int MyNewFunction(int parameter)
    {
        DWORD oldfunction = 0x00999999;
        _asm push parameter
        _asm call oldfunction
    }
    

    注意:我使用VisualStudioC++ 2010,这些代码是在.exe中加载的.dll。

    谢谢。

    2 回复  |  直到 12 年前
        1
  •  2
  •   Neal P    15 年前

    我以前遇到过这样的问题。不管怎样, _asm call dword ptr [oldfunction] 为我工作。

        2
  •  2
  •   Mark H    15 年前

    ret 期望Top Stack参数是要返回的地址。您可以通过在您的 雷特 新功能的说明。当调用返回时(或者更确切地说,分支到OldFunction),堆栈指针将移动以使原始返回地址(此处为0x128)保持在顶部,因此堆栈将看起来未损坏。(如果你没有绕道走的话,也应该是这样)。

    推荐文章