我不知道从偏移.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);
}
}
}
}
}
没有,这将工作。更改可执行页面将触发写入时复制,因此运行过程将永久使用修补后的代码。 – 2009-08-06 02:19:57