[英]Call a function twice with Assembly and C++
我有一個代碼可以將要調用的函數更改為我的新函數,但我不想只調用我的新函數,我也想調用舊函數。 這是一個例子,所以你可以理解我在說什么:
如果我反匯編我的.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。
謝謝。
ret
期望頂部堆棧參數是要返回的地址。 您可以通過在新函數中的ret
指令之前立即將舊功能地址壓入堆棧來利用此功能。 當調用返回(或者更確切地說,分支到oldfunction)時,堆棧指針將移位以保留原始返回地址(此處為0x128),因此堆棧將顯示為未損壞。 (如果沒有繞道而行應該是這樣的)。
我有一段時間有這樣的問題。 無論如何, _asm call dword ptr [oldfunction]
為我工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.