我是一个有用的助手,可以翻译文本。
我有一段代码,它会将要调用的函数更改为我的新函数,但我不仅想调用我的新函数,还想调用旧函数。这是一个例子,让您了解我的意思:
如果我反汇编我的.exe文件,我将看到以下部分:
英译中:
现在,它不再调用SUB_L00999999函数,而是调用MyNewFunction函数...那么,你有什么想法如何仍然调用旧函数吗?我尝试过很多方式,但都会导致我的应用程序崩溃。
注:我使用的是Visual Studio C++ 2010,这些代码在一个.exe中加载的.dll文件中。
谢谢。
我有一段代码,它会将要调用的函数更改为我的新函数,但我不仅想调用我的新函数,还想调用旧函数。这是一个例子,让您了解我的意思:
如果我反汇编我的.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文件中。
谢谢。
_asm { push oldfunction; ret 4 }
并通过调试器检查输出。我不确定C编译器是否会添加/删除其他可能会破坏堆栈的内容。当进入oldfunction时,堆栈应该与进入newfunction时完全相同。 (哦,还有一些寄存器可能需要相同,您可能需要在retn之前设置它们)。 - Mark H