OlllyDbg调试器和IDA调试器


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"


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM