IDA基本使用
IDA介绍
- IDA是一款递归下降反汇编器
动态分析
动态分析是指在严格控制的环境下(沙盒)中执行恶意软件,并使用系统检测实用工具记录其所有行为。
静态分析
静态分析则试图通过浏览程序代码来理解程序的行为。此时,要查看的就是对恶意软件进行反汇编之后得到的代码清单
安全审核过程
-
发现漏洞:发现程序中潜在的可供利用的条件
-
分析漏洞
-
开发破解程序
两种反汇编基本算法
-
线性扫描
-
递归下降
IDA打开与关闭
打开IDA
-
新建:将一个.exe等可执行文件进行逆向
-
运行:点击运行将进入IDA空白界面,可以点击左上角选择要逆向的文件或打开已经逆向过的文件
-
载入:自动加载上一个已经逆向过的文件
新建
- 点击新建后需要选择文件
- 选中该文件:会出现以下界面()
运行
- 点击运行后会出现空白界面
- 可以点击文件进行.exe文件的逆向,或者打开已经逆向过的文件
载入
- 点击载入可以加载上次逆向的程序
逆向程序
- 在逆向一个新的.exe等可执行文件时会出现该弹窗
-
这个弹窗将显示最适合处理选定文件的IDA加载器。
-
IDA通过执行loaders目录中的每一个文件加载器,来确定能够识别新文件的加载器,从而创建了这个列表。
-
.dll(Dynamic Link Library)后缀:动态链接库
- DLL文件包含了一组可供程序共享和重用的函数、数据和代码,广泛用于Windows操作系统中的各种程序。然而,由于DLL文件经过编译和链接处理,其中的代码对于普通人来说并不易于理解和阅读。
-
二进制下面的Processor Type是处理器类型
-
下面呈现的是在反汇编中使用的处理器模块
-
多数情况下,IDA将根据它从可执行文件中读到的信息,选择合适的处理器。
-
如果IDA无法正确确定与打开的文件关联的处理器类型,在继续文件加载操作前,必须手动选择处理器类型
-
-
加载段和加载偏移量
-
如果同时选择了二进制文件输入格式和一种x86系列处理器,加载段和加载偏移量字段将处于活动状态。
-
由于二进制加载器无法提取任何内存布局信息,在这里输入的段和偏移量将共同构成所加载文件内容的基址。
-
在最初加载过程中如果忘记指定基址,可以在任何时候使用编辑->加载段->Rebase program来修改IDA镜像的基址
-
修改内存中指定数量的字节,整个程序将会被改变。
-
-
核心选项
-
用于配置特定的反汇编分析选项,IDA可利用这些选项改进递归下降过程。
-
绝大多数情况下,默认选项提供的都是最佳反汇编选项
-
-
处理器选项
- 用来选择适用于选中的处理器模块的配置选项,但它不一定对每个处理器模块有效。
Portable executable
MS-DOS
二进制
关闭IDA
Don’t pack database
不要打包数据库
- 使用IDA逆向后的文件会分开放,而不会打包成一个文件
Pack database (Store)
打包数据库(存储)
- 可以将IDA逆向后的文件打包成,一个文件,再删除不打包的时候零散的文件
- 再次打开的时候就只需要打开.i64文件即可,该文件会存储使用IDA逆向时我们改动的数据
Pack database (Deflate)
打包数据库(压缩)
- 将文 件打包后,将没打包的文件压缩存储到打包的文件里面
Collect garbage
收集垃圾
- 如果当前逆向文件越来越大,在关闭的时候选中这个,会将无用内存清理干净
DON’T SAVE the datebase
不保存数据库
- 在逆向文件里面做了很多操作,但是不希望保存,ida没有提供后退功能,此选项是解决错误操作在ida里面的唯一办法
IDA界面与操作
图形界面和文本界面
- 图形界面
-
jz是跳转的意思,条件成立则执行绿色箭头方框内程序,条件不成立则执行红色箭头方框内的程序
-
文本界面
-
按住
CTRL
然后滑动鼠标滚轮即可放大和缩小该界面 -
可以利用空格进行文本界面与图形界面的切换
导航条
- 导航条上不太颜色代表不同的块,有数据块部分、常规函数块部分等
- 光标悬停在导航带任何位置会指出其在二进制文件中的位置
- 点击导航带上的任何位置,下方窗口都会跳转到相应位置
- Options-color可以修改导航栏的颜色
窗口
-
Functions
-
IDA View-A
-
Hex View-1
-
Enums
-
Imports
-
Exports
Functions
- 函数窗口,每个函数都有一个IDA自动生成的名字(之后可以自行修改函数名字),双击一个函数,会跳转到反汇编窗口这个函数所在的位置
IDA View-A窗口
- 反汇编窗口
-
上图是图形视图,可以比较直观的看清跳转方位
-
按空格键可以和文本视图相互切换,下图是文本视图
-
.text:00517000为区域名称加虚拟地址
-
图中.text是代码段
-
CTRL+ "+"
或者CTRL + 滑动鼠标滚轮
实现界面的缩放 -
views->open subviews->Disassembly(或者是视图->打开子视图->反汇编)
- 可以打开另一个反汇编窗口,每个反汇编窗口互相独立,可以一个查看图形,另一个查看文本
-
IDA使用不同的箭头颜色来表示不同的流
- 条件跳转Yes是绿色箭头,No是红色箭头,默认为蓝色箭头
-
在文本窗口中也有跳转箭头,下图中,文本窗口的左边是箭头窗口,用于描述非线性流程
-
虚线是条件跳转
-
实线是非条件跳转
-
粗实线表示程序将控制权交给程序中的以前的某个地址,通常表示程序中存在循环
-
- 下图红框是反汇编形成的汇编代码
-
封号后面的绿色字是注释
-
按下“ ;”可以添加注释,用于逆向分析使用
-
图中
CODE XREF: sub_942600+3C↑j
是自动生成的表示此处有交叉引用的注释 -
sub_942600+3C↑j
表示一个地址,形式是函数+偏移量,↑表示该地址在上面
-
-
图形视图可以用鼠标滚轮加Ctrl进行拖动,进行缩放
-
有时我们需要用缩小的抽象图片来观察程序执行流程的一些特点
HEX View-1
- 反汇编窗口的十六进制形式
- 显示的是程序内容和列表的标准十六进制代码(每行十六个字节)还会显示对应的ASCII字符
- 有时string窗口显示的字符串不好查看时,可以打开Hex view查看
- 右键->Sychronize with(右键->同步到)可以选择时是否与某个反汇编窗口相互关联,关联后,两个窗口会同时改变位置
Structures
-
结构体窗口,为标准数据结构的布局提供现成的参考。
-
为你提供一种方法,发现程序使用的自定义数据结构时,帮助你创建自己的,可用作内存布局的数据结构
- 如果IDA没有出现结构体窗口可以在views->open subviews->Structures(或者是视图->打开子视图->结构体)()
Enums
- 枚举类型,在反汇编的时候ida会自动识别一部分,之后人为识别然后再添加到该部分
- 显示检测到的标准枚举数据类型(C enum),可以自定义枚举类型
Strings
- views->open subviews->Strings打开窗口(视图->打开子视图->子串)
-
显示的是从二进制文件中提取出来的一组字符串,以及字符串所在的地址
-
从中可以查找程序中使用的字符串(有时也可以用Hex view查勘字符串,但是一般在string窗口中检索想要的关键字符串)
-
与交叉引用相结合可以快速定位字符串,跟踪到程序中引用这个字符串的位置
Names
-
显示全局名称
-
名称是指对一个程序虚拟地址的符号引用
-
F常规函数
-
L库函数
-
I导入的名称
-
C命名代码
-
D数据
-
A字符串数据
-
Impots
-
查看当前程序使用了哪些模块的哪些函数
-
根据导入表生成
Exports
-
查看当前程序导出了哪些函数
-
根据导出表生成
硬编码操作(ACDU)
-
在某些程序的反编译过程中,IDA可能将原本是数据的部分当成了指令,把指令部分当成了数据,此时就需要我们人工的手动进行干预,因此我们需要了解IDA的ACDU这四种硬编码显示模式。
-
ACDU可以将一段数据类型转化成代码(C),数据(D),未定义的二进制数据(U),字符(A)
-
按下(A)
IDA上方使用栏
文件(File)
新建实例(New Instance)
- 新建一个IDA项目,可以同时反汇编两个文件
打开(Open)
- 打开一个二进制文件或者IDA数据库(.idb后缀)文件
加载文件(Load file)
重新加载输入文件(Reload the input file)
- 反汇编器可能在某个地方反汇编出的结果与预期有偏差
附加二进制文件(Additional binary file)
-
可能是与该文件关联的动态库文件等
-
系统启动的文件
IDS/IDT文件
- 符号文件
PDB file
- 调试信息文件
DBG file
- 调试信息文件
TDS file
- 调试文件
FLIRT签名文件
分析C头文件
- 如果有源码的话,可以选择该选项打开C头文件,可以帮助后续的逆向工作
生成文件(Produce file)
创建MAP文件
- 映射信息文件,一般是在动态库里面,表面动态库有哪些函数或者变量是导出的,可用的
创建ASM文件
- 生成一个汇编的文件,将dll二进制的可执行程序,生成汇编的程序来
创建INC文件
- 汇编当中用到的头文件
创建LST文件
- 列表文件,列出一个类似于映射表的东西
创建EXE文件
- 如果有二进制文件,如果想生成.exe文件,点击此即可,将会封装一些东西
创建DIF文件
- 两个文件之间有什么差异,生成一个差异
创建C文件
- 把当前的汇编代码生成C文件
创建HTML文件
- 字面意思,创建网页文件
创建流程图GDL
- 函数怎么调用到程序来
创建调用图GDL
- 程序是怎么调用函数的