IDA技巧(87)函数块和反编译器

admin 2024年12月18日23:25:14评论28 views字数 1420阅读4分44秒阅读模式

我们讨论了函数块,今天我们将展示一个如何在实践中使用它们来处理常见编译器优化的例子。

共享函数尾部优化

在处理一些ARM固件时,你可能会遇到以下情况:

IDA技巧(87)函数块和反编译器

我们对sub_8098C的反编译以一个奇怪的JUMPOUT语句结束,如果我们查看反汇编,可以看到它对应于另一个函数sub_8092C)中的POP.W指令的分支。这是怎么回事?

这是一个代码大小优化的例子。POP.W指令是4字节长,而B分支只有两个字节,因此通过重用它,编译器节省了两个字节。虽然听起来不多,但这样的节省可以在整个二进制文件的所有函数中累积成相当可观的数量。此外,有时可以重用更长的指令序列,从而带来更大的节省。

我们能否修复数据库以获得干净的反编译并去除JUMPOUT?当然,答案是肯定的,但具体步骤可能不太明显,所以让我们描述一些方法。

为共享尾部指令创建一个块

首先,我们需要为共享指令(在我们的例子中是POP.W指令)创建一个块。只有不属于任何函数的指令才能创建块,因此最简单的方法是删除函数,使指令变为“自由”。这可以通过函数窗口中的编辑 > 函数 > 删除函数菜单项,或通过模态“跳转到函数”列表(Ctrl–P, Del)来完成。

IDA技巧(87)函数块和反编译器

一旦删除,共享尾部指令可以作为一个块添加到其他函数中。这可以手动完成:

  1. 选择指令,
  2. 调用编辑 > 函数 > 附加函数尾部…
  3. 选择引用函数(在我们的例子中是sub_8098C)。通常IDA会自动建议它。
IDA技巧(87)函数块和反编译器

或者(半)自动地:

  1. 跳转到引用分支(例如,通过双击CODE XREF: sub_8098C+3E↓j注释)
  2. 重新分析分支(按C)。IDA将检测到执行在当前函数边界之外继续,并自动创建并添加共享尾部指令的块。

无论哪种解决方案都会创建块并将其标记为属于引用函数。

IDA技巧(87)函数块和反编译器

我们可以检查它是否包含在函数图中:

IDA技巧(87)函数块和反编译器

伪代码中不再有JUMPOUT:

IDA技巧(87)函数块和反编译器

将块附加到原始函数

我们为一个函数“解决”了问题,但在此过程中我们破坏了包含共享尾部的函数。如果我们也需要反编译它,可以尝试重新创建它:

IDA技巧(87)函数块和反编译器

然而,IDA在块之前结束它,因为它现在是另一个函数的一部分:

IDA技巧(87)函数块和反编译器

如果我们反编译它,我们会遇到相同的JUMPOUT问题:

IDA技巧(87)函数块和反编译器

解决方案很简单:如前文所述,一个块可以属于多个函数,因此我们只需将块附加到此函数:

  1. 选择尾部指令;
  2. 调用编辑 > 函数 > 附加函数尾部…
  3. 选择重新创建的函数(在我们的例子中是sub_8092C)。

块获得了一个新的所有者,出现在函数图中,反编译得以修复:

IDA技巧(87)函数块和反编译器

复杂情况

上述例子中有一个由两个函数共享的尾部,但这当然不是极限。考虑这个例子:

IDA技巧(87)函数块和反编译器

这里,POP.W指令被七个函数共享,其中两个还重用了它前面的ADD SP, SP, #0x10指令。还有一个块只属于一个函数,但由于函数不再是连续的,它必须被分离。然而,IDA对碎片化函数的处理足够灵活,在一些手动帮助下,所有涉及的函数都有适当的控制流图和良好的反编译。

总结一下,处理共享尾部优化的建议算法如下:

  1. 删除包含共享尾部指令的函数。
  2. 将共享尾部指令附加到其他函数(手动或通过重新分析到尾部的分支)
  3. 重新创建已删除的函数并将共享尾部附加到它。

学习资源

立即关注【二进制磨剑】公众号

👉👉👉【IDA 技巧合集】👈👈👈
👉👉👉【Github 安全项目合集】👈👈👈
学习零基础学习 IDA 逆向
【课程完结!内容揭秘!】7 天打造 IDA 9.0 大师:从零基础到逆向精英
🔥🔥🔥 新课抽奖中 🔥🔥🔥🔥
【课程完结!内容揭秘】第 2 期-Android 逆向内核攻防

原文始发于微信公众号(二进制磨剑):IDA技巧(87)函数块和反编译器

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月18日23:25:14
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   IDA技巧(87)函数块和反编译器https://cn-sec.com/archives/3523474.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息