有时候在伪代码中,你可能会遇到看起来很奇怪的代码:
代码似乎在解引用一个名为MEMORY
的数组,并且用红色高亮显示。然而,这个变量在任何地方都没有定义。它是什么呢?
这种表示法是反编译器在代码访问数据库中不存在的内存地址时使用的。在大多数情况下,这表明原始源代码中存在错误。如果我们查看上面的反汇编,会看到这样的内容:
变量pfont
被加载到寄存器edx
中,然后使用测试 edx, edx/jz
序列与零进行比较。只有当edx
为零时,才会跳转到loc_4060D3
,这意味着mov eax, [edx+10h]
指令将尝试解引用地址0x10
。由于数据库不包含地址0x10
,它不能被表示为正常或虚拟变量,因此反编译器将其表示为伪变量MEMORY
,并使用地址作为索引。解引用用红色显示,以引起对代码中潜在错误的注意。例如,从汇编判断,在这个二进制文件中,程序员试图读取一个结构指针,即使它是空的。更现代的编译器可能甚至会删除这样的代码,因为解引用空指针是未定义行为。
在这种访问不是错误的情况下(例如,代码直接访问内存映射硬件寄存器),为访问的地址范围创建一个新段通常是正确的方法。
学习资源
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):IDA技巧(108)伪代码中的原始内存访问
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论