OllyDbg调试器
OllyDbg称为Ring3级的首选工具。可以识别数千个被和Windows频繁使用的函数,并能将其注释出来。它会自动分析函数过程、循环语句等
OllyDbg主界面
快捷键
-
Address列:显示被双击行地址的相对地址,再次双击返回标准地址模式。
-
Hex dump列:设置或取消无条件断点,对应的快捷键是"F2键"
-
Disassembly列:调用汇编器,可直接修改汇编代码,对应的快捷键是空格键
-
Comment列:允许增加或编辑注释,对应的快捷键是 ";" 键
从键盘上选择多行,可按Shifit键和上下光标键来实现。
信息面板窗口
在进行动态跟踪时,信息面板窗口(Information window)将显示与指令相关的各个寄存器的值、API函数调用提示和跳转调试等信息。
数据面板窗口
数据面板窗口(Dump window)以十六进制和字符方式显示文件在内存中的数据。要显示指定内存地址的数据,可的那几右键快捷菜单中的"Go to expression"命令或按"Ctrl+G"快捷键,打开地址窗口,输入地址。
寄存器面板窗口
寄存器面板窗口(Registers Window)显示CPU各寄存器的值,支持浮点、MMX和3DNow!寄存器可以单击右键或窗口标题切换显示寄存器的方式。
栈面板窗口
栈面板窗口(Stack window)显示栈的内容,即ESP指向地址的内容。将数据放入栈的操作为入栈(push) 从栈中取出数据的操作称为出栈(pop)。栈窗口非常重要,各API函数和子程序都利用它传递参数和变量等
基本操作
单步功能的快捷键是 F7键(路过) 和 F8键(跟进)
1.
在编译时,优化时有两种选择一个是 Maximize Speed (最大速度) 和Minimize Size(最大)优化选项进行编译
。
因为优化选项不同,所以生成的汇编代码也会不同。
这就涉及到编译原理的知识了。
IDA编译器
IDA安装成功后,会在桌面上生成两个图标,分别为IDA Pro(32-bit)和IDA Pro(64-bit),它们分别对于32位和64位程序的分析。IDA支持的文件类型非常丰富,除了常见的PE格式,还支持DOS、UNIX、Mac、Java、.NET等平台的文件格式。单击"File"->"Open"菜单项,打开要目标文件.exe文件,IDA一般能自动识别其格式
IDA是按区块装载PE文件的,例如.text(代码块)、.data(数据块)、.rsrc(资源块)、.data(输入表)和.edata(输入表)等。IDA反汇编所消耗的时间与程序大小及复杂程度有关,通常需要等待一段时间才能完成。
第一阶段
将程序的代码和数据分开,分别标记函数并分析其参数调用,分析跳转,调用等指令关系并给标签赋值等。
第二阶段
如果IDA能够识别文件的编译类型,就装载对应的编译器特征文件,然后给各函数赋名。随后,IDA会创建一个数据库,其组件分别保存在扩展名为 .id0、id1、.nam 和 .til的4个文件里,这些文件的格式为IDA专用,在关闭当前项目时,这四个文件将被存档为一个IDB文件。一旦IDA创建了数据库,就不需要再访问这个可执行文件,除非使用IDA的集成调试器调试这个可执行文件本身。再次分析该目标文件时,IDA只需要打开现有数据库,就会将界面恢复为上次关闭时的状态。
"Kernel option1" "Kernel option2" "Processor option" 这3个选项可以控制反汇编引擎的工作状态,一般使用默认设置。IDA会自动识别程序类别与处理器类型,在大多数情况下,分析选项的默认值会在准确与方便性之间提供一个折中的参数。
导航栏
注释
使用IDA可以方便地在代码后面输入注释。在窗口右键空白处单击右键,将显示输入注释的快捷菜单项,一个是"Enter comment"(快捷键时冒号),另一个是"Enter repeatable comment"(快捷键是分号)按";"
按";"键输入的注释在所有交叉参考处都会出现,按":"键输入的注释只在该处出现。如果一个地址处有两种注释,将只显示非重复注释。
跳转到地址窗口
可以在反汇编窗口上下滚动,直至看到想要访问的地址。若直到目标地址,可以用IDA提供的快捷键"G"打开"Jump to address"(跳转到地址)
交叉参考
通过交叉参考(XREF)可以直到指令代码相互调用的关系。如下图:"CODE XREF":sub_401120+ j表示该调用地址是401120h,"j"表示跳转(jump)。此外,"o" 表示偏移量(offset) "p"表示子程序(procedure)双击此处或按"Enter"键可以跳转到调用该处的地方。
参考重命名
参考重命名(Renaming of reference)是IDA的一个极好的功能,它可以将反汇编清单中的一些默认名称更改为有意义的名称,增加了代码的可读性。要修改一个名称,只需单击希望修改的名称(使其突出显示),并使用快捷键"N"打开更名对话框。
-
Local name: 局部符号名的作用域仅限于当前函数。
-
Include in names list:勾选这个选型,将有一个名称被添加到名称窗口中。
-
Pulic name: 由二进制文件(例如 DLL)输出的名称。
-
Autogenerated name:自动创建符号名。
标签的用法
单击菜单项"Jump"-->"Mark position",打开"标记当前位置"功能,会出现如图3.12所示的对话框。
为这个标记(当前光标位置)加上标签,"WndProc" 标签就是需要返回的位置。当离开这个标记并返回时,选择菜单项"Jump"->"Jump to marked position",或者按"Ctrl+M"快捷键,执行"跳转到标记位置"功能
格式化指令操作数
IDA可以格式化指令使用的常量,因此应尽可能使用符号名称而非数字,从而使反汇编编码更具有可读性。IDA根据被反汇编指令的 上下文、所使用的数据作出格式化决定。对其他情况,IDA一般会将相关常量格式化成一个十六进制常量。
IDA可以提供多种进制显示。将光标移到需要转换进制的常量上,单击右键,所示的上下文菜单。该菜单提供的选项可将常量格式化十进制、八进制或二进制的值。
代码和数据转换
很多工具在进行反汇编的时候可能无法正确区分数据和代码,IDA也不例外,数据字节坑能被错误地识别为代码字节,而代码字节可能被错误地识别为数据字节。有些程序就是利用这一点来对抗静态反汇编的。IDA的交互性使用户可以将某段十六进制数据指定为代码或数据,即利用用脑来区别代码和数据
如果确信某段十六进制数据是一段指令,只要将光标移到其第一个字节的编译位置,执行菜单命令"Edit"->"Code"或按"C"键即可。按"P"键可以将某段代码定义为子程序,并列处参数调用。若要取消定
字符串
数组
IDA有着强大的聚合能力。它可以将一串数据声明变成一个反汇编行,按数据的 形式显示,从而简化反汇编代码清单。
用IDA打开实例Arrays.exe,数组用C语言的描述,代码如下。
static int a[3] = {0x11,0x22,0x33};
汇编代码如下。
.text:00401009 mov edi,dword_4070330[eax]
其中,407030h指向一个数组,如图
将光标移到需要处理的数据处,选择菜单项"Edit"——>"Array"或按 "*" 键,打开数组排列调整窗口
设置完成,数据按1x3的形式排列,如图
.data:00407030 dword_407030 dd 11hh ,22h,33h ; DATA XREF:_main:loc_401009
结构体
在C语言中,结构体(struct)是一种数据结构,可以将不同类型的数据结构组合到一个复合的数据类型中,结构体可以被声明为变量、指针或数组等,从而实现比较复杂的数据结构。
创建结构体
对一些常见的文件类型,IDA会自动加载相应的类型库,例如vc6.0在进行底层分析时,可以增强mssdk(windows.h) ntddk(ntddk.h)等这些类型库中有相应的结构体,用户分析代码时可以直接引用。按Shift+F11快捷键,打开加载类型库窗口(Loaded Tyepe Libraries),在弹出的"Available Type Livbraries" 窗口中选择类型库
此时就可以查看内置的结构体数据结构了。选择"View" -> "Open subviews" ->"Structures"菜单选项,打开结构体管理窗口
枚举类型
可以在反汇编时用IDA动态定义和操作枚举类型(Enumerated Types)。看看下面这段简单的C语言程序,在用IDA进行反汇编后,得到了一些没有意义的数字
//Enumerated.cpp
int main(void)
{
enum weekday {
MONDAY,
TUESDAY,
WEDNESDAY,
THUSDAY,
FRIDAY,
SATURDAY,
SUNDAY};
printf("%d,%d,%d,%d,%d,%d,%d",MONDAY,TUESDAY,WEDNESDAY,THUSDAY,FRIDAY,SATURDAY,SUNDAY);
return 0;
}
可以用枚举类型来表示这些数字。执行"View"-->"Open subviews" -->"Enumerations"选项,打开枚举窗口,按"Insert"键插入一个新的枚举类型"weekday".在新建的weekday枚举类型中按"N"键添加枚举成员 "0"对应于"MONDAY","1"对应于"TUESDAY"