【发布时间】:2010-07-13 02:05:01
【问题描述】:
我有一个代码可以将要调用的函数更改为我的新函数,但我不想只调用我的新函数,我也想调用旧函数。 这是一个例子,所以你可以理解我在说什么:
如果我反汇编我的.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_L00999999,而是调用 MyNewFunction...
那么...关于如何调用旧函数的任何想法?
我尝试过这样的事情(在很多方面),但它使我的应用程序崩溃:
int MyNewFunction(int parameter)
{
DWORD oldfunction = 0x00999999;
_asm push parameter
_asm call oldfunction
}
注意:我使用 Visual Studio C++ 2010,这些代码位于 .exe 中加载的 .dll 中。
谢谢。
【问题讨论】:
标签: c++ memory assembly hook inline-assembly