4

呼び出される関数を新しい関数に変更するコードがありますが、新しい関数だけを呼び出すのではなく、古い関数も呼び出したいです。これは例なので、私の言っていることが理解できます。

.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 にあります。

ありがとう。

4

2 に答える 2

2

retトップスタック引数が戻るアドレスであることが期待されます。retこれを利用するには、新しい関数での命令の直前に古い関数のアドレスをスタックにプッシュします。呼び出しが戻ると(または、古い関数に分岐すると)、スタックポインターがシフトして、元の戻りアドレス(ここでは0x128)が一番上に残るため、スタックは損傷を受けていないように見えます。(迂回しなかった場合と同じです)。

于 2010-07-13T02:28:18.547 に答える
2

私はしばらく前にこのような問題を抱えていました。とにかく、_asm call dword ptr [oldfunction]私のために働いた。

于 2010-07-13T04:26:00.540 に答える