C与Python代码Dump MessageBoxA得到不同十六进制值的问题
C代码Dump MessageBoxA结果不正确的常见原因
函数地址解析偏差
Windows里MessageBoxA是导出函数,但用GetProcAddress拿到的地址往往是导入表中的跳转桩地址,而非函数实际机器码的起始位置。Python如果是直接读取磁盘文件,通过解析PE导出表计算出函数在文件中的偏移来读取,自然和HxD一致;但C代码如果直接Dump这个跳转桩的内存内容,得到的只是跳转指令,不是真正的函数代码。内存与文件的偏移混淆
HxD直接读磁盘上的user32.dll文件,而C代码如果是在进程加载DLL后Dump内存内容,要注意:DLL加载到内存后,节区的虚拟地址和文件中的偏移是两回事。如果没把内存中的虚拟地址转换成文件偏移就直接读取,会因为基址重定向、节区对齐差异等问题,导致Dump的内容和文件里的不一样。PE文件结构解析不到位
要正确获取函数的机器码,必须严格解析PE文件的导出表流程:- 定位导出表的RVA并转换成文件偏移;
- 在导出表中找到
MessageBoxA对应的函数RVA; - 将该RVA转换为文件偏移后,再从磁盘文件中读取对应内容。
要是C代码跳过这些步骤,直接读取内存地址内容或偏移计算错误,结果肯定不对。
内存保护限制
当C代码尝试读取MessageBoxA所在的内存页时,若该页有只读或执行保护属性,普通的内存读取操作可能失败,或者读取到被系统挂钩、加密的内容,导致Dump结果异常。而Python直接读磁盘文件,不会碰到这类内存权限问题。输出格式错误
比如C代码打印十六进制时,把signed char当成无符号类型处理,导致负数字节被错误转换为错误的十六进制值;或者格式化输出时没处理好单字节的两位十六进制显示(比如漏补前导零),看起来结果和HxD不一致,但实际内存内容是对的,只是显示出了问题。
内容的提问来源于stack exchange,提问作者Mladjan Jovanovic
相关产品推荐
相关产品推荐

