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 读或写数据