IDA
加载文件
Windows 下,用IDA加载文件之后,会在文件同目录下生成几个文件:
.id0 二叉树数据库
.id1 文件包含描述每个程序字节的标志
.nam 包含IDA Name 窗口的数据库
.til 本地数据库有关信息
常用快捷键
快捷键 |
操作 |
空格 |
切换视图 |
ESC |
退回上一页 |
G |
搜索地址或者符号 |
N |
重命名 |
H |
16进制转换 |
Y |
修改函数原型、变量类型 |
:; |
注释(:只会在注释处出现) |
C |
将光标处的内容解析成代码 |
P |
在当前地址解析成函数 |
D |
在当前地址解析成数据 |
U |
在当前地址解析成未定义内容 |
X |
交叉引用 |
F5 |
C伪代码 |
Insert |
在结构体试图中添加结构体 |
ALT+T |
搜索文本 |
ALT+B |
搜索二进制 |
SHITF+F12 |
字符串窗口 |
OD、xdbg
常用快捷键
快捷键 |
操作 |
F2 |
下断点 |
F3 |
载入EXE |
F4 |
运行到光标处 |
F7 |
步进 |
F8 |
步过 |
F9 |
运行 |
空格 |
修改汇编代码 |
CTRL+F2 |
重载EXE |
CTRL+F8 |
自动逐行运行程序 |
CTRL+F9 |
运行到ret处 |
CTRL+F |
命令模式 |
CTRL+G |
跳转到某个地址 |
CTRL+B |
查找二进制字符串 |
ALT+C |
反汇编窗口 |
ALT+M |
内存窗口 |
ALT+B |
断点窗口 |
ALT+E |
可执行模块窗口 |
断点
条件断点:在条件窗口
- eax == xxx
- string[[esp+4]] == "abcd" esp+4 是第一个参数 esp+8 是第二个参数
- string[edi] == "abcd" 直接是寄存器也可以
- byte ptr[edi] =="a" 单个字符
- unicode[eax] =="abcd" OD认为eax是一个指向unicode串的指针,将其转换为ascii后与文本进行比较
- bp CreateFileA,[STRING[ESP+4]] == "abcd" 当CreateFileA函数第一参数是abcd是中断 如果是unicode ,就用UNICODE[esp+4]
硬件断点
DR0、DR1、DR2、DR3 四个寄存器用来存放硬件断点,所以最多同时只能存放4个硬件断点。
DR4、DR5系统保留,DR7是一些控制位,用于控制断点的方式.
DR6是用于显示哪个硬件调试器引发的断点。如果是DR0引发的断点,则DR6的第0位被置为1,如果是DR1引发的断点,则DR6的第1位被置为1,依次类推。因为硬件断点同时只能触发一个,所以DR6中的低4位,最多有一位被置为1,所以我们可以通过DR6的低4位来判断是否有硬件断点被断下,还可以确定是哪一位。
DR7结果如下所示:
位数 |
作用 |
L0:G0 ~ L3:G3 |
L0 == 1,代表DR0局部断点;G0 == 1,代表DR0全局断点。其他依次类推。 |
LE、GE |
P6 family和之后的IA32处理器都不支持这两位。当设置时,处理器会检测触发数据断点的精确指令。当其中一个被设置时,处理器会放慢执行速度,这样当命令执行时会通知这些数据断点。切换任务时LE会被清除,而GE则不会。为了兼容性,inter建议使用精确断点时把LE和GE都设置为1。 |
GD |
用于保护DRx,如果GD为1,则对DRx的任何访问都会导致进入1号调试陷阱(int 1)。即IDT的对应入口,这样可以保证调试器在必要情况下完全控制DRx |
LEN0 ~ LEN3 |
指定调试地址寄存器DR0~DR3对应断点的长度,如果R/W x 为0时,LEN x 也必须为0,否则会产生不确定行为。LEN x 取值如下:
- 00 1字节
- 01 2字节
- 10 保留
- 11 4字节
|
R/W0 ~ R/W3 |
指定各个断点的触发条件。它们对应DR0 ~ DR3。可能取值如下:
- 00 执行
- 01 写入数据
- 10 I/O端口断点
- 11 读或写数据
|