用的 IDA 7.7 还是 7.6 版本,忘了
IDA 官方博客:https://hex-rays.com/blog/
二进制小工具
C++filt:
可以用于显示出 c++ 中复杂的重载后的函数名称
PE tools:
是一组用于分析 Windows 系统中正在运行的进程和可执行文件的工具
string:
可以用于直接搜索出 elf 文件中的所有字符串
参数-a 表示搜索整个文件,参数-t 可以显示出每一个字符串的偏移,参数-e 可以用于搜索更多的字符编码的字符串,如Unicode编码
strip:
可用于elf去符号,去符号后仍然保持正常功能但增加了逆向的难度,出题恶人必备
IDA目录结构
在 IDA 的安装根目录下文件夹架构:
cfg:包含各种配置文件,基本 IDA 配置文件 ida.cfg,GUI 配置文件 idagui.cfg,文本模式用户界面配置文件 idatui.cfg,
idc:包含 IDA 内置脚本语言 IDC 所需要的核心文件
ids:包含一些符号文件
loaders:包含用于识别和解析 PE 或者 ELF
plugins:附加的插件模块
procs:包含处理器模块
常用快捷键
IDA 中的快捷键都是和菜单栏的各个功能选项一一对应的,基本上只要能在菜单栏上找到某个功能,也就能看到相应的快捷键,这里记录几个常用的:
A:将数据转换为字符串
选中内容后,Edit->String->Unicode:将数据转为宽字节码
U:取消定义函数、代码、数据的定义
T:数据转为结构体
C:数据到代码
P:转化为函数
*:将数据段的数据转化为数组的格式,必须先将第一个元素更改为合适的类型才可以
F5:一键反汇编
ESC:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,
如果是在其他窗口按下 esc,会关闭该窗口)
SHIFT+F12:可以打开 string 窗口,一键找出所有的字符串,右击 setup,还能对窗口的属性进行设置
CTRL+W:保存ida数据库
CTRL+S:选择某个数据段,直接进行跳转
CTRL+鼠标滚轮:能够调节流程视图的大小
D:分别按字节、字(双字节)、双字的形式显示数据
X:对着某个函数、变量按该快捷键,可以查看它的交叉引用
G:直接跳转到某个地址
N:更改变量的名称
Y:更改变量的类型
R:把立即值转换为字符
H:把立即值转换为 10 进制
Q:把立即值转换为 16 进制
B:把立即值转换为 2 进制
ALT+T:启动文本搜索
ALT+B:启动二进制搜索
TAB:在汇编代码与伪代码之间切换
Shift+E:提取数据
/ :在反编译后伪代码的界面中写下注释
\:在反编译后伪代码的界面中 隐藏/显示 变量和函数的类型描述,有时候变量特别多的时候
隐藏掉类型描述看起来会轻松很多
: :常规注释
;:可重复注释,对该地址处的引用也会显示注释
CTRL+SHIFT+T:拍摄 IDA 快照
Alt+T:字符串搜索 Ctrl+T:搜索下一个字符串匹配项
Alt+B: 二进制搜索 Ctrl+B:搜索下一个二进制匹配项
跳转到前一个窗口:
Jump->Jump to Previous Position 或者 Esc
跳转到后一个窗口:
Jump->Jump to Next Position 或者 Ctrl+Enter
View-->OpenSubviews-->Local Types-->INSERT 插入一个已存在的结构体
FILE-->LOAD FILE-->Parse C Header File 从头文件中导入结构体
常用设置
拍摄快照
由于IDA不提供撤销的功能,如果你不小心按到某个键,导致ida数据库发生了改变,就得重新来过,所以要记得在经常操作的时候,拍摄快照:file-->take database snapshot
拍摄快照后,会生成一个新的ida数据库文件,本质上是有点像另存的操作
快捷键:ctrl+shift+w
菜单栏常用设置
view-->open subviews: 可以恢复你无意中关闭的数据显示窗口
windows-->reset desktop: 可以恢复初始ida布局
option-->font: 可以改变字体的相关属性
在流程视图添加地址偏移
众所周知,在流程视图默认是没有地址偏移的。在流程图视图下点击菜单栏中设置:option-->general 中 Disassembly 下,Line prefixes(graph)勾上即可。

效果
自动添加反汇编注释
点击菜单栏中设置:option-->general 中 Disassembly 下,Auto comments 勾上即可。
常用操作
创建数组
首先框选你需要转换成数组的数据。

