【发布时间】:2012-08-16 18:14:35
【问题描述】:
我又一次面临着对我的代码进行轻微修改以适应无法修改的一些编写不佳代码的库的挑战。
经过数小时的研究(在发现您无法将任何类型的状态传递给函数指针之后),我需要在将 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)
调试器在做什么来找到正确的地址?如何以编程方式找到正确的地址?
【问题讨论】:
-
为什么要投反对票?真的没有其他方法可以做到这一点。
-
保存
EAX,然后在它被破坏后恢复它? -
@MarkB 我不能 - 我无法控制。
-
那只是我曾经在Old New Thing上看到的一个问题:你确定你没有把一个问题分解成一个简单的问题和一个不可能的问题,然后解决了简单的问题而不是试图解决最初的问题?
-
@MarkB - 不。这个问题是两个问题的组合:该代码不允许将任何类型的用户数据传递给回调,以及 C++ 不允许'不允许将任何类型的状态传递给函数指针'回调'。
标签: c++ debugging visual-c++ function-pointers memory-address