返回介绍

1.3 为何反汇编

发布于 2024-10-11 21:05:39 字数 1767 浏览 0 评论 0 收藏 0

通常,使用反汇编工具是为了在没有源代码的情况下促进对程序的了解。需要进行反汇编的常见情况包括以下几种。

  • 分析恶意软件。

  • 分析闭源软件的漏洞。

  • 分析闭源软件的互操作性。

  • 分析编译器生成的代码,以验证编译器的性能和准确性。

  • 在调试时显示程序指令。

下面详细介绍上述每一种情况。

1.3.1 分析恶意软件

通常,恶意软件的作者很少会提供他们“作品”的源代码,除非你对付的是一种基于脚本的蠕虫。由于缺乏源代码,要准确地了解恶意软件的运行机制,你的选择非常有限。动态分析和静态分析是分析恶意软件的两种主要技术。 动态分析 (dynamic analysis )是指在严格控制的环境(沙盒)中执行恶意软件,并使用系统检测实用工具记录其所有行为。相反, 静态分析 (static analysis )则试图通过浏览程序代码来理解程序的行为。此时,要查看的就是对恶意软件进行反汇编之后得到的代码清单。

1.3.2 漏洞分析

为了简单起见,我们将整个安全审核过程划分成 3 个步骤:发现漏洞、分析漏洞、开发破解程序(exploit )。无论是否拥有源代码,都可以采用这些步骤来进行安全审核。但是,如果只有二进制文件,你可能需要付出巨大的努力。这个过程的第一个步骤,是发现程序中潜在的可供利用的条件。一般情况下,我们可通过模糊测试1 等动态技术来达到这一目的,也可通过静态分析来实现(通常需要付出更大的努力)。一旦发现漏洞,通常需要对其进行深入分析,以确定该漏洞是否可被利用,如果可利用,可在什么情况下利用。

1.模糊测试是一种发现漏洞的技术,它为程序生成大量不常见的输入,希望其中一个输入会在程序中造成可被检测、分析,最终可被利用的错误。

至于编译器究竟如何分配程序变量,反汇编代码清单提供了详细的信息。例如,程序员声明的一个 70 字节的字符数组,在由编译器分配时,会扩大到 80 字节,知道这一点会很有用。另外,要了解编译器到底如何对全局声明或在函数中声明的所有变量进行排序,查看反汇编代码清单是唯一的办法。在开发破解程序时,了解变量之间的这些空间关系往往非常重要。最后,通过结合使用反汇编器和调试器,就可以开发出破解程序。

1.3.3 软件互操作性

如果仅以二进制形式发布软件,竞争对手要想创建可以和它互操作的软件,或者为该软件提供插件,将会非常困难。针对某个仅有一种平台支持的硬件而发布的驱动程序代码,就是一个常见的例子。如果厂商暂时不支持,或者更糟糕地,拒绝支持在其他平台上使用他们的硬件,那么为了开发支持该硬件的软件驱动程序,可能需要完成大量的逆向工程工作。在这些情况下,静态代码分析几乎是唯一的补救方法。通常,为了理解嵌入式固件,还需要分析软件驱动程序以外的代码。

1.3.4 编译器验证

由于编译器(或汇编器)的用途是生成机器语言,因此优秀的反汇编工具通常需要验证编译器是否符合设计规范。分析人员还可以从中寻找优化编译器输出的机会,从安全角度来看,还可查知编译器本身是否容易被攻破,以至于可以在生成的代码中插入后门,等等。

1.3.5 显示调试信息

在调试器中生成代码清单,可能是反汇编器最常见的一种用途。遗憾的是,调试器中内嵌的反汇编器往往相当简单。它们通常不能批量反汇编,在无法确定函数边界时,它们有时候会拒绝反汇编。因此,在调试过程中,为了解详细的环境和背景信息,最好是结合使用调试器与优秀的反汇编器。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文