数据
接着在菜单栏中选择:edit-->array,就会弹出如下的选项框

数组选项框
参数含义:
Array element size 这个值表示各数组元素的大小(这里是 1 个字节),
是根据你选中的数据值的大小所决定的
Maximum possible size 这个值是由自动计算得出的,他表示数组中的元素的可能的最大值
Array size 表示数组元素的数量,一般都根据你选定的自动产生默认值
Items on a line 这个表示指定每个反汇编行显示的元素数量,它可以减少显示数组所需的空间
Element print width 这个值用于格式化,当一行显示多个项目时,他控制列宽
Use “dup” construct :使用重复结构,这个选项可以使得相同的数据值合并起来,
用一个重复说明符组合成一项
Signed elements 表示将数据显示为有符号数还是无符号数
Display indexes 显示索引,使得数组索引以常规的形式显示,如果选了这个选项,
还会启动右边的 Indexes 选项栏,用于选择索引的显示格式
Create as array 创建为数组,这个一般默认选上的
完成后如果出现下面情况

合并
可以看到这些数据已经被当成一个数组折叠到了一起,其中 2 dup(0FFh) 这样的,表示有两个重复的数据 0xff。
创建字符串
假设有个字符数组要转换成字符串,选中后,点击菜单栏的 Edit->String,然后根据是否是宽字符选择 ASCII 还是 Unicode。

字符串
折叠流程图分支
在流程视图中,分支过多的时候,按住 CTRL+鼠标左键可以选中多个节点,在窗口标题处右击选择 group nodes,然后就可以将多个节点合成一个组合,然后输入文本内容对节点组合进行描述。如下:

组合
这个时候再右键这个组合,可以看到右键内容有了变化,从上到下分别是 组合节点、隐藏组合、取消组合节点、隐藏所有组合、取消隐藏所有组合。作用和字面含义一样。注意:这个组合节点可以按住 CTRL 组合多个节点。
函数调用图
菜单栏中:view-->graphs-->Function calls(快捷键 Ctrl+F12)
这样的图可能比较复杂,选择 View => Graphs => User xrefs chart => 设置深度(比如 3)可以得到简单点的图。如下:

函数调用图
函数流程图
菜单栏中:view-->graphs-->flowt chart(快捷键F12)

函数流程图
手工创建结构体
导入 C 语言声明的结构体
IDA 动态调试 elf
IDA python
打 patch
IDA 导出数据文件
IDA 常见命名意义
sub 指令和子函数起点
locret 返回指令
loc 指令
off 数据,包含偏移量
seg 数据,包含段地址值
asc 数据,ASCII 字符串
byte 数据,字节(或字节数组)
word 数据,16 位数据(或字数组)
dword 数据,32 位数据(或双字数组)
qword 数据,64 位数据(或 4 字数组)
flt 浮点数据,32 位(或浮点数组)
dbl 浮点数,64 位(或双精度数组)
tbyte 浮点数,80 位(或扩展精度浮点数)
stru 结构体(或结构体数组)
algn 对齐指示
unk 未处理字节
IDA 中有常见的说明符号,如 db、dw、dd 分别代表了 1 个字节、2 个字节、4 个字节
IDA 类型声明
typedef long long ll;
typedef unsigned long long ull;
#define __int64 long long
#define __int32 int
#define __int16 short
#define __int8 char
typedef __int64 ll;
typedef unsigned __int64 ull;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned long ulong;
typedef char int8;
typedef signed char sint8;
typedef unsigned char uint8;
typedef short int16;
typedef signed short sint16;
typedef unsigned short uint16;
typedef int int32;
typedef signed int sint32;
typedef unsigned int uint32;
typedef ll int64;
typedef ll sint64;
typedef ull uint64;
#define _BYTE uint8
#define _WORD uint16
#define _DWORD uint32
#define _QWORD uint64
因此DWORD是unsigned int,WORD是unsigned short,BYTE是unsigned char
LPDWORD为长指针,PDWORD为短指针。指针类型的命名方式一般是在其指向的数据类型前加LP或P,LP为长指针,P为短指针。但是,在32位系统中已经不再区分,都是一样的长度。
IDA 反编译报错
配置 IDA
参考
https://xz.aliyun.com/t/4205
https://bbs.kanxue.com/thread-259304.htm
https://www.cnblogs.com/lordtianqiyi/articles/17232057.html