我又一次面临着对我的代码进行轻微修改以适应一些编写糟糕的代码的不可修改库的挑战。
经过几个小时的研究(在发现你不能将任何类型的状态传递给函数指针之后),我需要 NOP 出函数头中将 EAX 重置为 0xCCCCCCCC 的 ASM 字节。
通过使用内置的 VC++ 调试器获取函数的“地址”并在 Cheat Engine 中手动创建一个字节条目数组(这对这类事情非常有用),它成功地提取了字节,我可以手动 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)
调试器正在做什么来找到正确的地址?如何以编程方式找到正确的地址?
最佳答案
推测函数地址在 DLL 中。在那种情况下,您看到的是加载程序将例如 &testhack
的地址重新定位到加载程序的内存的正确位置。调试器可能已经知道重定位,并自动为您处理,允许您修改字节。
不幸的是,我不知道有什么机制可以解决这个问题,但如果您静态链接,地址将在链接时而不是运行时固定。
关于c++ - 获取函数地址时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11993071/