什么可以帮助我提高自我,我应该学习和学习哪些科目,以提高我在逆向工程软件方面的能力?即:微积分,积分?
除了实践,我还应该掌握哪些技能才能擅长逆向工程软件?
这类问题很少有直接的答案,但我会尽力点你在一个正确的道路。
首先,建立一个工具箱:收集尽可能多的工具并开始玩。然后,掌握你认为有用的那些,或者在你可以做得更好的时候开发你自己的。通过工具,我的意思是反汇编,hexeditors,反编译器,调试器,自动化脚本,...
其次,要有条不紊:凭借经验和实践,您将能够提出倒车时要遵循的一系列步骤。这些步骤肯定需要根据更多经验进行更新,但它们肯定会帮助您找到有关目标的有价值的信息和数据。
第三,永远不要盲目相信您的工具或了解您的工具:始终交叉引用不同工具的输出(使用多个反汇编器,...)。大多数工具都有优点和缺点,您必须了解它们才能了解您正在查看的内容。例如,objdump
(binutils
反汇编程序)执行linear sweep
,这是一种很容易被错位和混合数据与指令所愚弄的技术。聪明的逆向者会使用另一个反汇编器,它实现了另一种反汇编算法(IDAPro、r2 -radare、...)并比较结果。
第四,RTFM:文档在大多数情况下(如果不是全部)都是您最好的朋友。任何与架构、您使用的工具、目标应用程序、编程语言、编译器等相关的文档都是金矿。它将帮助您了解所有机器如何运作。您必须自学编译(使用和学习不同的编译器:GNU 的 gcc
、英特尔的 icc
、PGI 的 pgcc
、CAPS编译器套件、IBM 的 xlc
, ...), 静态和动态链接, 目标文件格式 (ELF32, ELF64, PE, COFF, Macho, ...),调用约定和 ABI,编译器优化,链接时间优化,代码变形,密码学,...了解应用程序是如何构建、混淆和保护的。所有这一切,都是为了在链中找到一个可利用的弱点。我还建议您关注所有这些领域的科学工作,尤其是混淆、静态和动态分析、检测、二进制代码修补、反汇编……二进制代码分析领域仍处于起步阶段,而且时不时地然后研究人员提出了很好的技术和算法,最终在许多工业产品中实施。
第五,要敏锐:没有垃圾这回事。正如拉瓦锡曾经说过的:“Rien ne se perd,rien ne se crée,tout se transforme。” (“没有失去,没有创造,一切都被转化。”)。请记住,任何有价值的信息都可以提供帮助。它可以是诗歌、微积分、物理学、布尔代数……你永远不知道你会偶然发现什么。成功的逆向工程师是受过教育的人!
最后,培养顶尖的编程技能 : : 学习尽可能多的编程语言:汇编 ( x86
, ARM
, 6502
, ...), C
, C++
, Python
, Haskell
, ... 并学习如何从低级结构中提取代码模式 - 这只是一个经验和敏锐度的问题。每种语言都是在一组范式之上设计的:Functional programming
, OOP
, ... 了解这些范式在分析代码时有很大帮助。
我认为没有足够的空间来涵盖所有内容,但我希望这将帮助您缩小搜索范围并在网络上找到有用的文档、教程等。
总有一些特殊的软件需要特定的数学技能。例如,如果您想逆转某些加密文件的恶意软件,密码学技能将帮助您识别算法。或者,如果您想反转某些计算(例如天线)的软件,了解无线电工程中的方程式将对您有所帮助。
但是,为了提高你在逆向“通用”软件方面的技能,你能做的最好的事情就是学习几种汇编语言,我建议至少学习英特尔(32 位和 64 位)以及 arm 指令集、寄存器和标志。此外,至少获得一些关于编译器、它们如何工作以及编译器优化方法的理论知识。
编写小型 (C) 程序,将它们编译为汇编程序,使用不同的优化标志,并了解编译器如何将它们转换为汇编程序代码。了解排列堆栈的各种方法,以便在看到编译后的汇编代码时识别模式。
虽然在某些情况下,您会遇到手工组装,但在“现实生活”中您要反转的大部分内容将以某种方式编译,并且在大多数情况下,它将是 C 或 C++被编译。(C# 和 Java 也是如此,但这些是特殊情况,因为除非经过混淆,否则反编译很容易)。看到这个问题当函数不使用 ebp 时,有没有办法调整局部变量?,或者这个有人可以告诉我这个memcpy是什么或者它是一个memset吗?看起来像一个 memset、rep movsd 和 rep movsb 这是一个数据包发送函数——如果你只知道编译器是如何工作的,并且如果你比较了各自的汇编/C 代码,两者都很容易解决。
除此之外,正如您已经说过的,在逆向和编程方面有很多经验。当你只看到实现时,有很多算法很难理解 - 几周前,我遇到了一个有很多 if 和变量交换的函数,我无法理解,直到我突然大约 10 年前,当我实施Bresenham 算法时,我意识到我使用了完全相同的东西。这是你无法真正学到的东西 - 有经验的逆向者的很多“神奇”实现并不是魔法,它们只是很好的记忆。