飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 841|回复: 2

[其它] [IDA使用技巧]#162: 我的代码呢?不返回调用的情况

[复制链接]
  • TA的每日心情
    开心
    2019-3-15 11:00
  • 签到天数: 262 天

    [LV.8]以坛为家I

    发表于 2023-12-11 14:00:12 | 显示全部楼层 |阅读模式
    翻译:梦幻的彼岸

    比方说,你在二进制代码中发现了一个看起来很有希望的字符串,按照交叉引用找到了使用该字符串的函数,然后反编译了一下,想看看该字符串是如何使用的,结果却在伪代码中看不到任何迹象。这是怎么回事?

    在这种情况下,设置两个同步的反汇编<->伪代码视图并滚动浏览它们以查找异常之处往往会有所帮助。通常,大多数伪代码行应该映射到一条或多条汇编指令,而大多数汇编指令(可跳过的指令除外,如函数的前导码和尾随码)应映射到伪代码中的某些行。

    这里有一个奇怪的例子:伪代码中的单个函数调用不仅映射到调用指令,还映射到其后一系列看似无关的指令:

    随后是在伪代码中没有任何映射的指令:

    将鼠标悬停在调用上可以提供线索:它被标记为__noreturn(不返回)。

    因为在它后面显然还有一些有效代码,所以似乎是误报。从原型中移除 __noreturn 属性(提示:Y快捷键)后,丢失的代码又回来了,指令映射也更规范了:

    注意:在某些情况下,除了修复原型外,您可能还必须在函数属性中清除noret 标记,否则__noreturn属性会一直存在。
    函数被错误标记为无返回的原因有很多,例如,可能发现该函数以无限循环结束,或者由于其他问题,其代码路径只能通向其他无返回函数。值得对此类函数进行更仔细的调查,尤其是在发现多个实例的情况下。
    请注意,在某些情况下,即使函数确实没有返回值,您也可能在函数调用后看到看起来有效的代码。这可能是由以下原因引起的:
    • 编译器没有推断出函数不会返回
    • 旧编译器不执行删除死代码操作
    • 编译期间的优化设置
    • 其他原因(例如反编译器的假设不正确

    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    3 天前
  • 签到天数: 615 天

    [LV.9]以坛为家II

    发表于 2023-12-12 09:02:15 | 显示全部楼层
    @梦幻的彼岸  这个论坛如此卡顿,你是如何克服这个问题发贴的?
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表