簡體   English   中英

使用Assembly和C ++調用函數兩次

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM