专业逆向软件工程的目标是什么?

逆向工程 拆卸
2021-06-13 00:38:49

在专业层面,逆向软件工程用于什么目的?目标软件是什么?为什么?

对于正在做一些新颖事情的相当复杂的编译代码,通过逆向工程对代码的运行方式进行有意义的洞察似乎需要大量的专业知识、劳动力和时间。特别是,我认为聘请有能力的汇编程序员极其困难,而且可能很昂贵。然而,我还不清楚有资源的实体会希望将这些资源花在什么地方。

这是我的可能性列表...

  1. 编写恶意软件
  2. 编写反恶意软件
  3. 也许分析竞争对手的产品?

这不是一个很好的清单。这里的现实是什么?什么样的软件可以证明逆向工程的费用是合理的?

请参阅对 0xC0000022L 的回答的评论以对问题进行一些改进。

4个回答

逆向工程通常以多种方式使用。这里列出了一些涉及逆向工程的最常见的专业活动。

  1. 恶意软件研究。如果不进行逆向工程,就很难确定恶意软件的实际功能、如何以及更重要的是如何清理或防止感染。
  2. 抄袭检测:逆向工程通常在法律上用于确定公司或特定 X 公司是否抄袭了公司或特定 Y 公司的代码。
  3. 取证。
  4. 兼容性。逆向工程支持并且仍然支持许多开源项目,例如 Samba 或 Star/Libre/OpenOffice。如果没有专业的(和业余的)逆向工程师,没有人能够像以前那样编写软件,因为对于所涉及的协议或文件格式根本没有可用的规范。如果您使用的是 Libre/OpenOffice 或 MacOSX 或 Linux,那么您实际上是在使用许多逆向工程师多年来的工作成果。
  5. 漏洞研究/开发。为了发现公司、程序员或第三方留下的未记录的功能、漏洞或后门,自然需要逆向工程。
  6. 修改遗留程序。这是我在该领域看到的最常见的任务之一:X 公司购买了程序 Y,但生产它的公司 Z 消失了,他们根本没有源代码。该公司 X 与逆向工程服务签订合同,以修复错误和/或为自己的目的调整旧的(死的)应用程序。如果程序也受到保护,逆向工程师还需要首先打破复制保护。
  7. 分析竞争对手的产品。自然,这是一件很常见的事情。特别是在谈论硬件产品时。顺便说一下,它发生在所有领域。你认为保时捷不会对法拉利汽车进行逆向工程吗?
  8. 源代码恢复。X 公司无论出于何种原因丢失了他们的一个程序/产品的源代码,他们只有二进制文件。该公司签约逆向工程服务以重建/恢复源代码。
  9. 分析外国政府的硬件和软件。你明白了。
  10. 二进制补丁开发。一些产品仍在发展,但提供公司修复错误的速度非常慢(想到 Oracle ......)或者根本不在乎。在这种情况下,可以签约逆向工程服务来开发要应用于产品的二进制补丁,以修复错误或漏洞(在每次发布时再次制作补丁)。

我可以继续写下逆向工程师经常做的更专业的任务,但我认为这个列表给了你一个大致的想法。

  1. 查找产品的未记录功能。

    • 例如用于定位注册表项或设置以打开调试模式。
  2. 查找记录不完善的功能究竟是如何工作的。

  3. 调试

    • 有时我发现自己在 IDA 中加载自己的软件以查找编译器生成的代码,或者查找错误,或者查看优化的结果。
  4. 破解复制保护

    • 密钥生成器通常是通过对应用程序的许可证密钥验证算法进行逆向工程来创建的。
    • 有时,公司可能会丢失某些古老软件的许可证代码。
  5. 评估闭源产品的安全性。

  6. 修改现有产品

    • 就像将您自己的自定义 rom 闪存到手机一样。
  7. 将当前产品与古老的软件连接起来。

作为一名专业的逆向工程师,我崇敬的是:

  • 故障排除
  • 开发利用
  • 恶意软件分析
  • 实施记录错误的 API 调用。
  • 抄袭,他们知道诺基亚电话库中有一个未记录的内核调用。因此,我们对其进行了逆向工程,并创建了一个也使用此调用的程序。

整体倒车增加了您的编程知识。

逆向工程的一个关键目的是恢复工件的抽象设计。

源程序是一个概念的实现。它包含大量实现效果的代码/门,然后在此基础上进行优化以合理地实现效果(空间、时间、热量、面积、功率等)。它专注于良好的执行,而不是良好的概念文档。

对于正在运行的产品来说,这一切都很好。但是,如果您想了解您拥有的代码(并且您犯了将设计扔掉的错误[每个人都有,不要让我开始说这很愚蠢]),然后抽象出所有详细的实现,留下抽象的结构和计算,非常有帮助。

这是我写的关于如何以常规方式执行此操作的技术论文(上个世纪 [!],仍然很好,恕我直言): 逆向工程是逆向工程本文从实时操作系统中提取低级汇编代码,并将其抽象回其实现的同步原语。从本质上说什么它说的是,“这个概念是在像代码实现这个这些代码中的地方”。

这个想法部分源自 Rich 和 Water 著名的(?)1980 年中期对程序员的学徒的研究在他们的案例中,他们专注于在代码中找到抽象的实现,通过做相当于数据流图匹配的事情。(已经有许多其他论文和博士论文提出了类似的想法)。我的 RE 论文建议在低级识别之上嫁接整个设计模型。

我的公司最近为陶氏化学实施了 Rich&Water 的愿景,从低级工业控制器代码中提取过程控制模型。陶氏正在使用它来将运行化工厂的遗留代码迁移到现代控制器。请参阅Dow Chemical 的 SD 构建工具这只是宣布工作,但我们已经这样做了几年并且取得了很好的结果。我们希望尽快为技术期刊撰写本文,并将其应用于更传统的语言,例如 C。

我断言所有这些想法也适用于硬件和协同设计。