用的 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