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

1.线性扫描

原理: 一条指令结束,另一条指令开始 关键: 确定起始位置 
流程: 从起始,逐条反汇编指令,直到完成整个代码段
优点: 可覆盖程序的所有代码段 缺陷: 如果代码段中混有数据!
gdb windbg objdump均采用线性扫描


2.递归下降

原理: 根据一条指令是否被另一条指令引用来决定是否对其进行反汇编 顺序流指令 直接解析它后面的下一条指令,如MOV、PUSH、POP 条件分支指令 解析它的所有条件路径,如JNZ 无条件分支指令 反汇编器会尝试定位到跳转的目标,但有可能失败(如JMP EAX,EAX在静态环境下无法确认) 函数调用指令 和无条件分支指令相似,如CALL EAX 一般默认会直接反汇编CALL指令后,但如果函数中有意窜改返回地址,那就坑了,如下例子: [cpp] view plaincopy
  1. __declspec(nakedvoid fun()  
  2. {  
  3.     __asm  
  4.     {  
  5.         inc DWORD PTR[esp] // 此时esp的内容即为返回地址,我们让它的内容加1  
  6.         retn  
  7.     }  
  8. }  
  9. int _tmain(int argc, _TCHAR* argv[])  
  10. {  
  11.     __asm  
  12.     {  
  13.         call fun  
  14.         inc  eax // 这一句会被跳过  
  15.         mov ebx,ebx  
  16.     }  
  17.     return 0;  
  18. }  
上面就不会执行inc eax这一句,也就是inc eax这句其实不应该被反汇编的,应该直接从后一句开始,如果不是inc eax,而是一段数据呢,那就OVER了
返回指令 由于RET返回的地址实际是从栈中取得的,但反汇编器不可能访问到栈,所以就会终止
优点: 可以区别代码和数据
IDA使用的是递归遍历反汇编算法


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部