文章目录
- 什么是反汇编
- 反汇编的目的
- ID介绍
- 打开创建工程
- IDA的基本规则
- 窗口介绍
- 反汇编窗口
- Names窗口
- Strings窗口
- 十六进制窗口
- 导出窗口
- 导入窗口
- 函数窗口
- 结构体窗口
- 枚举窗口
- 段窗口
- 签名窗口
- 类型库窗口
- 函数调用窗口
- 问题窗口
什么是反汇编
程序员使用编译器、汇编器和链接器中的一个或几个创建可执行程序的过程叫做编译过程(代码输入 --> 可执行程序输出)
使用反汇编器和反编译器回溯编译过程来撤销汇编和编译过程,输出汇编语言或高级语言的过程叫做反汇编(机器语言输入 --> 汇编语言或高级语言输出)
反汇编的难点: 1.编译过程中会造成损失 2.编译属于多对多操作 3.反编译器非常依赖于语言和库 4.要想准确的反编译一个二进制文件,需要近乎完美的反汇编能力
反汇编的目的
1.分析恶意软件
2.分析闭源软件的漏洞
3.分析闭源软件的互操作性
4.分析编译器生成的代码,以验证编译器的性能和准确性
5.调试时显示程序指令
ID介绍
IDA(Interactive Disassembler Professional) 交互式反汇编器专业版,是一种递归下降反汇编器; 这里以IDA 7.0为例进行说明
打开创建工程
打开工程的三个子介绍说明:
New(新建): 启动一个向导,它将引导你选择一个文件进行分析
Go(运行): 终止加载过程,使IDA打开一个空白的工作区
Previous(最近工程): 打开最近打开过的一个文件
新建工程并打开文件之后IDA会根据打开文件,生成一个文件列表,显示如下图所示:
Portable executable for AMD64(PE)[pe64.dll] 和 MS-DOS executable (EXE) [dos64.dll] 加载器均声称能够识别选定的文件
Binary File(二进制文件)会一直显示,因为它是IDA加载无法识别的文件的默认选项,它提供了最低级的文件加载方法
如果IDA提供几个加载器,这时选择默认选项倒即可
在Processor Type(处理器类型): 指定在反汇编过程中使用的处理器模块,多数情况下IDA将根据它从可执行文件的头中读取到的信息选择合适的处理器。
同时选择了二进制文件输入格式和一种x86系列处理器Loading Segment(加载段)和Loading Offset(加载偏移量)字段将处于活动状态。
由于二进制加载器无法提取任何内存布局信息,在这里输入的段和偏移量值将共同构成所加载文件内容的基址。
Kernel Options(核心选项) 按钮用于配置特定的反汇编分析选项,IDA可利用这些选项改进递归下降过程,使用默认的即可。
Processor Options(处理器选项) 按钮用来选择适用于选中的处理器模块的配置选项.
当处理完对应的操作之后会保存对应的工程,点击保存或退出会弹出下面的窗口:
Don’t pack database 不打包数据库,这个选项仅仅刷新对4个数据库组件文件所做的更改,在关闭桌面前并不创建IDB文件, 在关闭数据库时,不建议使用这个选项。
Pack database(Store) 打包数据库不压缩,选择Sotre选项会将4个数据库组件文件存到一个IDB文件中,之前的任何IDB不经确认即被覆盖
Pack database(Deflate) 打包数据库并压缩
Collect Garbage 如果请求垃圾收集,IDA会在关闭数据库之前,从数据库中删除任何没有用的内存页面
DON’T SAVE the datebase 不保存数据库
IDA的基本规则
1.IDA不提供撤销功能
2.几乎所有的操作都有其对应的菜单项、热键和工具栏按钮
3.IDA提供方便的、基于上下文的鼠标右键操作菜单
窗口介绍
反汇编窗口
反汇编窗口也叫IDA-View窗口,它是操作和分析二进制文件的主要工具
反汇编窗口有两种形式: 1.面向文本的列表视图 2.基于图形的视图 默认以图形视图显示。可以通过空格键在两种视图之间切换
图形视图类似流程图: 它将一个函数分解成许多基本块,以生动显示该函数由一个块到另一个块的控制流程。
图形视图的控制流(也就是各个箭头): Yes执行流(默认绿色)、NO执行流(默认红色)、正常执行流(默认为蓝色)
相关操作: Ctrl+鼠标滚轮 调整图形大小;
控制视图的显示方式: 1.平移图块 2.重新调整块位置 3.分组和折叠块 4.创建其它反汇编窗口(View->OpenSubviews->Disassembly)
Options->General->Disassembly 选项卡配置图形视图显示的详略信息
窗口最左边的是箭头窗口用于描述函数中的非线性流程:
实线箭头表示非条件跳转
虚线箭头表示条件跳转
如果一个跳转将控制权转交给程序中的某个地址(以前的),这时会使用粗线。出现这类逆向流程,通常表示程序中存在循环
再右边点是虚拟地址显示显示格式为[区域名称]:[虚拟地址] 如.text:0040110C0
DllMain函数声明的位置,是IDA对于函数栈帧布局最准确估算。
以分号开头的注释属于交叉引用
Names窗口
Names窗口列举了一个二进制文件的所有的全局名称; Ctrl+F 可以调出查询窗口查询特定的名称; 双击对应的名称可以跳转到显示该名称的反汇编视图。
Names窗口通过颜色和字母编码来区分不同的符号:
F: 常规函数,IDA认为这些函数不属于库函数。
L: 库函数,IDA通过签名匹配算法来识别库函数。
I: 导入的名称,通常为共享库导入的函数名称。
G: 命名代码,当IDA在程序的符号表中找到一个名称,但没发现对程序位置的任何调用时,就会出现这种情况。
D: 数据,已命名数据的位置通常表示全局变量。
A: 字符串数据。这是一个被引用的数据位置,其中包含的一串字符符合IDA的某种已知的字符串数据类型.
Names窗口的变量命名规则:
sub_xxxxxx;地址xxxxxx处的子例程
loc_xxxxxx:地址xxxxxx处的一个指令
byte_xxxxxx:位置xxxxxx处的8位数据
word_xxxxxx:位置xxxxxx处的16位数据
dword_xxxxxx:位置xxxxxx处的32位数据
unk_xxxxxx:位置xxxxxx处的大小未知的数据
Strings窗口
Strings窗口中显示的是从二进制文件中提取出的一组字符串,以及每个字符串所在的地址。
双击Strings窗口中的任何字符串,反汇编窗口将跳转到该字符串所在的地址。
将Strings窗口与交叉引用相结合,可迅速定位你感兴趣的字符串,并追踪到程序中任何引用该字符串的位置。
右键菜单->Setup 可以设置字符串窗口的显示风格; Ctrl + F可以用来检索特定符号的字符串;
十六进制窗口
十六进制窗口显示程序内容和列表的标准十六进制代码,每行显示16个字节,以及其对应的ASCII字符
十六进制窗口可以和反汇编窗口同步,如果一个反汇编窗口与一个十六进制窗口同步,在一个窗口中滚动鼠标另一个窗口也会滚动到相同的位置。
如果在反汇编窗口中选中一个项目,十六进制窗口中的对应字节也将突出显示。
导出窗口
导出窗口列出文件的入口点,这包括程序的执行入口点(在程序的文件头部分指定),以及任何由文件导出给其他文件使用的函数和变量。
通常用户可在共享库(如Windows DLL文件)中找到导出的函数。导出的项目按名称、虚拟地址和序数排列。
对于可执行文件,导出窗口中至少包含一个项目:程序的执行入口点。IDA将这个入口点取名为start。
与其他IDA窗口一样,双击弹出窗口的一个条目,IDA会跳转到反汇编窗口对应的位置。 Ctrl+F可以搜索对应的函数名称。
导入窗口
导入窗口的功能与导出窗口的功能正好相反。它列出由被分析的二进制文件导入的所有函数。只有在二进制文件使用共享库时,IDA才需要用到导入窗口。静态链接的二进制文件不存在外部依赖关系,因此不需要导入其他内容。导入窗口中的每个条目列出一个导入项目(函数或数据)的名称,以及包含该项目的库的名称。
由于被导入的函数的代码位于共享库中,窗口中每个条目列出的地址为相关导入表条目的虚拟地址。
函数窗口
函数窗口用于列出数据库中的每一个函数,与名称窗口不同函数窗口并不列出使用自动生成的名称的函数。函数窗口会列出IDA在数据库中识别的所有函数。(标识函数的位置和长度)
与其他显示窗口样,双击函数窗口中的一个条目,IDA将跳转到反汇编窗口中选定的函数位置。
结构体窗口
结构体窗口用于显示IDA决定在一个二进制文件中使用的任何复杂的数据结构(如C结构体和联合)的布局。
在分析阶段,IDA会查询它的函数类型签名扩展库,设法将函数的参数类型与程序使用的内存匹配起来。
双击数据结构的名称,IDA将展开该结构,这允许你查看该结构的详细布局,包括每个字段的名称和大小。
结构体窗口的两个主要用途包括:为标准数据结构的布局提供现成的参考,为你提供一种方法,在你发现程序使用的自定义数据结构时,帮助你创建自己的、可用作内存布局模块的数据结构。
枚举窗口
枚举窗口有点类似于结构体窗口。如果IDA检测到标准枚举数据类型(Cenum),它将在枚举窗口中列出该数据类型。你可以使用枚举来代替整数常量,提高反汇编代码的可读性。
像结构体窗口一样,在枚举窗口中也可以定义自己的枚举类型,并将其用在经过反汇编的二进制代码中。
段窗口
段窗口显示的是在二进制文件中出现的段的简要列表,需要注意的在,在讨论二进制文件的结构时,IDA术语"段"(segment)常称为"节"(section)。
该窗口中显示的信息包括段名称、起始和结束地址以及许可标志。起始和结束地址代表程序段在运行时对应的虚拟地址范围。
签名窗口
IDA利用一个庞大的签名库来识别已知的代码块。签名用于识别由编译器生成的常用启动顺序,以确定可能已被用来构建给定二进制文件的编译器。签名还可用于将函数划归为由编译器插入的己知库函数,或者因为静态链接而添加到二进制文件中的函数。在IDA为你识别库函数时,你可以将更多精力放在分析IDA无法识别的代码上。
类型库窗口
类型库窗口在概念上与签名窗口类似。类型库保存IDA积累的一些信息,即IDA从最常用的编译器的头文件中搜集到的有关预定义数据类型和函数原型的信息。通过处理头文件,IDA可确定常用库函数所需的数据类型,并为反汇编代码提供相应的注释。同样,IDA还可从这些头文件中了解复杂数据结构的大小和布局。所有这些信息都收集在TIL文件(<IDADIR/til目录>)中,并可在任何时候应用于你分析的二进制文件。与应用签名时一样,在选择加载一组适当的TIL文件之前,IDA必须首先确定一个程序所使用的库。要请求IDA加载其他类型库,可以在类型库窗口中按下INSERT键,或右击窗口并在出现的菜单中选择Load Type Library(加载类型库)。
函数调用窗口
在任何程序中,一个函数可以调用其他函数,也可以被其他函数调用。实际上,建立一个图形来说明调用方与被调用方之间的关系,是一个相当简单的任务。这样的图形叫做函数调用图形或函数调用树。
有时候,我们并不需要查看程序的完整调用图形,而只对临近函数调用关心,打开函数调用窗口时,IDA会确定光标所在位置的函数的"近邻".
问题窗口
IDA在问题窗口中显示它在反汇编二进制文件时遇到的困难,以及它如何处理这些困难。有些时候,你可以操纵反汇编代码,帮助IDA解决问题。