我又一次面临着对我的代码进行轻微修改的挑战,以适应一些编写不佳的代码的不可修改的库。
经过数小时的研究(在发现您无法将任何类型的状态传递给函数指针之后),我需要在将 EAX 重置为 0xCCCCCCCC 的函数头中删除 ASM 字节。
通过使用内置的 VC++ 调试器获取函数的“地址”并在作弊引擎中手动创建一个字节数组(这对这类事情非常有用),它成功提取了字节,我可以 NOP 5字节序列手动。
但是,以编程方式执行此操作有点不同。
当我执行以下任何操作时,地址明显高于调试器报告的地址,这给了我一个指向错误字节的指针。
unsigned int ptr = reinterpret_cast<unsigned int>(testhack);
unsigned char* tstc = (unsigned char*)&testhack;
FARPROC prc = GetProcAddress(GetModuleHandle("mod.dll"), "testhack"); // Still
// returns the incorrect address (same as the previous two)
调试器在做什么来找到正确的地址?如何以编程方式找到正确的地址?