c++ - 获取函数地址时的奇怪行为

标签 c++ debugging visual-c++ function-pointers memory-address

我又一次面临着对我的代码进行轻微修改以适应一些编写糟糕的代码的不可修改库的挑战。

经过几个小时的研究(在发现你不能将任何类型的状态传递给函数指针之后),我需要 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/

相关文章:

C++初学者删除代码

c++ - 如何访问封装在类中的未命名的 "enum class"?

debugging - Netbeans 6.7是否无法在Grails应用程序中调试Groovy闭包?

visual-c++ - 链接msvcprt中的Boost Boost静态正则表达式提取

c++ - 将位图设置为 Static Control MFC 时出现问题

c++ - “operator”是C++标准库的一部分吗?

C++ 专用模板函数接收文字字符串

ios - 设备连接到Xcode时,应用工作正常,但在特定位置安装ipa时失败

c - Unix 上的段错误 - 可能的堆栈损坏

c++ - 如何使用vc++获取菜单项文本?