-
-
[原创]IDA权威笔记-第一章节 IDA简介
-
发表于:
2020-4-28 15:43
4087
-
导航
基本的反汇编算法
第四步 输出一套指令后,继续反汇编下一条,直到完成。
有大量算法,但是线性扫描和地柜下降是两种最主要的算法。如何确定下一条反汇编指令,区分代码和数据,确定最后一条指令。
线性扫描反汇编
递归下降反汇编
- 没必要深入了解汇编算法。了解了就有好处。IDA提供大量机会来指导和推翻它的决定。下一章将介绍其他与IDA相互影响过的工具。
- 不要急,IDA很强,
- 第一代语言 人读不懂的二进制语言
- 第二代语言 汇编语言 mov ex,ex 这种,扩展:汇编有很多种,一般按照指令集或处理器分类。因为这一块比较重要,会在后面来填坑。汇编类别(坑位)。
- 第三代语言 引入了关键字和结构,表达更接近自然语言,包括我们熟悉的C,java等。通常使用编译器将程序转换成汇编,也就是第二种语言。
- 第四代语言 与本书无关,我猜是动态,或者脚本语言之类的。如果猜错请在评论里diss我。
- 大意是程序员使用第三代语言,进行开发,经过编译器、汇编和链接器创建可执行程序,使用各种工具来撤销汇编和编译过程的工具就叫做反汇编器和反编译器。前景好,但是困难重重
- 编译过程会造成损失,机器语言,就是0,1的第一代语言不会显示声明变量,只能追踪其用途确定类型。
- 编译属多对多,转换成汇编的方式不同,转源程序也不同,你反汇编或反编译的结果和源程序是有差别的。
- 反编译器非常依赖语言和库,意思什么开发语言和什么库最好用专门的反编译器,不然在做无用功。
- 要想准确的反编译一个二进制文件,需要近乎完美的反汇编能力。很难,不要出现错漏。
- 23章介绍hex-Rays(最复杂的反编译)。
- 分析恶意软件 恶意软件没有源码所以要动静态调试(static analysis and
dynamic analysis),动态就是软件运行起来后,记录其所有的行为,静态则是浏览恶意程序反汇编后的代码,分析。
- 分析闭源软件漏洞 安全审核步骤:发现漏洞、分析漏洞、开发破解。发现漏洞这步最难,可以通过模糊测试(是一种发现漏洞的技术,利用大量不常见输入。。。)。程序员声明70字节字符数组,由编译器分配时会扩大到80字节。指的应该是编译和程序有差异,知道编译器的原理很有帮助。
- 分析闭源软件的互操作性 针对某个仅有一种平台支持的硬件儿发布的驱动程序代码。为了理解嵌入式固件,还需要分析软件驱动程序以外的代码。感觉说的是移植的模拟器之类。我这里只能理解个大概(填坑)
- 分析编译器生成的代码,一验证编译器的性能和准确性
- 在调试时显示程序指令 调试器内嵌反汇编器往往相当简单,我觉得现在调试debug已经相当优秀了。这个地方就略过。
- 区分文件中的代码与数据,并转成汇编不允许遗漏,很难。需要选择合适算法。会在这章中指出缺陷,以便手动干预(应该指的是为什么IDA有时候需要手动修复代码)
-
基本的反汇编算法
-
线性扫描反汇编
- 一条指令结束和另一条指令开始的地方确定起始位置。从代码段的第一个字节开始,一现行模式扫描整个代码段。不支持识别分支等非现行指令来了解程序控制流
- 每条指令的长度来确定下一条指令位置。
- 有点:能够完全覆盖程序的所有代码。
- 缺点,没考虑代码混数据,遇到switch语句使用jmp反汇编是错误的。
- gdb、微软的Windbg和objdump实用工具的反汇编均采用线性扫描算法。
- 先存最高有效字节,则称改CPU为大端(big-endian)反之为小端(little-endianl)
-
递归下降反汇编
- 递归采用不同方法定位指令,强调控制流,根据一条指令是否被另一条指令引用来决定是否进行反汇编。根据指令对CPU指令指针的影响对其分类。
- 顺序流 这些一线性扫描方式进行。int a,b; a+=b; b-=a;
- 条件分支 条件为真跳到分支,条件为假继续线性扫描,因不确定静态环境中确定条件测试的结果。递归会反编译条件的两个分支。分支会添加到反汇编地址,稍后执行反汇编。大意是两条都会反汇编不遗漏,但是会先线性扫描条件为假的分支。
- 无条件分支。会给递归下降反汇编器造成无法确定跳转目标无法确定反汇编下一条指令的麻烦。
- 函数调用指令 与分支类似,先反汇编调用函数指令后面的,在反汇编调用函数,如果程序异常,递归下降就会失败。
- 返回指令,有时函数没有给出下一个执行地址,运行中程序可以从栈顶获得地址,而反汇编器不具备这样的能力。
- 有点:强大区分数据和代码的强大能力
- 缺点:无法确定间接代码路径
- IDA是典型的下降反汇编器。
- 一条指令结束和另一条指令开始的地方确定起始位置。从代码段的第一个字节开始,一现行模式扫描整个代码段。不支持识别分支等非现行指令来了解程序控制流
- 每条指令的长度来确定下一条指令位置。
- 有点:能够完全覆盖程序的所有代码。
- 缺点,没考虑代码混数据,遇到switch语句使用jmp反汇编是错误的。
- gdb、微软的Windbg和objdump实用工具的反汇编均采用线性扫描算法。
- 先存最高有效字节,则称改CPU为大端(big-endian)反之为小端(little-endianl)
- 递归采用不同方法定位指令,强调控制流,根据一条指令是否被另一条指令引用来决定是否进行反汇编。根据指令对CPU指令指针的影响对其分类。
- 顺序流 这些一线性扫描方式进行。int a,b; a+=b; b-=a;
- 条件分支 条件为真跳到分支,条件为假继续线性扫描,因不确定静态环境中确定条件测试的结果。递归会反编译条件的两个分支。分支会添加到反汇编地址,稍后执行反汇编。大意是两条都会反汇编不遗漏,但是会先线性扫描条件为假的分支。
- 无条件分支。会给递归下降反汇编器造成无法确定跳转目标无法确定反汇编下一条指令的麻烦。
- 函数调用指令 与分支类似,先反汇编调用函数指令后面的,在反汇编调用函数,如果程序异常,递归下降就会失败。
- 返回指令,有时函数没有给出下一个执行地址,运行中程序可以从栈顶获得地址,而反汇编器不具备这样的能力。
- 有点:强大区分数据和代码的强大能力
- 缺点:无法确定间接代码路径
- IDA是典型的下降反汇编器。
不要急,IDA很强,第一代语言 人读不懂的二进制语言第二代语言 汇编语言 mov ex,ex 这种,扩展:汇编有很多种,一般按照指令集或处理器分类。因为这一块比较重要,会在后面来填坑。汇编类别(坑位)。第三代语言 引入了关键字和结构,表达更接近自然语言,包括我们熟悉的C,java等。通常使用编译器将程序转换成汇编,也就是第二种语言。第四代语言 与本书无关,我猜是动态,或者脚本语言之类的。如果猜错请在评论里diss我。大意是程序员使用第三代语言,进行开发,经过编译器、汇编和链接器创建可执行程序,使用各种工具来撤销汇编和编译过程的工具就叫做反汇编器和反编译器。前景好,但是困难重重编译过程会造成损失,机器语言,就是0,1的第一代语言不会显示声明变量,只能追踪其用途确定类型。编译属多对多,转换成汇编的方式不同,转源程序也不同,你反汇编或反编译的结果和源程序是有差别的。反编译器非常依赖语言和库,意思什么开发语言和什么库最好用专门的反编译器,不然在做无用功。要想准确的反编译一个二进制文件,需要近乎完美的反汇编能力。很难,不要出现错漏。23章介绍hex-Rays(最复杂的反编译)。为何反汇编分析恶意软件 恶意软件没有源码所以要动静态调试(static analysis and
dynamic analysis),动态就是软件运行起来后,记录其所有的行为,静态则是浏览恶意程序反汇编后的代码,分析。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-4-29 22:49
被福州-dyh编辑
,原因: