侧边栏

逆向之OllyDbg调试细则

逆向之OllyDbg调试细则

快捷键转载

OllyDbg 窗口通用快捷键

快捷键    功能      
Ctrl + F2 重启程序,即重新启动被调试程序( 重新载入程序 )。如果当前没有调试的程序,OllyDbg会运行历史列表[historylist]中的第一个程序。程序重启后,将会删除所有内存断点和硬件断点。译者注:从实际使用效果看,硬件断点在程序重启后并没有移除。
Alt + F2 关闭,即关闭被调试程序。如果程序仍在运行,会弹出一个提示信息,询问您是否要关闭程序。
F2 设置断点(INT3型断点),只要在光标定位的位置(上图中灰色条)按 F2 键即可,再按一次 F2键则会删除断点。
Shift + F2 设置条件断点
F3 弹出 " 打开32位.EXE文件 " 对话框。选择可执行文件,并可以输入运行参数。
F4 运行到所选择的那一行。作用就是直接运行到光标所在位置处暂停。即 执行到光标所在位置(直接转到要调试的位置)
Shift + F4 设置记录断点(一种条件断点,当条件满足时一些表达式的值会记录下来), 详情参见断点[Breakpoint]。
F5 最大化当前窗口或将当前窗口大小改为正常化。
Alt + F5 让 OllyDbg 总在最前面。
F6 切换到下一个窗口。
Shift + F6 切换到前一个窗口。
F7 单步步入到下一条命令( 单步进入 ,如果当前命令是一个函数[Call],则会停在这个函数体的第一条命令上。如果当前命令是是含有REP前缀,则只执行一次重复操作。
Shift + F7 与 F7 相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步入被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。
Ctr l+ F7 自动步入,在所有的函数调用中一条一条地执行命令(就像按住 *F7* 键不放一样,只是更快一些)。当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步入过程都会停止。每次单步步入,OllyDbg都会更新所有的窗口。所以为了提高自动步入的速度,请您关闭不必要成窗口,对于保留的窗口最好尽量的小。按Esc键,可以停止自动步入。
F8 单步步过到下一条命令( 单步跳过 。如果当前命令是一个函数,则一次执行完这个函数(除非这个函数内部包含断点,或发生了异常)。如果当前命令是含有REP前缀,则会执行完重复操作,并停在下一条命令上。
Shift + F8 与 F8 相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步过被调试程序指定的异常处理(请参考忽略 Kernel32 中的内存非法访问)。
Ctrl + F8 自动步过,一条一条的执行命令,但并不进入函数调用内部(就像按住 *F8* 键不放一样,只是更快一些)。当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步过过程都会停止。每次单步步过,OllyDbg都会更新所有的窗口。所以为了提高自动步过的速度,请您关闭不必要成窗口,对于保留的窗口最好尽量的小。按Esc键,可以停止自动步过。
F9 运行,遇到断点则停在断点位置。如果没有设置相应断点的话,被调试的程序将直接开始运行直到结束。
Shift + F9 与 F9 相同,但是如果被调试程序发生异常而中止,调试器会首先尝试执行被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。
Ctrl + F9 把本层call执行完。即执行函数代码内的命令,直到遇到 RETN 命令,用于跳出函数体。在此期间不进入子函数也不更新CPU数据。因为程序是一条一条命令执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。
Alt + F9 执行直到返回到用户代码段,跟踪程序直到指令所属于的模块不在系统目录中,在此期间不进入子函数也不更新CPU数据。因为程序是一条一条执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。
F10 打开与当前窗口或面板相关的快捷菜单。
Ctrl + F11 Run 跟踪步入,一条一条执行命令,进入每个子函数调用,并把寄存器的信息加入到Run跟踪的存储数据中。Run跟踪不会同步更新CPU窗口。
F12 暂停程序,F9 可以继续运行。
Ctrl + F12 Run 跟踪。步过,一条一条执行命令,但是不进入子函数调用,并把寄存器的信息加入到Run跟踪的存储数据中。Run跟踪不会同步更新CPU窗口。
Esc 如果当前处于自动运行或跟踪状态,则停止自动运行或跟踪。如果CPU显示的是跟踪数据,则显示真实数据。
空格 点击反汇编窗口,可以修改原有汇编代码
分号(或者直接双击) 增加注释
回车 Enter 将选中的命令添加到命令历史[command history]中,如果当前命令是一个跳转、函数或者是转换表的一个部分,则进入到目的地址。即在返汇编窗口里面点击 call,可以查看 call 内反汇编代码。
Alt + B
显示断点窗口。在这个窗口中,您可以编辑、删除、或跟进到断点处。
Alt + C 显示 CPU 窗口。
Alt + E 显示模块列表[list of modules]。
Alt + K 显示调用栈[Call stack]窗口。
Alt + L 显示日志窗口。
Alt + M 显示内存窗口。
Alt + O 显示选项对话框[Options dialog]
Alt + X 关闭 OllyDbg。

 反汇编窗口中的快捷键[Disassembler shortcuts]

当 CPU 窗口中的反汇编面板[Disassembler pane]处于激活状态时,您可以使用以下快捷键:

快捷键功能
退格键 移除选中部分的自动分析信息。如果分析器将代码误识别为数据,这个快捷键就非常有用。
Alt + 退格键 撤消所选部分的修改,以备份数据的相应内容替换所选部分。仅当备份数据存在且与所选部分不同时可用。
Ctrl+F1 如果API帮助文件已经选择,将打开与首个选择行内的符号名相关联的帮助主题。
Ctrl+F5 打开与首个选择的命令相对应的源文件。
Alt+F7 转到上一个找到的参考。
Alt+F8 转到下一个找到参考。
Ctrl+A 分析当前模块的代码段。
Ctrl+B 开始二进制搜索。
Ctrl+C 复制所选内容到剪贴板。复制时会简单地按列宽截断不可见内容,如果希望排除不需要的列,可把这些列的宽度调整到最小。
Ctrl+E 以二进制(十六进制)格式编辑所选内容。
Ctrl+F 开始命令搜索。
Ctrl+G 转到某地址。该命令将弹出输入地址或表达式的窗口。该命令不会修改 EIP。
Ctrl+J 列出所有的涉及到该位置的调用和跳转,在您用这个功能之前,您必须使用分析代码功能。
Ctrl+K 查看与当前函数相关的调用树[Call tree]。在您用这个功能之前,您必须使用分析代码功能。
Ctrl+L 搜索下一个,重复上一次的搜索内容。
Ctrl+N 打开当前模块的名称(标签)列表。
Ctrl+O 扫描object文件。扫描Object文件。该命令会显示扫描Object文件对话框,您可以在该对话框中选择Object文件或者lib文件,并扫描这个文件,试图找到在实际代码段中用到的目标模块。
Ctrl+R 搜索所选命令的参考。该命令扫描激活模块的全部可执行代码,以找到涉及到首个选中的命令的全部相关参考(包括:常量、跳转及调用),您可以在参考中使用快捷键Alt+F7 和 Alt+F8来浏览这些参考。为便于您使用,被参考的命令也包含在该列表中。
Ctrl+S 命令搜索。该命令显示命令查找[Find command]对话框供您输入汇编命令,并从当前命令开始搜索。
星号 (*) 转到原始位置(激活线程的EIP处)。
Ctrl + 星号(*) 指定新的起始位置,设置当前所选线程的EIP为首个选择字节的地址。您可以在选择EIP并撤消该操作。
加号 (+) 如果run跟踪[run trace] 没有激活,则根据命令历史[command history]跳到下一条运行过命令的地方;否则跳到Run跟踪的下一个记录。
Ctrl + 加号 跳到前一个函数开始处。(注意只是跳到,并不执行)
减号 (-) 如果run跟踪[run trace] 没有激活,则根据命令历史[command history]跳到前一条运行过命令的地方;否则跳到Run跟踪的前一个记录。
Ctrl + 减号 跳到下一个函数开始处。(注意只是跳到,并不执行)
空格 修改命令。您可在显示对话框中以汇编语言修改实际指令或输入新指令,这些指令将替换实际代码,您也可以在想要修改的指令处双击鼠标。
冒号(:) 添加标签。显示添加标签窗口[Add label]或修改标签窗口[Changelabel],您可在此输入与首个选择的命令中的第一个字节相关联的标签(符号名)。注意,在多种编程语言中,冒号可以是标签的一部分。
分号 (;) 添加注释[comment]。显示添加注释窗口[Add label]或修改注释窗口[Changelabel],您可在此输入与首条所选命令的第一个字节相关联的注释(注释串会显示在最后一列中)。注意,多种汇编语言使用分号作为注释开始。您也可以在注释列双击需要注释的命令行。

运行环境: OllyDbg 可以以在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP(未经完全测试)操作系统中工作,但我们强烈建议您采用300-MHz以上的奔腾处理器以达到最佳效果。还有,OllyDbg 是极占内存的,因此如果您需要使用诸如追踪调试[Trace]之类的扩展功能话,建议您最好使用128MB以上的内存。支持的处理器: OllyDbg 支持所有 80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE指令集以及相关的数据格式,但是不支持SSE2指令集。

配置:有多达百余个选项用来设置 OllyDbg 的外观和运行。

数据格式: OllyDbg 的数据窗口能够显示的所有数据格式:HEX、ASCII、UNICODE、 16/32位有/无符号/HEX整数、32/64/80位浮点数、地址、反汇编(MASM、IDEAL或是HLA)、PE文件头或线程数据块。

帮助:此文件中包含了关于理解和使用 OllyDbg 的必要的信息。如果您还有 Windows API 帮助文件的话(由于版权的问题 win32.hlp 没有包括在内),您可以将它挂在 OllyDbg 中,这样就可以快速获得系统函数的相关帮助。

启动:您可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到OllyDbg中,或者重新启动上一个被调试程序,或是挂接[Attach]一个正在运行的程序。OllyDbg支持即时调试。OllyDbg根本不需要安装,可直接在软盘中运行!

调试DLLs:您可以利用OllyDbg调试标准动态链接库 (DLLs)。OllyDbg 会自动运行一个可执行程序。这个程序会加载链接库,并允许您调用链接库的输出函数。

源码级调试: OllyDbg 可以识别所有 Borland 和 Microsoft 格式的调试信息。这些信息包括源代码、函数名、标签、全局变量、静态变量。有限度的支持动态(栈)变量和结构。

代码高亮: OllyDbg 的反汇编器可以高亮不同类型的指令(如:跳转、条件跳转、入栈、出栈、调用、返回、特殊的或是无效的指令)和不同的操作数(常规[general]、 FPU/SSE、段/系统寄存器、在栈或内存中的操作数,常量)。您可以定制个性化高亮方案。

线程: OllyDbg 可以调试多线程程序。因此您可以在多个线程之间转换,挂起、恢复、终止线程或是改变线程优先级。并且线程窗口将会显示每个线程的错误(就像调用 GETLASTERROR 返回一样)。

分析:OllyDbg 的最大特点之一就是分析。它会分析函数过程、循环语句、选择语句、表[tables]、常量、代码中的字符串、欺骗性指令[tricky constructs]、API调用、函数中参数的数目,import表等等。. 这些分析增加了二进制代码的可读性,减少了出错的可能性,使得我们的调试工作更加容易。

函数调用: OllyDbg 可以在没有调试信息或函数过程使用非标准的开始部分[prolog]和结尾部分[epilog]的情况下,对递归调用进行回溯。

栈:在栈窗口中,OllyDbg 能智能识别返回地址和栈框架[Stack Frames]。并会留下一些先前的调用。如果程序停在已知函数上,堆栈窗口将会对其参数进行分析解码。

SEH 链:跟踪栈并显示结构化异常句柄链。全部链会显示在一个单独的窗口中。

搜索:方法真是太多了!可精确、模糊搜索命令或命令序列,搜索常数,搜索二进制、文本字符串,搜索全部命令地址,搜索全部常量或地址域[address range],搜索所有能跳到选定地址的跳转,搜索所有调用和被调用的函数,搜索所有参考字符串,在不同模块中搜索所有调用、搜索函数名称,在全部已分配的内存中搜索二进制序列。如果搜索到多个结果,您可以对其进行快速操作。

窗口:OllyDbg 能够列出关于调试程序中的各种窗口,并且可以在窗口、类甚至选定的消息上设置断点。资源:如果 Windows API 函数使用了参考资源串,OllyDbg 可以显示它。其支持显示的类型仅限于附带资源[attached resources]的列表、数据显示及二进制编辑、。

断点: OllyDbg 支持各种断点:一般断点、条件断点、记录断点(比如记录函数参数到记录窗口)、内存读写断点、硬件断点(只适用于ME/NT/2000)等。在Hit跟踪情况下,可以在模块的每条命令上都设置INT3断点。在使用500-MHZ处理器的 Windows NT 中,OllyDbg 每秒可以处理高达 5000 个中断。

监视与监察器:每个监视都是一个表达式并能实时显示表达式的值。您可以使用寄存器、常数、地址表达式、布尔值以及任何复杂代数运算,您还可以比较ASCII和UNICODE 字符串。监察器[inspectors]是一种包含了两个的索引序列的监视[Watches],它以二维表的形式呈现

Heap walk.:在基于Win95的系统中,OllyDbg 可以列出所有的已分配的堆。

句柄:在基于NT的系统中,OllyDbg 可列出被调试程序的所有系统句柄。

执行:.您可以单步执行、步入子程序或者步过子程序。您也可以执行程序直到函数返回时、执行到指定地址处,还可以自动执行。当程序运行时,您仍然可以操纵程序并能够查看内存、设置断点甚至修改代码。您也可以任意的暂停或重启被调试的程序。

Hit跟踪:.Hit跟踪可以显示出目前已执行的指令或函数过程,帮助您检验代码的各个分支。Hit跟踪会在指定指令到达之前设置断点,而在这个指令执行后,会把这个断点清除掉。

Run 跟踪: Run跟踪可以单步执行程序,它会在一个很大的循环缓冲区中模拟运行程序。这个模拟器包含了除了SSE指令集以外的所以寄存器、标志、线程错误、消息、已经函数的参数。您可以保存命令,这样可以非常方便地调试自修改代码(译者注:比如加壳程序)。您可以设置条件中断,条件包括地址范围、表达式、命令。

插件:您可以把自己的插件添加到 OllyDbg 中,以增加新的功能。OllyDbg 的插件能够访问几乎所有重要的数据的结构、能够在 OllyDbg 的窗口中添加菜单和快捷键,能够使用100个以上的插件API函数。插件API函数有详细的说明文档。默认安装已经包含了两个插件:命令行插件和书签插件。

UDD:OllyDbg 把所有程序或模块相关的信息保存至单独的文件中,并在模块重新加载时继续使用。这些信息包括了标签、注释、断点、监视、分析数据、条件等等

快键键:
F2:设置断点,只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点。(相当于 SoftICE 中的 F9)

F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。(相当于 SoftICE 中的 F10)

F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。(相当于 SoftICE 中的 F8)

F4:运行到选定位置。作用就是直接运行到光标所在位置处暂停。(相当于 SoftICE 中的 F7)

F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。(相当于 SoftICE 中的 F5)

CTR+F9:执行到返回。此命令在执行到一个 ret (返回指令)指令时暂停,常用于从系统领空返回到我们调试的程序领空。(相当于 SoftICE 中的 F12)

ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。(相当于 SoftICE 中的 F11)上面提到的几个快捷键对于一般的调试基本上已够用了。要开始调试只需设置好断点,找到你感兴趣的代码段再按 F8 或 F7 键来一条条分析指令功能就可以了。

案例

第一步:我们通过调试一个简单的HelloWorld程序来熟悉OllyDBG的使用,程序很简单,只有几行代码

#include <Windows.h>
int main()
{
MessageBoxA(NULL,"Hello World","第一个Win32程序",0); 
return 0;
}

第二步:加载可执行程序有多种方案:
1>使用快捷键F3选择所要调试的程序路径
2>在菜单选项中(文件\打开)选择调试程序路径
3>将OllyDBG加入系统资源管理菜单中,右击“用OllyDbg打开”
(注:依次选择OllyDBG菜单\选项\添加到浏览器\添加OllyDBG到系统资源管理菜单\完成,即可将OllyDBG加入系统资源管理菜单中。)
第三步:点击运行按钮:

调试技巧总结:

1.F2下断点Alt+b打开断点编辑器,可编辑所有下过的断点,空格键可快速切换断点状态
2.当位于某个CALL中,这时想返回到调用这个CALL的地方时,可以按“Ctrl+F9”快捷键执行返回功能。这样OD就会停在遇到的第一个返回命令(如RET、RETF或IRET)。
3.如果跟进系统DLL提供的API函数中,此时想返回到应用程序领空里,可以按快捷键“Alt+F9”执行返回到用户代码命令。
4.所谓领空,实际上就是指在某一时刻,CPU执行的指令所在的某段代码的所有者。
5.如004013F7这类地址一般是可执行文件领空,7C8114AB这类大地址一般是系统DLL所在的地址空间。
6.程序通常读取文本框内容的字符串用的是以下两个函数:
GetDlgItemTextA(GetDlgItemTextW) GetWindowTextA(GetWindowTextW)
7.一般我们要结合经验通过猜测的方式多尝试几遍设陷阱,找出相关的函数。
8.按“Ctrl+G”键打开跟随表达式的窗口。
9.也可以通过“Ctrl+N”键打开应用程序的导入表(输入表),然后查看应用程序总共导入了哪些函数来以此推断需要在哪里挖坑下陷阱!
10.关于返回值,汇编代码的返回值约定是存放在eax这个寄存器里边的,如果32位的eax不够存放返回值,系统会将返回值放在内存某个位置并把该位置的地址放在eax返回。

posted @ 2021-04-07 10:31  菜鸟-传奇  阅读(509)  评论(0编辑  收藏  举报