#1 楼
这样的问题很少能给出简单的答案,但我会尽力指出正确的方法。首先,建立一个工具箱:尽可能多地收集工具并开始玩。然后,掌握那些您认为有用的东西,或者在您可以做得更好时开发自己的东西。通过工具,我的意思是反汇编程序,六角编辑器,反编译器,调试器,自动化脚本,...
其次,要有条不紊:通过经验和实践,您将能够提出一系列步骤来倒车时跟随。当然,必须通过更多的经验来更新这些步骤,但是它们肯定会帮助您找到有关目标的有价值的信息和数据。参考不同工具的输出(使用多个反汇编程序,...)。大多数工具都有优点和缺点,因此您必须了解它们才能了解所要查找的内容。例如,
objdump
(binutils
反汇编程序)执行linear sweep
,这种技术很容易因未对齐和将数据与指令混合而被愚弄。明智的反向器将使用另一个反汇编程序,该反汇编程序实现另一个反汇编算法(IDAPro,r2 -radare等),并比较结果。第四,RTFM:在大多数(如果不是全部)情况下,文档将是您最好的朋友。任何与体系结构,使用的工具,目标应用程序,编程语言,编译器...相关的文档都是金矿。它将帮助您了解所有机械如何运作。您必须在编译方面进行自我教育(使用和研究不同的编译器:GNU的gcc
,英特尔的icc
,PGI的pgcc
,CAPS编译器套件,IBM的xlc
,...),静态和动态链接,对象文件格式(ELF32,ELF64, PE,COFF,Macho等),调用约定和ABI,编译器优化,链接时间优化,代码变形,密码学……以了解应用程序是如何构建,混淆和保护的。所有这些,以便在链中找到可利用的薄弱环节。我还建议您关注在所有这些领域中进行的科学工作,尤其是混淆,静态和动态分析,仪器仪表,二进制代码修补,反汇编等。然后研究人员提出了伟大的技术和算法,这些技术和算法最终在许多工业产品中得以实现。第五,要敏锐:没有垃圾。正如拉瓦锡(Lavoisier)曾经说过的那样:“变迁,变迁。” (“什么都不会丢失,什么都不会创建,一切都将被转换。”)请记住,任何有价值的信息都可以提供帮助。它可能是诗歌,微积分,物理学,布尔代数,...您永远都不知道会遇到什么。成功的逆向工程师就是受过良好教育的工程师!
最后,发展高级编程技能::尽可能学习多种编程语言:汇编(
x86
,ARM
,6502
,...),C
,C++
,Python
,Haskell
,...并学习如何从低层提取代码关卡结构-这只是经验和敏锐度的问题。每种语言都是在一组范例的基础上设计的:Functional programming
,OOP
,...了解这些范例在分析代码时有很多帮助。我认为没有足够的空间来覆盖所有内容,但希望这可以帮助您缩小搜索范围并在网络上找到有用的文档,教程等。
评论
+1用于加粗RTFM。例如,“可执行文件格式”是一个永无止境的学习故事。
–杂件
2014年5月4日在22:56
#2 楼
总有一些需要特定数学技能的特殊软件。例如,如果您想撤消某些加密文件的恶意软件,则密码学技能将帮助您识别算法。或者,如果您想逆转某些计算天线的软件,那么了解无线电工程的方程将对您有所帮助。但是,为了提高逆转“通用”软件的技能,要做的就是学习几种汇编语言,我建议至少使用intel(32位和64位),以及arm指令集,寄存器和标志。另外,至少要了解一些有关编译器,它们如何工作以及对编译器进行优化的方法的理论知识。了解编译器如何将它们转换为汇编代码。了解安排堆栈的各种方法,以便在看到编译的汇编代码时将识别出模式。
在某些情况下,您将遇到手工组装,而在“现实生活”中要逆转的大部分内容将以某种方式进行编译,并且在大多数情况下,将使用C或C ++进行编译。 (C#和Java也是如此,但是这些都是特殊情况,因为除混淆之外,使用它们很容易进行反编译)。看到这个问题,当函数不使用ebp时,有没有办法调整局部变量?或者有人可以告诉我这个memcpy或也许是一个memset吗?看起来像memset,rep movsd和rep movsb这是一个数据包发送功能-如果您只知道编译器的工作方式,并且已经比较了各自的汇编/ C代码,那么两者都很容易解决。
除此之外,正如您已经说过的那样,在逆向编程和编程方面有很多经验。当您仅看到实现时,有很多算法很难理解-几周前,我遇到了一个函数,该函数具有很多if和变量交换功能,使我无法理解,直到突然我意识到大约10年前,当我实现布雷森汉姆算法时,我使用了完全相同的东西。这是您无法真正学习的东西-经验丰富的反向器的许多“魔术”实现不是魔术,它们只是很好的记忆。
评论
有一本关于实用逆向工程的新书(Bruce Dang等人),其中列出了其中的一些内容。除此之外,这确实是基于意见的(不适合问答)。