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