0.IDA-基本的反汇编算法

1.线性扫描

原理:
一条指令结束,另一条指令开始
关键:
确定起始位置 

流程:
从起始,逐条反汇编指令,直到完成整个代码段

优点:
       可覆盖程序的所有代码段
缺陷:
       如果代码段中混有数据!

gdb windbg objdump均采用线性扫描


2.递归下降

原理:
根据一条指令是否被另一条指令引用来决定是否对其进行反汇编
顺序流指令
直接解析它后面的下一条指令,如MOV、PUSH、POP
条件分支指令
解析它的所有条件路径,如JNZ
无条件分支指令
反汇编器会尝试定位到跳转的目标,但有可能失败(如JMP EAX,EAX在静态环境下无法确认)
函数调用指令
和无条件分支指令相似,如CALL EAX
一般默认会直接反汇编CALL指令后,但如果函数中有意窜改返回地址,那就坑了,如下例子:
__declspec(naked) void fun()
{
	__asm
	{
		inc DWORD PTR[esp] // 此时esp的内容即为返回地址,我们让它的内容加1
		retn
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	__asm
	{
		call fun
		inc  eax // 这一句会被跳过
		mov ebx,ebx
	}
	return 0;
}
上面就不会执行inc eax这一句,也就是inc eax这句其实不应该被反汇编的,应该直接从后一句开始,如果不是inc eax,而是一段数据呢,那就OVER了

返回指令
由于RET返回的地址实际是从栈中取得的,但反汇编器不可能访问到栈,所以就会终止

优点:
可以区别代码和数据

IDA使用的是递归遍历反汇编算法





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值