は私がからのオフセットを知らない元user32.dllのファイルへの関数の残りの部分を転送します.textセグメントは具体的ですが、デバッガでは必要なアドレスを見て、そこからモジュールの負荷オフセットを引きます。ベースアドレスが明示的に設定されていても毎回異なるアドレスにロードされる可能性があります。
ランタイムパッチの代わりに、dll自体を単にパッチするだけでもかまいません。 OllyDbgは、バイナリに簡単にパッチを適用できる優れたアセンブリレベルのデバッガとコード解析ツールです。
編集:
ちょうど楽しみのためにここで私は、バイナリパッチに私はアプリで好きではなかったいくつかの機能拡張を使用するために使用されるいくつかのサンプルコードです - 実行時には。私はいくつかの単純化を行い、再コンパイルとテストはしませんでしたが、あなたはそのアイデアを得るべきです。
(私はバイナリを定期的知らオフセットから小さな範囲内のパターンと一致するように、したがって、追加の作業を更新されたことの合併症を有していた。)
void MyCrazyPatch()
{
static bool patched = false;
if (!patched)
{
patched = true;
DWORD dwPatchOffsetStart = 0x5310;
DWORD dwPatchLength = 22;
BYTE rgPatchMatch[] = { 0xab, 0x07, 0x37, 0x56, 0x50, 0xe8, 0x92, 0xfb, 0xff, 0xff, 0x83,
0xf8, 0x01, 0x89, 0xb5, 0xfc, 0x0f, 0x85, 0xb2, 0xaa, 0x00, 0x00, 0x8b };
HMODULE hmod = GetModuleHandle(L"mybinary.dll");
if (hmod != NULL
{
MODULEINFO modInfo;
if (GetModuleInformation(GetCurrentProcess(),
hmod,
&modInfo,
sizeof(modInfo)))
{
DWORD dwIncrement = 0;
dwPatchOffsetStart += (DWORD)modInfo.lpBaseOfDll;
while (dwIncrement < 0x200 &&
memcmp((void*)(dwPatchOffsetStart + dwIncrement),
rgPatchMatch,
sizeof(rgPatchMatch)) != 0)
{
dwIncrement++;
}
// Sanity check then add nop's to stomp out the offending code.
if (dwIncrement < 0x200 &&
memcmp((void*)(dwPatchOffsetStart + dwIncrement),
rgPatchMatch,
sizeof(rgPatchMatch)) == 0)
{
DWORD dwOldProtect = 0;
VirtualProtect((void*)(dwPatchOffsetStart + dwIncrement),
dwPatchLength,
PAGE_EXECUTE_READWRITE,
&dwOldProtect);
memset((void*)(dwPatchOffsetStart + dwIncrement), 0x90, dwPatchLength);
VirtualProtect((void*)(dwPatchOffsetStart + dwIncrement),
dwPatchLength,
dwOldProtect,
NULL);
}
}
}
}
}
ない、これは動作します。実行可能ページを変更するとコピーオンライトがトリガーされるので、実行中のプロセスはパッチコードを使用します。 –
データページの仕組みは分かっていますが、コードページでも同じであることはわかりませんでした。しかし、意味があります。 –