反汇编学习笔记

disassembly

由于项目的需要,笔者最近开始学习C++反汇编技术,使用的教材是IDA Pro代码破解揭秘,工具是IDA Pro。

今天主要看了一下反汇编的简介,主要讲了线性扫描算法和递归下降算法这两种反汇编工具主要使用的方法。其中,线性扫描算法的主要算法步骤有五步:

1.位置指针指向代码段开始处;

2.从指针所指位置开始尝试匹配指令,并得到指令长度n;

3.若2成功,则反汇编从指针所指位置向后n个长度的数据,若2失败则退出;

4.位置指针赋值为+n,j即上条指令的结尾;

5.判断位置指针是否超过代码段结尾处,若超出则结束;否则转入2;

线性扫描算法中最重要的是确定位置指针的开始位置,否则会分不清指令和数据。在Windows平台下,可使用PE文件中的可选头标准域的DataBaseofCode结合DataDirectary中相关信息计算开始位置;

SizeofCode得到代码段的长度n,从而确定结尾位置。

而递归下降算伐则更看重控制流的概念,控制流根据一条指令是否被另一条指令引用来决定是否对其进行反汇编。它把指令分为顺序流、条件分支、无条件分支、函数调用、返回五大类从而对其进行反汇编。

但是递归下降算法也有一个缺陷便是可能无法覆盖全部代码从而得不到完整的汇编代码,在分支语句的情况下可能有的分支语句永远不会执行。在这个角度来说,递归下降算法显然做不到完整正确的反汇编程序的每一段代码。

好了,就说这么多。每周写一篇工作日志,回顾一下上一周的工作也是对自己所学知识的一个复习。加油!

你可能感兴趣的:(反汇编学习笔记)