# 3.1 Reverse - [怎样学习逆向工程](#怎样学习逆向工程) ## 怎样学习逆向工程 逆向工程一直被视为一种充满乐趣和带有神秘色彩的东西,逆向工程师看起来就像是在密密麻麻的指令中寻找宝藏的人,他们绕开层层的限制和保护,发现程序中的的错误、漏洞或者是被加密算法掩盖的数据结构。这里我会比较概括地介绍怎样去学习逆向工程。 首先应该注意两个最关键的事情: - 逆向工程需要大量的练习。一个人不能只通过阅读教程来学习逆向工程,教程可能会教你一些技巧,工具的使用和一般的工作流程,但它们只应该作为补充,而不是学习过程的核心。 - 逆向工程需要大量的时间。在逆向工程中,几个甚至几十个小时的工作是很正常的,请不要吝啬你的时间。 对一个对象的逆向工程包含了三个意思: - 静态分析:分析二进制文件反编译后的结果。 - 动态分析:对正在运行的进程使用调试器。 - 行为分析:使用更高级的工具获得所选进程的行为。 通常我建议在进行一系列逆向工程挑战(如 crackme 和 CTF)的时候混合使用上面的三种分析方法。 我会在下面的部分分别详细介绍三种分析方法,并列出刚开始是需要熟悉的资料和工具。 #### 静态分析 #### 动态分析 #### 行为分析 行为分析与给定目标与环境交互的方式有关(主要是操作系统以及文件、套接字、管道、寄存器等各种资源)。 我建议你从下面的工具开始: - [Process Monitor](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon)是一个免费的 Windows 应用程序,可以让你监视系统范围内的访问,如文件、寄存器、网络以及进程相关的事件等。 - [Process Hacker](http://processhacker.sourceforge.net/)和[Process Explorer](https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer)是可替代 Windows 任务管理器的工具,它们都提供了有关运行中程序的更多详细信息。 - [Wireshark](https://www.wireshark.org/)是一个十分方便的跨平台的网络嗅探器。 - [strace](https://linux.die.net/man/1/strace)是一个用于监视给定进程系统调用的 Linux 工具。 - [ltrace](https://linux.die.net/man/1/ltrace)与 strace 类似,但它用于监视动态库调用。 #### 其他有用的资源 正如我一开始提到的,这里给出的只是学习之初的建议,它们在逆向工程领域中只是冰山一角。下面是一些学习资料。 书籍: - Reverse Engineering for Beginners (2017) by Dennis Yurichev (CC BY-SA 4.0, so yes, it's free and open) - Practical Malware Analysis (2012) by Michael Sikorski and Andrew Honig - Practical Reverse Engineering (2014) by Bruce Dang, Alexandre Gazet, Elias Bachaalany, Sebastien Josse - Hacker Disassembling Uncovered (2003) by Kris Kaspersky - Reversing: Secrets of Reverse Engineering (2005) by Eldad Eilam 其他资源: - [Tuts 4 You](https://tuts4you.com/) - [/r/ReverseEngineering](https://www.reddit.com/r/ReverseEngineering/) - [Reverse Engineering at StackExchange](https://reverseengineering.stackexchange.com/) - [PE Format](https://msdn.microsoft.com/en-us/library/windows/desktop/ms680547(v=vs.85).aspx) - [Executable and Linkable Format (ELF)](http://www.skyfree.org/linux/references/ELF_Format.pdf) - [Ange Albertini's executable format posters](https://github.com/corkami/pics/tree/master/binary)