逆向工程实战:加速汇编语言学习(第二部分)

本文深入探讨了逆向工程中的汇编语言分析技术,通过实际案例详细解析了Windows环境下的函数调用约定、栈帧结构、内存访问模式以及反汇编代码的逐步分析方法,帮助读者掌握逆向工程的核心技能。

概述

在阅读了加速汇编指南第一部分的反馈后,我决定采用一个自定义目标,并在遇到晦涩或新的汇编片段时回调高级语言。我意识到上一篇文章的细节水平可能对某些读者来说过于繁琐,但我计划坚持覆盖理解页面材料所必需的内容。也就是说,本文的长度将大致相同,但这只是因为示例是由朋友创建的,因此我对实现细节没有先验知识。我们将从黑盒开始,逐步进行详细记录。在此过程中,我将教读者如何评估目标并记录功能,以及我用来理解复杂汇编列表的技术。我们将经常参考Intel和AMD的软件开发手册。重要的是要记住,本系列是Windows操作系统上逆向工程的指南,以及如何思考逆向工程。所有学到的技能都可以应用到其他系统。

所有演示均在Windows 10版本2004;构建19035上执行。(此构建不是必需的。拥有Windows 10就足够了。)

免责声明

本文中提供的所有示例和信息均基于C/C++应用程序。假设您已经编程并具有C、CPP、Rust或其他高级语言的经验。如果没有,本系列的内容可能难以理解。所有作者项目均使用Visual Studio 2019编写,并使用Intel C++ 19.1编译器编译。所有优化均已关闭,以减少由于编译器优化使理解复杂化而导致的晦涩汇编列表。省略了一些细节以防止进一步深入兔子洞。如果您是热心的读者并想了解更多信息,请参阅末尾的推荐阅读部分。

补充说明:我想快速花点时间谈谈我的写作和教学风格。我坚信通过实践学习,因为这是我学习的方式,也是我继续学习逆向工程或任何开发的方式。我意识到有些人通过广泛的分解、更简单的示例、现场演示等更好地学习。尽管我希望我能做到,但我没有手段来满足所有学习风格,因此写作是我能提供的最佳途径。我写作是为了让感兴趣的读者,无论学习风格如何,都可以回来,而不必为视频添加时间戳或搜索许多示例来找到他们忘记或需要的信息。我希望如果您的学习风格与我的大不相同,您仍然能在这些文章中找到价值,并知道我总是可以回答问题或帮助提高您的理解。

我希望您成功学习如何逆向工程并将其应用到现实世界,但我绝不是老师,因此如果有遗漏,请耐心等待,或告诉我,以便我可以添加!感谢您在我写作时的耐心等待:)。

— 第一部分遗漏 𝛿 链表/双向链表示例(有意)

目标获取

既然我们已经涵盖了一些必要的示例,并且您现在知道了所有调用约定的细节——让我们直接开始吧。我们将在本节中评估一个目标。这将是一个漫长、复杂且可能让您感到 mildly 沮丧的过程,但您将在另一边出来时比之前知道得多得多!

— 抢劫银行需要蓝图 第一个示例基于我在野外看到的授权协议。它相当简陋且被破坏,是的——这是它的粗略重现。此函数中使用了多个过程,但是,所有许可证验证都是在本地并在应用程序的入口点执行的。应用程序本身被广泛使用,并在利用方面呈现了许多攻击向量,我们将在遇到时覆盖。如果您刚开始,汇编可能有些令人困惑,但我们将逐段分解并建立目标的知识库。我们将注意诸如使用的局部变量、潜在的内联函数、CRT过程以及所有攻击向量等内容。此示例使用了结构,我们将看到这些结构的使用方式以及如何推断结构的不同成员。将会遇到很多新事物,因此请注意任何可能令人困惑的内容,并确保在之后查看分解。

我们将在没有源代码先验知识的情况下开始,为了确保我也这样做,我让朋友编写了应用程序,然后我提前进行了逆向工程。我这样做是为了避免使用内部知识做出假设,可以这么说。这样,当我们逐步进行时,您的结果将与我的保持一致。我将在分解结束时提供给定的源代码,以便您将伪代码与您的进行比较。

关于工具?

我尚未引入任何工具的原因是因为当您学习逆向工程时,重要的是不要对您可能拥有的工具(如IDA、x64dbg、Hiew等)产生依赖。要精通逆向工程,您需要能够从干巴巴的反汇编列表开始工作,并能够从中推断出尽可能多的信息。可能并不总是有支持您目标运行的架构的工具,那时,如果您依赖工具,您就变得无用了。我们将从仅具有基本指令、架构知识的角度工作,并推断行为

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计