正向工程(Forward Engineering)
抽象的逻辑设计 => 具体的物理实现
设计概念和算法 => 编写源代码 => 编译成二进制机器码
将想法和设计理念变成具体实现的过程
逆向工程(Reverse Engineering)
具体的物理实现 => 抽象的逻辑设计
反编译机器码 => 汇编代码(类似的高级语言代码) => 理解其算法和设计概念
从二进制码中提取设计概念和算法
程序的编译和反编译
高级语言(C/C++/Oc/Java/Python/C#) -> 中间语言(如:汇编等) -> 目标代码(exe/lib/dll/sys/dylib等二进制文件)
编译链接
高级语言 -------> 机器码
<------ 机器码
反汇编/反编译
编译链接
高级语言 ===> 机器码
<===
反汇编/反编译
逆向的思路
- 逆向必须是有目的的、有针对性的(明确你要做的事情)
- 先熟悉你要逆向的目标程序,从正向的思路去猜测他可能的实现方法(使用的框架、调用的系统API等)
- 定位关键代码
- 通过监控UI事件的响应定位关键代码
- 通过监控底层API的调用定位关键代码(如网络访问接口、文件读写接口等)
- 通过观察数据的变化来定位关键代码和地址
逆向是一个试错的过程,需要不停的猜测、查找和进行验证,既考验耐心也考验动手能力