附录F 速查表

F.1 IDA

常用的IDA的快捷键如下表所示。

按  键

作  用

空格

切换显示方式

C

转换为代码

D

转换为数据

A

转换为字符

*

转换为数组

U

未定义

O

提取操作数的偏移量

H

把立即数转换为10进制数

R

把立即数转换为字符

B

把立即数转换为2进制数

Q

把立即数转换为16进制数

N

为标签重命名

计算器

G

跳转到地址

:

添加注释

Ctrl-X

查看当前函数、标签、变量的参考(显示栈)

X

查看当前函数、标签、变量的参考

Alt-I

搜索常量constant

Ctrl-I

再次搜索常量

Alt-B

搜索byte序列

Ctrl-B

再次搜索byte序列

Alt-T

搜索文本(包括指令中的文本)

Ctrl-T

再次搜索该文本

Alt-P

编辑当前函数

Enter

跳转到函数、变量等对象

Esc

返回

Num −

收缩(函数代码或区域代码)

Num +

展开

如果您明白函数的具体作用,就可以使用IDA的“收缩”功能把函数的代码隐藏起来。笔者编写的IDA脚本程序(https://github.com/yurichev/IDA_scripts

)可自动隐藏经常使用的内联代码。

F.2 OllyDbg

OllyDbg常用的快捷键如下表所示。

快 捷 键

作  用

F7

单步步入/单步调试

F8

单步步过

F9

执行至断点处

Ctrl-F2

重新启动程序

F.3 MSVC选项

本书常用的MSVC选项如下表所示。

选  项

作  用

/O1

创建尺寸最小的文件

/Ob0

禁止內联展开

/Ox

启用最大优化

/GS-

禁用安全检查(缓冲区溢出)

/Fa(file)

创建汇编文件(设置文件名)

/Zi

生成完整的调试信息

/Zp(n)

使封装结构体向n字节边界对齐

/MD

令可执行程序使用MSVCR*.DLL

有关MSVC的详细介绍,请参见本书的55.1节。

F.4 GCC

本书用到的GCC选项如下表所示。

选  项

作  用

-Os

优化目标文件大小

-O3

打开所有-O2的优化选项

-regparm=

设定传递参数的寄存器的数量

-o file

指定输出的文件名

-g

产生带有调试信息的目标代码

-S

仅编译到汇编指令,不进行汇编和链接

-masm=intel

汇编指令采用intel语体

-fno-inline

禁止內联函数

F.5 GDB

本书用到的GDB指令如下表所示。

选  项

作  用

break filename.c:number

在源程序第n行处设置断点

break function

在函数入口处设置断点

break *address

在某地址设置断点

b

同break

p variable

显示变量的值

run

运行

r

同run

cont

继续运行

c

(同上)

bt

打印当前栈的所有信息

set disassembly-flavor intel

设置为intel语体

disas

查看当前函数程序的汇编指令

disas function

查看函数的汇编指令

disas function,+50
disas $eip,+0x10

查看函数的部分汇编指令
(同上)

disas/r

查看接下来的几条指令

info registers

查看opcode

info float

显示CPU各寄存器的值

info locals

显示FPU各寄存器的值

x/w ...

列出全部的局部变量(如果能识别出来)

x/w $rdi

读取内存,并显示为word型数据

x/10w ...

从RDI指定的地址读取数据,显示为word

x/s ...

读取并显示10个word型数据

x/i ...

读取内存并显示为字符串

x/10c ...

读取内存并显示为汇编代码

x/b ...

读取内存,并显示10个字符

x/h ...

读取内存,并显示为byte

x/g ...

读取并显示16位halfword型数据

finish

读取并显示giant words(64位)

next

执行到函数退出位置

step

单条语句执行指令,(不步入函数)

set step-mode on

单步步入的跟踪调试指令

frame n

打开step-mode模式

info break

切换栈帧

del n

查看断点

set args ...

删除断点