在传统的软件开发模型中,通过编译器、汇编器和链接器中的一个或几个创建可执行程序。为了回溯编程过程(对程序进行逆向工程),使用各种工具撤销汇编和编译过程,这些工具就叫做反汇编器和反编译器。反汇编器撤销汇编过程,可以得到汇编语言形式的输出结果;反编译器则以汇编语言甚至是机器语言作为输入,将高级语言结果输出。
但是反编译有几点困难至今还没有完美解决:编译过程造成损失;编译属于多对多操作;反编译非常依赖语言和库。
反汇编算法:线性扫描(linear sweep)和递归下降(recursive descent)两种主要的反汇编算法。
线性扫描:反汇编从第一个代码段的第一个字节开始,以线性模式扫描整个代码段,逐条反汇编每条指令,直到遍历全部字节。此方法对于长度固定的指令集(MIPS)反汇编会更加容易,因为可以方便的的定位到随后的指令。缺点就是无法正确的将嵌在代码中的数据分离出。
递归下降:根据一条指令是否被另一条指令引用来决定是否对其进行反汇编。
交互式反汇编器专业版,常常称其为IDA Pro,属于递归下降反汇编器。上周看书有一些心得,在这里一篇篇分享一下。
1.为了准备逆向用的实例,先用VC生成一个release版的Hello World。
#include <windows.h>
INT WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
MessageBox