一花一世界,一码一千秋

”逆向工程初步“

逆向工程应该是一门优雅的艺术,而不是一些低层次者手中的粗陋工具;

逆向工程的目的是学习与再利用;

逆向工程的精神是“自由”。

《加密与解密》

什么是逆向工程?

逆向工程(Reverse engineering),又称反向工程,是一种技术过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能性能规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是,在无法轻易获得必要的生产信息下,直接从成品的分析,推导产品的设计原理。^1^

通俗来讲,逆向工程就是将机器才能够懂的机器代码(0101二进制代码)翻译成人能够读懂的代码(汇编、smali代码)。 但实际情况往往是,我们只寻找关键的代码去翻译或仅了解其业务逻辑,因为要将所有的机器代码翻译出来,工作量是极其巨大的且繁琐的。^2^

逆向技术在实际业务中一般应用于以下几个方面:二进制漏洞挖掘、软件破解、恶意代码分析、竞品分析等。

逆向工程涉及的知识面非常广,从计算机基础原理到计算机架构,再到各种编程语言的编译原理。逆向工程往往需要对算法进行逆向,对操作系统架构进行逆向,这就要求逆向工程师有不错的算法水平,而且对计算机相关的原理深入理解。

一个逆向工程大师,也许具有如下特征。

  • 永远保持好奇心,崇尚自由——既能促使探索,也能抵抗商业利益和欲望的侵袭。有了它,枯燥的代码世界才有了生气。
  • 勤奋与毅力。在一篇关于逆向的文章中有这样的语句:“让我们搞清楚作为一名逆向工作者需要具备的基本条件,其实那并不是扎实的汇编功底和编程基础——可以完全不懂这些,秘诀就是勤奋加上执着!记住并做到这两点,你一样可以变得优秀。”
  • 精通至少一门编程语言——不仅仅是代码,更重要的是编程思想。
  • 扎实的汇编功底和系统编程知识。

基础知识

  1. 汇编语言
  2. C语言
  3. 一门脚本语言(Python)
  4. Windows核心编程
  5. PE文件格式
  6. 程序加载流程

基础工具

  1. 查壳工具(DIE、PEID、EXEINFO、LordPE、ResourceHacker等)
  2. 常用脱壳工具或脱壳脚本(专属壳的脱壳器例如upx等、各种壳的脱壳脚本)
  3. 十六进制编辑器(010Editor、winhex等)
  4. 反汇编工具(IDA、Hopper)
  5. 调试器(Ollydbg、gdb、windbg等)

这些都是比较常用的逆向工具。其中特别要熟练使用IDA与Ollydbg,IDA一般用来做静态分析,其中的F5功能更是强大到没朋友,新手必备。Ollydbg简称OD一般用来做动态调试使用,两者结合使用堪比倚天剑和屠龙刀,可谓是神挡杀神佛挡杀佛。^3^

逆向的分类

  • 解释型语言的逆向
  • 编译型语言的逆向

分析手段

  1. 静态分析
  2. 动态分析
  3. 网络流量分析

静态分析

将机器代码反汇编成方便人类理解的代码,如smali代码(Java)、汇编代码或汇编代码翻译的C语言伪代码等等,通过分析这些比较低级的编程语言的代码,找到程序的业务流程或设计逻辑。

动态分析

通过断点调试手段,让程序单步执行进行分析。动态分析往往是在静态分析出一定的结果的基础上进行,找到合适的地方给代码打断点,即时地读取当前变量的值,来进一步分析程序的逻辑、获取程序关系数据。

网络流量分析

通过代理方式或者其他方式,截取程序与服务器通信的数据流量(抓包),来分析客户端和服务端的通信协议。网络流量分析比较有局限性,若客户端使用Http这种明文传输的协议,会比较容易分析;但如果客户端使用SSL、Https等加密传输协议与服务端进行通信,那么抓包的前提是需要拿到服务端下发给客户端的证书才能进一步解密分析,这种情况下就比较棘手。网上有方案通过安装插件拿到Chrome或者Firefox浏览器的本地证书,但只适用于客户端是网页的情况。若其他大佬有好的宝贵经验,还望能指点迷津。

猜测的前提是,你需要有一定的编程经验,能够在逆向分析出一些代码后,对其上下的代码进行合理的推测,推测不出来的代码再通过以上手段分析。可以这么说,你的推测能力决定了你的逆向分析效率,而编程经验则是你猜测能力的基石。

逆向工程的学习是一条漫长的道路,每一个逆向工程师都是一个优秀的开发者,只不过他们选择去挑战更有深度,更有趣味的事情。加密与解密,解开每一段代码的意味,看到软件背后潜藏的世界,正所谓,一花一世界,一码一千秋嘛。

参考

  1. 逆向工程-维基百科
  2. 逆向工程入门概述-知乎
  3. CTF逆向选手入坑指南-FreeBuf

闲聊到此为止,来喝杯茶可好?