OllyDBG新手使用说明书(5)

2018-12-19 21:44

CPU

寄存器[Registers] 栈[Stack]

分析1[Analysis 1] 分析2[Analysis 2] 分析3[Analysis 3]

即时调试[Just-in-time debugging] 添加到资源管理器[Add to Explorer] 十八,搜索[Search]

OllyDbg 允许您使用以下的搜索方式:

符号名(标签)[Symbolic name (label)] 黑吧串[binary string] 常量[constant] 命令[command]

命令序列[sequence of commands] 模块间调用[intermodular calls]

修改过的命令或数据[modified command or data] 自定义标签[user-defined label] 自定义注释[user-defined comment 文本字符串[text string]

Run跟踪的记录[record in run trace] 参考命令[referencing commands]

十九,自解压文件[Self-extracting (SFX) files]

自解压文件由提取程序和压缩的原程序两部分组成。当遇到自解压文件(SFX)文件时,我们通常希望跳过解

压部分,而直接跳到原始程序的入口(真正的入口)。 OllyDbg 包含了几个便于完成这一任务的功能。

通常提取程序的加载地址都在执行代码之外。在这种情况下,OllyDbg 将这类文件均视作为自解压文件(SFX)。 当自解压选项[SFX options]要求跟踪真正入口时,OllyDbg 在整个代码节[Code section]设置内存断点,最初这里是空的,或者只包含压缩数据。当程序试图执行某个在这个保护区域的命令,而这些命令不是 RET和 JMP 时,OllyDbg 会报告真正的入口。这就是提取工作的原理。

上面的方法非常慢。有另外一种比较快的方法。每次读取数据发生异常时,OllyDbg 使这个4K内存区域变为可读,而使原先可读的区域变为无效。而每次发生写数据异常时, OllyDbg 使这个区域变为可写,而使原先可写的区域变为无效。当程序执行在保留的保护区域中的指令时, OllyDbg 报告真正的入口。但是,当真正的入口点在可读或可写区域内部时,报告的地址就可能有误。您可以纠正入口位置,选择新的入口,从反汇编窗口的快捷菜单中选择“断点[Breakpoint]|设置真正的自解压入口[Set real SFX entry here]”。如果相应的SFX选项是开启的,OllyDbg下次可以迅速而可靠的跳过自提取程序。 注意:OllyDbg 在跟踪采取了保护或者反调试技术的解压程序时通常会失败。

OLLYDBG完全教程(十四)

二十、单步执行与自动执行[Step-by-step execution and animation]

您可以通过按 F7(单步步入)或 F8(单步步过),对程序进行单步调试。这两个单步执行操作的主要区别在于:如果当前的命令是一个子函数,按F7,将会进入子函数,并停在子函数的第一条命令上;而按 F8,将会一次运行完这个子函数。如果您单步步过的子函数中含有断点或其他调试事件,执行将会被暂停,但 OllyDbg会在子函数的后一条命令上,自动下一个断点,而这个断点您迟早会碰到。

如果被调试程序停在异常上,您可以跳过它,并转到被调试程序建立的句柄处。只需简单的 Shift 键和任何一个单步命令。 如果需要连续按F7、F8键上百次,您可以使用自动执行(Ctrl+F7或者Ctrl+F8)功能。在这种情况下,OllyDbg 将自动重复F7或者F8操作,并且实时更新所有的窗口。这个过程会在下面情况停止: - 按 Esc 键或发出任何单步命令 - OllyDbg 遇到断点 - 被调试程序发生异常

使用“+”和“-”按键,可以回朔以前的执行历史[execution history]。 注意:当执行停止时 OllyDbg 将会刷新大部分窗口。如果动态执行过程非常慢,可以尝试关掉或最小化没有用的窗口。

另外,更快捷的找到以前执行指令的办法是Run跟踪[run trace]。它将创建一个执行协议并告知您指定指令的执行时间和次数。 二十一、Hit跟踪[Hit trace]

Hit跟踪能够让您辨别哪一部分代码执行了,哪一部分没有。OllyDbg的实现方法相当简单。它将选中区域的每一条命令处均设置一个INT3断点。当中断发生的时候,OllyDbg便把它去除掉,并把该命令标志为命中[hit]。因为每个跟踪断点只执行一次,所以这种方法速度非常快。 在使用Hit跟踪的时候,一定要注意不能在数据中设置断点,否则应用程序极有可能崩溃。因此,您必须打开相关的菜单选项,以进行代码分析[analyze]。我推荐您选择严格或启发式函数识别[strict or heuristical procedure recognition]。如果选择模糊[Fuzzy]的话,可能会产生很多难以容忍的错误,而且经常把本不是函数的代码段识别成函数。

只要您在模块中设置了跟踪断点,哪怕只设了一个,OllyDbg都会分配两倍于代码段大小的缓冲区。

注意:当您退出Hit跟踪的时候,Run跟踪也会同时退出。 Run 跟踪[Run trace]

Run跟踪是一种反方向跟踪程序执行的方式,可以了解以前发生的事件。您还可以使用Run跟踪来了解运行的简单统计[profile]。基本上, OllyDbg 是一步一步地执行被调试程序的,就像动画[animation]演示一样,但不会实时刷新窗口,最重要的是它能将地址、寄存器的内容、消息以及已知的操作数记录到Run跟踪缓冲区中。如果被调试的代码是自修改的,您就能够保存原始的命令。可以通过按Ctrl+F11(Run跟踪步入,进入子函数)或者 Ctrl+F12(Run跟踪步过,一次执行完子函数)开始Run跟踪,并用F12或者Esc键停止跟踪。 您可以指定在Run跟踪时执行每一步的条件集(快捷键:Ctrl+T)。如果条件符合,Run跟踪将暂停。条件包括:

1.当EIP在某个地址范围内时暂停[Pause when EIP is in the address range]; 2.当EIP在某个地址范围之外时暂停[Pause when EIP is outside the address range];

3.当某个条件为真时暂停[Pause when some condition is true];

4.当下一条指令可疑时暂停[Pause when next command is suspicious],比如:可能为非法指令(根据在分析3[Analysis 3]中设定的规则而定),访问不存在的内存,设置了单步陷阱标志[single-step trap flag]或者越ESP界访问栈。注意这个选项会明显地(大约20%)减慢Run跟踪的速度; 5.当命令执行达到指定的次数(更确切的说,是添加到Run跟踪的缓冲区里面的命令数量)时暂停[Pauseafter specified number of commands is traced]。注意计数器不能自动归零。也就是说,如果您设置指令

次数为10,则在第10次执行到该命令时暂停,并不是该命令每执行10次就暂停一次。

6.当下一条命令符合指定的样式之一时暂停[Pause when next command matches one of the specified patterns]。您可以使用模糊命令和操作数[imprecise commands and operands]及匹配32位寄存器RA和RB,像R32一样,这两个寄存器可以替代任何通用32位寄存器,但是在同一条命令中其值是不能变的。而 RA 和RB在同一条命令中,则一定是不同的。例如,在程序中含有 XOR EAX,EAX; XOR ESI,EDX 两条命令,两条命令均符合样式 XOR R32,R32;第一条命令符合样式XOR RA,RA;而等二条命令 XOR ESI,EDX 符合样式XOR RA,RB。

毫无疑问,Run跟踪需要足够的内存,每条命令平均需要占用16到35字节,同时速度也非常慢。在500-MHZ处理器、Windows NT环境下,它每秒能跟踪5000条指令。

Windows95更慢:每秒钟仅2200条指令。但是在许多情况下,例如当一个程序跳转到不存在的地址的时候,这是找到原因的唯一方法。您可以在Run 跟踪时将准线性命令序列(即序列尾部只有唯一出口)跳过。当OllyDbg遇到这些需跳过的命令序列时,会设置一个临时断点,然后跟进到序列中,并一次运行完。当然了,如果排除命令中返回或跳转的地址在跟踪范围之外,将可能导致跟踪发生错误;因此OllyDbg会检查您想跳过的代码块,如果存在上述情况,会向您询问。 在大多数情况下,您对跟踪系统API代码不感兴趣。跟踪选项总是跟过系统DLL[Always trace over system DLLs]允许您在 跟踪/自动模式下跟过API函数。如果模块在系统目录下,OllyDbg就假设该模块是系统的。您可以在模块[Modules]窗口中标记任意DLL是系统的或者非系统的。 为了使执行速度更快,您可以通过设置Run跟踪断点,先将Run跟踪限制在选定的命令或代码块上,然后再运行程序。我把这种做法称作“强迫Run跟踪”。一般来说,删除Run跟踪断点不会移除Hit跟踪断点。但如果您删除了hit跟踪断点,同时您也移除了Run跟踪断点。

跟踪命令会保存到跟踪缓冲区中,这个缓冲区在跟踪开始时自动创建。您可以在选项中指定它的大小(最高64MB)。这个缓冲区是循环队列,当满了的时候,会丢弃老的记录。

您可以通过从OllyDbg主菜单中选择“调试[Debug]|打开或者清除Run跟踪[Open or clear run trace]”,来打开或者清除Run跟踪缓冲区。在Run跟踪缓冲区打开后, OllyDbg 会记录在执行过程中的所有暂停,甚至那些不是由Run跟踪引起的暂停。例如,您可以通过按 F7 或者 F8 单步执行程序,然后通

过使用+键和-键来反方向跟踪程序的执行。注意:如果Run跟踪缓冲区已经关闭 ,则用这些键浏览的是历史[history]记录。在您查看Run跟踪记录时,寄存器和信息面板会变灰,来强调它们所显示的寄存器并不是实际的寄存器。跟踪缓冲区并不保存栈顶或由寄存器所指向的内容。寄存器、信息和栈在Run跟踪的时候使用实际的内存状态来解释寄存器的变化。

OllyDbg能够记下每个指令在Run跟踪缓冲区里面出现的次数。在反汇编窗口快捷菜单中,选择是“查看[View]|统计作为注释[Profile as comments]”。这个命令使用统计取代了注释栏。或者,如果列标题栏可见,则可以单击它几次直到它显示统计信息。注意显示出来的数字是动态的,而且不计算已经从跟踪缓冲区中丢弃的指令。您还可以在单独的统计窗口[Profile window]中,按触发次数排序,来查看整个模块的统计数据。

在反汇编窗口的快捷菜单中选择“Run跟踪[Run trace]|添加到所有函数入口处[Add entries of allprocedures]”,这样能够检查每个可识别的函数被调用的次数。另一个命令“Run跟踪[Run trace]|添加到函数中所有的分支[Add branches in procedure]”会强行跟踪此函数中所有识别的跳转目的地址的内容。在这种情况下,统计功能能够找到最频繁执行的分支,您可以优化这部分的代码,以提高速度。

在反汇编窗口中的某条命令上使用快捷菜单中选择“搜索[Search for]|Run跟踪的最新记录[Last record in run trace]”用于查找该命令是否被执行过,如果执行过,最后一次执行在哪里。

Run跟踪窗口显示跟踪缓冲区的内容。对每个指令来说包括被指令改变的整数寄存器的内容(更准确的说是给定的记录变成下一条记录的变化)。如果您双击某条指令,窗口会选择在跟踪缓冲区里全部含有该命令的记录,而且您可以通过按+和-键来快速的浏览;如果您在调试选项[Debugging options]中设置了 “跟踪[Trace]|同步CPU和Run跟踪[Synchronize CPU and Run trace]”,双击记录则会跟进到对应的反汇编窗口中位置。

注意:当您退出Hit跟踪时,您同时也强行退出了Run跟踪。 通用快捷键[Global shortcuts]无论当前的OllyDbg窗口是什么,这些快捷键均有效:

Ctrl+F2 - 重启程序,即重新启动被调试程序。如果当前没有调试的程序,OllyDbg会运行历史列表[history list]中的第一个程序。程序重启后,将会删除所有内存断点和硬件断点。

译者注:从实际使用效果看,硬件断点在程序重启后并没有移除。 Alt+F2 - 关闭,即关闭被调试程序。如果程序仍在运行,会弹出一个提示信息,询问您是否要关闭程序。

F3 - 弹出“打开32位.EXE文件”对话框[Open 32-bit .EXE file],您可以选择可执行文件,并可以输入运行参数。

Alt+F5 - 让OllyDbg总在最前面。如果被调试程序在某个断点处发生中断,而这时调试程序弹出一个总在最前面的窗口(一般为模式消息或模式对话框[modal message or dialog]),它可能会遮住OllyDbg的一部分,但是我们又不能移动最小化这个窗口。激活OllyDbg(比如按任务栏上的标签)并按Alt+ F5,OllyDbg将设置成总在最前面,会反过来遮住刚才那个窗口。如果您再按一下Alt+F5,OllyDbg会恢复到正常状态。OllyDbg是否处于总在最前面状态,将会保存,在下一次调试时依然有效。当前是否处于总在最前面状态,会显示在状态栏中。

F7 - 单步步入到下一条命令,如果当前命令是一个函数[Call],则会停在这个函数体的第一条命令上。如果当前命令是是含有REP前缀,则只执行一次重复操作。 Shift+F7 - 与F7相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步入被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。 Ctrl+F7 - 自动步入,在所有的函数调用中一条一条地执行命令(就像您按住F7键不放一样,只是更快一些)。当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步入过程都会停止。每次单步步入,OllyDbg都会更新所有的窗口。所以为了提高自动步入的速度,请您关闭不必要成窗口,对于保留的窗口最好尽量的小。按Esc键,可以停止自动步入。

F8 - 单步步过到下一条命令。如果当前命令是一个函数,则一次执行完这个函数(除非这个函数内部包含断点,或发生了异常)。如果当前命令是含有REP前缀,则会执行完重复操作,并停在下一条命令上。 Shift+F8 - 与F8相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步过被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。 Ctrl+F8 - 自动步过,一条一条的执行命令,但并不进入函数调用内部(就像您按住F8键不放一样,只是更快一些)。当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步过过程都会停止。每次单步步过,OllyDbg都会更新所有的窗口。所以为了提高自动步过的速度,请您关闭不必要成窗口,对于保留的窗口最好尽量的小。按Esc键,可以停止自动步过。 F9 - 让程序继续执行。 Shift+F9 - 与F9相同,但是如果被调试程序发生异常而中止,调试器会首先尝试执行被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。 Ctrl+F9 - 执行直到返回,跟踪程序直到遇到返回,在此期间不进入子函数也不更新CPU数据。因为程序是一条一条命令执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。

Alt+F9 - 执行直到返回到用户代码段,跟踪程序直到指令所属于的模块不在系统目录中,在此期间不进入子函数也不更新CPU数据。因为程序是一条一条执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。

Ctrl+F11 -Run跟踪步入,一条一条执行命令,进入每个子函数调用,并把寄存器的信息加入到Run跟踪的存储数据中。Run跟踪不会同步更新CPU窗口。 F12 - 停止程序执行,同时暂停被调试程序的所有线程。请不要手动恢复线程运行,最好使用继续执行快捷键或菜单选项(像 F9)。

Ctrl+F12 - Run跟踪 步过,一条一条执行命令,但是不进入子函数调用,,并把寄存器的信息加入到Run跟踪的存储数据中。Run跟踪不会同步更新CPU窗口。 Esc - 如果当前处于自动运行或跟踪状态,则停止自动运行或跟踪;如果CPU显示的是跟踪数据,则显示真实数据。

Alt+B - 显示断点窗口。在这个窗口中,您可以编辑、删除、或跟进到断点处。 Alt+C - 显示CPU窗口。

Alt+E - 显示模块列表[list of modules]。 Alt+K - 显示调用栈[Call stack]窗口。 Alt+L - 显示日志窗口。 Alt+M - 显示内存窗口。

Alt+O - 显示选项对话框[Options dialog]


OllyDBG新手使用说明书(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:声屏障施工技术交底

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: