OllyDbg学习入门完全教学教材(完美排版~).doc

上传人:小** 文档编号:2081469 上传时间:2019-04-18 格式:DOC 页数:43 大小:1.49MB
下载 相关 举报
OllyDbg学习入门完全教学教材(完美排版~).doc_第1页
第1页 / 共43页
OllyDbg学习入门完全教学教材(完美排版~).doc_第2页
第2页 / 共43页
OllyDbg学习入门完全教学教材(完美排版~).doc_第3页
第3页 / 共43页
OllyDbg学习入门完全教学教材(完美排版~).doc_第4页
第4页 / 共43页
OllyDbg学习入门完全教学教材(完美排版~).doc_第5页
第5页 / 共43页
点击查看更多>>
资源描述

1、#*OllyDbg完全教程目录第一章 概述 .1第二章 组件 .5一、一般原理General prnciples .5二、反汇编器Disassembler .8三、分析器Analysis .9四、Object 扫描器Object scanner .12五、Implib 扫描器 Implib scanner .12第三章 OllyDbg 的使用 .13一、如何开始调试How to start debugging session .13二、CPU 窗口CPU window .14三、断点Breakpoints .14四、数据窗口Dump .15五、可执行模块窗口Executable modules

2、 window .16六、内存映射窗口Memory map window .17七、监视与监察器Watches and inspectors .19八、线程Threads .19九、调用栈Call stack .20十、调用树Call tree .21十一、选项Options .21十二、搜索Search .22十三、自解压文件Self extracting (SFX) files .22十四、单步执行与自动执行Stepby step execution and animation .23十五、Hit 跟踪Hit trace .23十六、Run 跟踪Run trace .24十七、 快捷键 .

3、26十八、插件Plugins .29十九、技巧提示Tips and tricks .29第四章 其他功能 .30一、调试独立的 DLLDebugging of stand alone DLLs .30二、解码提示Decoding hints .32三、表达式赋值Evaluation of expressions .32四、自定义函数描述Custom function descriptions .341第一章 概述OllyDbg 是一种具有可视化界面的 32 位汇编分析调试器。它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。Version 1.10 是最终的发布

4、版本。 这个工程已经停止,我不再继续支持这个软件了。但不用担心:全新打造的 OllyDbg2.00 不久就会面世!运行环境:OllyDbg 可以以在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP(未经完全测试)操作系统中工作,但我们强烈建议你采用 300MHz 以上的奔腾处理器以达到最佳效果。还有,OllyDbg 是极占内存的,因此如果你需要使用诸如追踪调试Trace 之类的扩展功能话,建议你最好使用 128MB 以上的内存。支持的处理器:OllyDbg 支持所有 80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE 指令集以及相关的数据格式,但是

5、不支持 SSE2 指令集。配置: 有多达百余个选项用来设置 OllyDbg 的外观和运行。数据格式:OllyDbg 的数据窗口能够显示的所有数据格式:HEX、 ASCII、UNICODE、 16/32 位有/ 无符号/HEX 整数、32/64/80 位浮点数、地址、反汇编(MASM、IDEAL 或是 HLA) 、PE 文件头或线程数据块。帮助: 此文件中包含了关于理解和使用 OllyDbg 的必要的信息。如果你还有 Windows API 帮助文件的话(由于版权的问题 win32.hlp 没有包括在内) ,你可以将它挂在OllyDbg 中,这样就可以快速获得系统函数的相关帮助。启动: 你可以采

6、用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到 OllyDbg 中,或者重新启动上一个被调试程序,或是挂接Attach一个正在运行的程序。OllyDbg 支持即时调试。OllyDbg 根本不需要安装,可直接在软盘中运行! 调试 DLLs: 你可以利用 OllyDbg 调试标准动态链接库 (DLLs)。OllyDbg 会自动运行一个可执行程序。这个程序会加载链接库,并允许你调用链接库的输出函数。源码级调试:OllyDbg 可以识别所有 Borland 和 Microsoft 格式的调试信息。这些信息包括源代码、函数名、标签、全局变量、静态变量。有限度的支持动态(栈)变量和结构。代

7、码高亮:OllyDbg 的反汇编器可以高亮不同类型的指令(如:跳转、条件跳转、入栈、出栈、调用、返回、特殊的或是无效的指令)和不同的操作数(常规general 、FPU/SSE、段/ 系统寄存器、在栈或内存中的操作数,常量) 。你可以定制个性化高亮方案。线程:OllyDbg 可以调试多线程程序。因此你可以在多个线程之间转换,挂起、恢复、终止线程或是改变线程优先级。并且线程窗口将会显示每个线程的错误(就像调用 GETLASTERROR 返回一样) 。分析:OllyDbg 的最大特点之一就是分析。它会分析函数过程、循环语句、选择语句、表tables 、常量、代码中的字符串、欺骗性指令tricky

8、constructs 、API 调用、函数中参数的数目,import 表等等。这些分析增加了二进制代码的可读性,减少了出错的可能性,2使得我们的调试工作更加容易。Object 扫描:OllyDbg 可以扫描 Object 文件/库(包括 OMF 和 COFF 格式) ,解压代码段code segments并且对其位置进行定向。Implib 扫描: 由于一些 DLL 文件的输出函数使用的索引号,对于人来说,这些索引号没有实际含义。如果你有与 DLL 相应的输入库import library ,OllyDbg 就可以将序号转换成符号名称。完全支持 Unicode: 几乎所有支持 ASCII 的操作

9、同时也支持 UNICODE,反之亦然。名称:OllyDbg 可以根据 Borland 和 Microsoft 格式的调试信息,显示输入 /输出符号及名称。Object 扫描器可以识别库函数。其中的名称和注释你可任意添加。如果 DLL 中的某些函数是通过索引号输出的,则你可通过挂接输入库import library来恢复原来的函数名称。不仅如此,OllyDbg 还能识别大量的常量符号名(如:窗口消息、错误代码、位域bit fields )并能够解码为已知的函数调用。已知函数:OllyDbg 可以识别 2300 多个 C 和 Windows API 中的常用函数及其使用的参数。你可以添加描述信息、

10、预定义解码。你还可以在已知函数设定 Log 断点并可以对参数进行记录。函数调用:OllyDbg 可以在没有调试信息或函数过程使用非标准的开始部分prolog和结尾部分epilog的情况下,对递归调用进行回溯。译者注:004010D0 push ebp 004010D1 mov ebp,esp |004010D3 sub esp,10h |prolog004010D6 push ebx |004010D7 push esi |004010D8 push edi /004010C5 pop edi 004010C6 pop esi |004010C7 pop ebx |epilog004010C8

11、 mov esp,ebp |004010CA pop ebp |004010CB ret /栈:在栈窗口中,OllyDbg 能智能识别返回地址和栈框架 Stack Frames 。并会留下一些先前的调用。如果程序停在已知函数上,堆栈窗口将会对其参数进行分析解码。译者注:栈框架Stack Frames是指一个内存区域,用于存放函数参数和局部变量。SEH 链: 跟踪栈并显示结构化异常句柄链。全部链会显示在一个单独的窗口中。搜索:方法真是太多了!可精确、模糊搜索命令或命令序列,搜索常数,搜索二进制、文本字符串,搜索全部命令地址,搜索全部常量或地址域address range ,搜索所有能跳到选定地址

12、的跳转,搜索所有调用和被调用的函数,搜索所有参考字符串,在不同模块中3搜索所有调用、搜索函数名称,在全部已分配的内存中搜索二进制序列。如果搜索到多个结果,你可以对其进行快速操作。窗口:OllyDbg 能够列出关于调试程序中的各种窗口,并且可以在窗口、类甚至选定的消息上设置断点。 资源:如果 Windows API 函数使用了参考资源串,OllyDbg 可以显示它。其支持显示的类型仅限于附带资源attached resources的列表、数据显示及二进制编辑。断点:OllyDbg 支持各种断点:一般断点、条件断点、记录断点(比如记录函数参数到记录窗口) 、内存读写断点、硬件断点(只适用于 ME/

13、NT/2000)等。在 Hit 跟踪情况下,可以在模块的每条命令上都设置 INT3 断点。在使用 500MHZ 处理器的 Windows NT 中,OllyDbg 每秒可以处理高达 5000 个中断。 监视与监察器:每个监视都是一个表达式并能实时显示表达式的值。你可以使用寄存器、常数、地址表达式、布尔值以及任何复杂代数运算,你还可以比较 ASCII 和UNICODE 字符串。监察器inspectors是一种包含了两个的索引序列的监视Watches ,它以二维表的形式呈现,可以对数组和结构进行解码分析。 Heap walk.:在基于 Win95 的系统中,OllyDbg 可以列出所有的已分配的堆

14、。句柄:在基于 NT 的系统中, OllyDbg 可列出被调试程序的所有系统句柄。执行:.你可以单步执行、步入子程序或者步过子程序。你也可以执行程序直到函数返回时、执行到指定地址处,还可以自动执行。当程序运行时,你仍然可以操纵程序并能够查看内存、设置断点甚至修改代码。你也可以任意的暂停或重启被调试的程序。Hit 跟踪:.Hit 跟踪可以显示出目前已执行的指令或函数过程,帮助你检验代码的各个分支。Hit 跟踪会在指定指令到达之前设置断点,而在这个指令执行后,会把这个断点清除掉。 译者注:Hit 在英文中是 “击中”的意思,指令如果运行了就表示这个指令被“击中”了,没有执行的指令就是“未击中”,这

15、样我们就很容易看出被调试程序哪些部分运行了,而哪些没有运行。Run 跟踪: Run 跟踪可以单步执行程序,它会在一个很大的循环缓冲区中模拟运行程序。这个模拟器包含了除了 SSE 指令集以外的所以寄存器、标志、线程错误、消息、已经函数的参数。你可以保存命令,这样可以非常方便地调试自修改代码(译者注:比如加壳程序) 。你可以设置条件中断,条件包括地址范围、表达式、命令。你可以将 Run 跟踪信息保存到一个文件中,这样就可以对比两次运行的差别。Run 跟踪可以回溯分析已执行过的上百万条命令的各种细节。统计: 统计Profiler可以在跟踪时计算某些指令出现的次数。因此你就能了解代码的哪一部分被频繁执

16、行。补丁:内置汇编器能够自动找到修改过的代码段。二进制编辑器则会以ASCII、 UNICODE 或者十六进制的形式同步显示修改后的数据。修改后的数据同其它数据一样,能够进行复制粘贴操作。原来的数据会自动备份,以便数据恢复时使用。你可以把修改的部分直接复制到执行文件中,OllyDbg 会自动修正。 OllyDbg 还会记录以前调试过程中使用的所有补丁。你可以通过空格键实现补丁的激活或者禁止。自解压文件: 当调试自解压文件时,你往往希望跳过解压部分,直接停在程序的原始4入口点。OllyDbg 的自解压跟踪将会使你实现这一目的。如果是加保护的自解压段,自解压跟踪往往会失败。而一旦 OllyDbg 找

17、到了入口点,它将会跳过解压部分,并准确的到达入口点。插件:你可以把自己的插件添加到 OllyDbg 中,以增加新的功能。OllyDbg 的插件能够访问几乎所有重要的数据的结构、能够在 OllyDbg 的窗口中添加菜单和快捷键,能够使用 100 个以上的插件 API 函数。插件 API 函数有详细的说明文档。默认安装已经包含了两个插件:命令行插件和书签插件。 UDD:OllyDbg 把所有程序或模块相关的信息保存至单独的文件中,并在模块重新加载时继续使用。这些信息包括了标签、注释、断点、监视、分析数据、条件等等更多:这里介绍的功能,仅仅是 OllyDbg 的部分功能。因为其具有如此丰富的功能,以

18、至于 OllyDbg 能成为非常方便的调试器! 5第二章 组件一、一般原理General prnciples我希望你能对 80x86 系列处理器的内部结构有所了解,同时具有一定的编写汇编程序的能力。对于 Microsoft Windows 方面的知识,你也要熟悉。OllyDbg 是运行在 Windows 95、Windows 98、Windows ME、Windows NT 和 Windows 2000 系统下的一个单进程、多线程的分析代码级调试工具。它可以调试 PE 格式的执行文件及动态链接库,并可以对其打补丁。 “代码级”意味着你可以直接与比特、字节或处理器指令打交道。OllyDbg 仅使

19、用已公开的 Win32 API 函数,因此它可以在所有 Windows 操作系统及后继版本中使用。但是由于我没有对 XP 系统进行彻底测试,因此不能保证 OllyDbg 功能的充分发挥。注意:OllyDbg 不支持对 .NET 程序的调试。OllyDbg 不是面向编译器的。它没有特别的规则规定必须是哪一个编译器产生的代码。因此,OllyDbg 可以非常好的处理通过编译器生成的代码,或是直接用汇编写入的代码。OllyDbg 可以并行调试程序。你无须暂停执行程序,就可以浏览代码和数据,设置断点、停止或恢复线程,甚至直接修改内存。 (这可以视为一种软件调试的模式,与之相对的硬件模式则是当进程在运行时

20、调试器被阻滞,反之亦然) 。假使所需的操作比较复杂,OllyDbg 会让进程终止一小段时间,但是这种暂停对于用户来说是透明的。有时进程会发生非法操作。你可以把 OllyDbg 设置成即时justin time调试器,它会挂接出错程序,并停在程序产生异常的地方。通过 OllyDbg,你可以调试单独的 DLLstandalone DLLs文件。操作系统不能直接运行 DLL 文件,因此 OllyDbg 将一个可以加载 DLL 的小程序压缩到资源里,这个程序允许你调用最多 10 个参数的输出函数。OllyDbg 是完全面向模块moduleoriented 的。模块Module包括可执行文件(扩展名通常

21、为.EXE )和在启动时加载或需要时动态加载的动态链接库(扩展名通常为.DLL) 。在调试期间,你可以设置断点breakpoints 、定义新的标签 labels 、注释comment汇编指令,当某个模块从内存中卸载unload时,调试器会把这些信息保存在文件中,文件名就是模块的名称,扩展名为.UDD(表示 用户自定义文件User Defined Data )当 OllyDbg 下一次加载该模块时,它会自动恢复所有的调试信息,而不管是哪一个程序使用这个模块。假设你正在调试程序 Myprog1,这个程序使用了 Mydll。你在 Mydll 中设置了一些断点,然后你开始调试 Myprog2,这个程

22、序同样使用了 Mydll。这时你会发现,所有 Mydll 中的断点依然存在,即使 Mydll 加载到不同的位置!一些调试器把被调试进程的内存当作一个单一的(并且大部分是空的)大小为 2 32字节的区域。OllyDbg 采用了与之不同的技术:在这里,内存由许多独立的块组成,任何对内存内容的操作都被限制在各自的块内。在大多数情况下,这种方式工作得很好并且方便了调试。但是,如果模块包含好几个可执行段executable sections ,你将不能一次看到全部代码,然而这种情况是非常少见的。OllyDbg 是一个很占用内存的程序memoryhungry application 。它在启动时就需要 3

23、 MB,并且当你第一次装载被调试的程序时还需要一到两兆的内存。每一次的分析、备份、6跟踪或者文件数据显示都需要占用一定的内存。因此当你调试一个很大的项目,发现程序管理器显示有 40 或 60 兆内存被占用时,请不要惊慌。 为了有效地调试一些不带源码的程序,你必须首先理解它是如何工作的。OllyDbg 包含的大量特性可以使这种理解变得非常容易。首先,OllyDbg 包含一个内置的代码分析器。分析器遍历整个代码,分出指令和数据,识别出不同的数据类型和过程,分析出标准 API 函数(最常用的大约有 1900 个)的参数并且试着猜出未知函数的参数数目。你也可以加入自己的函数说明your own fun

24、ction descriptions 。它标记出程序入口点和跳转目的地,识别出跳转表tabledriven switches和指向字符串的指针,加入一些注释,甚至标示出跳转的方向等等。在分析结果的基础上,调用树call tree显示哪些函数被指定过程调用(直接或间接)并且识别出递归调用、系统调用和叶子过程leaf procedures 。如果需要的话,你可以设置解码提示decoding hints来帮助分析器解析那些不明确的代码或数据。OllyDbg 还包含 Object 扫描器Object Scanner 。如果你有库文件libraries 或目标文件object files ,扫描器会在被

25、调试的程序中定位这些库函数。在全部函数调用中,对标准函数的调用占很重要的一部分(据我估计可达 70%) 。如果你知道正要被调用的函数的功能,你就不必把注意力集中在这个函数上,可以简单地单步步过step over这个call。分析器知道 400 多个标准 C 函数,比如 fopen 和 memcpy。然而我必须承认当前版本的 OllyDbg 不能定位很短的函数(比一个 return 命令多不了多少的)或相似的函数(只在重定位上有不同) 。Object 扫描器Object scanner也能够识别输入库 import libraries。如果某个 DLL 是按序号输出的,你不会看到函数名,只会发现

26、一堆无意义的神秘数字。这种DLL 的开发者通常会提供一个输入库来实现函数符号名与序号间的对应。让 OllyDbg 使用这个输入库,它就会恢复原始的函数符号名。面向对象的语言(如 C+) ,使用了一种叫做名称修饰name mangling的技术,把函数类型和参数都加入函数名中。OllyDbg 可以解码 demangle这种函数名,使程序更易读。译者注:C+的名称修饰是编译器将函数的名称转变成为一个唯一的字符串的过程,这个字符串会对函数的类、其命名空间、其参数表,以及其他等等进行编码。 C+的名称修饰适用于静态成员函数,也适用于非静态成员函数。静态函数的名称修饰的一个好处之一,是能够在不同的类里使

27、用同一个名称来声明两个或者更多的静态成员函数而不会发生名称上的冲突。OllyDbg 完全支持 UNICODE,几乎所有对 ASCII 字符串的操作都可以同样应用于 UNICODE。汇编指令都是很相似的。你经常会搞不清自己是不是已经跟踪过某一段代码。在OllyDbg 中你可以加入自己的标签labels和注释comments 。这些极大地方便了调试。注意一旦你注释了某个 DLL,以后每次加载这个 DLL 时,注释和标签都有效尽管你在调试不同的程序。OllyDbg 可以跟踪标准的栈帧stack frames (由 PUSH EBP; MOV EBP,ESP 所创建的)。现代编译器有禁止产生标准栈框架

28、的选项,在这种情况下分配栈stack walk是不可能的。当程序运行到已知的函数时,栈窗口stack window解析它的参数,调用栈Call stack窗口显示到达当前位置所调用函数的序列。7现代的面向对象应用程序广泛地使用了一种叫做结构化异常处理Structured Exception Handling,SHE的技术。SHE 窗口SEH window 可以显示异常处理链。多种不同的搜索search 选项可以让你找到二进制代码或数据、命令或命令序列、常量或字符串、符号名或在 Run 跟踪中的一条记录。对于任何地址或常量,OllyDbg 可以找出参考referencing到该地址或常量的全部命

29、令的列表。然后你可以在这个列表里找出对你来说是重要的参考。举例来说,某个函数可能被直接调用,或者经过编译器优化后把地址放入寄存器间接调用,或者把地址压入堆栈作为一个参数没问题,OllyDbg 会找出所有这样的地方。它甚至能找到并列出所有和某个指定的位置有关的跳转。OllyDbg 支持所有标准类型的断点breakpoints 非条件和条件断点、内存断点(写入或访问) 、硬件断点或在整个内存块上下断点(后两项功能只在 Window ME,NT,2000,XP 中有效) 。条件表达式可以非常复杂(“ 当 ESP+8 的第 2 位被设置,并且 123456 位置处的字word小于 10,或者 EAX

30、指向一个以“ABC”开头的 UNICODE 字串,但跳过前 10 次断点而在第 11 次中断”) 。你可以设定一条或多条指令,当程序暂停时由 OllyDbg 传递给插件插件plugins 。除了暂停,你还可以记录某个表达式的值(可以带有简短的说明) ,或者记录 OllyDbg 已知的函数的参数。在 Athlon 2600+、Windows2000 环境下,OllyDbg 可以每秒处理多达 25000 个条件断点。另一个有用的特性是跟踪。OllyDbg 支持两种方式的跟踪:hit 和 run。在第一种情况下,它对指定范围内的每条指令上设置断点(比如在全部可执行代码中) 。当到达设断的指令后,Ol

31、lyDbg 清除断点并且把该指令标记为 hit。这种方法可以用来检测某段代码是否被执行。Hit 跟踪速度惊人的快,在一个很短时间的启动后程序几乎达到了全速(译者注:这应该是与不进行调试时速度相比而言) 。因为 INT3 断点可能对数据有灾难性的影响,所以我建议不要使用模糊识别过程。当代码没有被分析时 Hit 跟踪是不可以使用的。Run 跟踪Run trace是一步一步地执行程序,同时记录精确的运行历史和所有寄存器的内容、已知的参数和可选的指令(当代码是自修改时会有帮助) 。当然,这需要大量的内存(每个指令需要 15 至 50 个字节,取决于调试的模式)但是可以精确地回溯和分析。你可以只在选定的

32、一段代码甚至是一条指令中进行 Run 跟踪,或者你可以跳过无关紧要的代码。对于每个地址,OllyDbg 能够计算这个地址在 Run 跟踪日志中出现的次数,虽然会导致执行缓慢但是可以得到代码执行的统计。比如说,某命令让你在每个已识别的过程入口处进行 Run 跟踪,那么统计 profile就会给你每个过程被调用的次数。在到达某条指令、某个地址范围或指令计数器达到某一数值时 Run 跟踪可以自动地暂停pause 。在多线程程序里 OllyDbg 可以自动管理线程threads ,如果你单步调试或跟踪程序,它会自动恢复当前线程而挂起其它线程。如果你运行程序,OllyDbg 会恢复先前的线程状态。你可以

33、为内存块建立快照(叫做备份) 。OllyDbg 会高亮显示所有的改动。你可以把备份保存到文件或从文件中读取出来,从而发现两次运行的不同之处。你可以查看备份,搜索下一处改动,恢复全部或选定的改动。补丁管理器Patch manager记录了上次应用到程序中的所有补丁,在下次调试时可以再次应用它们。你可以很容易地把你的补丁加在可执行文件上。OllyDbg 会自动进行修正。8你不能在带有 Win32 的 16 位 Windows 下使用 OllyDbg。这种 32 位扩展操作系统无法实现某些必需的调试功能。你既不能调试 DOS 程序也不能调试 16 位 NE(New Executable)格式文件,我

34、也没有打算在未来的版本中支持这些。二、反汇编器Disassembler反汇编器识别所有的标准 80x86、保护、FPU、MMX 和 3DNow!指令集(包括 Athlon扩展的 MMX 指令集) 。但它不识别 ISSI 命令,尽管计划要在下个版本中支持这种命令。某些过时或者未公开的命令,像 LOADALL,也不支持。反汇编器可以正确解码 16 位地址。但它假设所有的段都是 32 位的(段属性使用 32 位)。这对于 PEPortable Executable格式文件总是正确的。OllyDbg 不支持 16 位的NENew Executables格式。如果你熟悉 MASM 或者 TASM,那么反

35、汇编的代码对于你没有任何问题。但是,一些特例也是存在的。以下命令的解码与 Intel 的标准不同:AAD (ASCII Adjust AX Before Division)该命令的解码后的一般形式为: AAD imm8AAM (ASCII Adjust AX After Multiply)该命令(非十进制数)的一般解码形式为:AAM imm8SLDT (Store Local Descriptor Table register)操作数总被解码为 16 位。这个命令的 32位形式会在目的操作数的低 16 位中存储段选择器,并保留高 16 位不变。SALC (Signextend Carry bi

36、t to AL, undocumented)OllyDbg 支持这个未公开指令。PINSRW (Insert Word From Integer Register, Athlon extension to MMX)在 AMD 的官方文档中,这个命令的内存形式使用了 16 位内存操作数;然而寄存器形式需要 32 位寄存器,但只使用了低 16 位。为了方便处理,反汇编器解码寄存器为 16 位形式。而汇编器两种形式都支持。CVTPS2PI and CVTTPS2PI (Convert Packed SinglePrecision Floating to Packed Doubleword, Conv

37、ert with Truncation Packed SinglePrecision Floating to Packed Doubleword)在这些命令中,第一个操作数是 MMX 寄存器,第二个或者是 128 位 XMM寄存器或者是 64 位内存区域。为了方便处理,内存操作数也被解码为 128 位。有些指令的助记符要依赖操作数的大小:不分大小的形式 明确的 16 位形式 明确的 32 位形式PUSHA PUSHAW PUSHADPOPA POPAW POPADLOOP LOOPW LOOPDLOOPE LOOPWE LOOPDELOOPNE LOOPWNE LOOPDNEPUSHF PUS

38、HFW PUSHFDPOPF POPFW POPFDIRET IRETW IRETD9你可以改变解码大小敏感助记符decoding of sizesensitive mnemonics 。根据选项,反汇编器从三种可能中选择之一进行解码。这个选项也会影响汇编器的默认处理方式。解码 MMX 和 3DNow!指令总是开启的,尽管你的处理器并不支持这些指令。三、分析器AnalysisOllyDbg 整合了一个快速而强大的代码分析器。你可以从快捷菜单,或者在 CPU 窗口的反汇编面板中按 Ctrl+A ,或者在可执行模块中选择“分析全部模块Analyze all modules ”,来使用它。分析器有很

39、高的启发性。它能区分代码和数据,标记入口和跳转目的地址,识别转换表switch tables ,ASCII 和 UNICODE 串,定位函数过程,循环,高阶转换highlevel switches并且能解码标准 API 函数的参数(示例 example ) 。OllyDbg 的其他部分也广泛的使用了分析后的数据。这是如何实现的?我将为你揭开这一神秘面纱。第一遍,OllyDbg 反汇编代码段中所有可能的地址,并计算调用的每个目的地址的个数。当然,很多调用是假的,但不可能两个错误的调用都指向了相同的命令,当然如果有三个的话,就更不可能了。因此如果有三个或者更多的调用指向了相同的地址,我可以肯定的说

40、这个地址是某个频繁使用的子程序的入口。从定位的入口出发,我继续跟踪所有的跳转和函数调用,等等。按这种方法,我可能准确定位 99.9% 的命令。但是,某些字节并不在这个链条上。我再用 20 多种高效的启发方法(最简单的方法,比如“直接访问前 64K 内存是不允许的,像在 MOV 0,EAX 中”)来探测他们。有时,分析器在你感兴趣的地方分析错误。有两种解决方法:或者从选中的部分移除分析(快捷键退格键) ,这样 OllyDbg 将使用默认的解码(反汇编)方式;或者设置解码提示decoding hints并重新分析。注意:在某些情况下,当分析器认为你的提示是不合适的,或者有冲突,则可能忽略你的设置。

41、探测程序的函数过程也很简单。在分析器眼中看来,程序只是一个连绵不断的代码,从一个入口开始,可能达到(至少从理论上)所有的命令(除了 NOP 以及类似的用于填充间隙的命令) 。你可能指定三个识别级别。严格的函数过程要求有准确的一个入口,并且至少有一个返回。在启发级别下,分析器只要求过程有一个入口。而如果你选择模糊模式,差不多连贯的代码都会被识别为单独的过程。现代编译器进行全局代码优化,有可能把一个过程分成几个部份。在这种情况下,模糊模式非常有用。但是也会误识别的机率也就更高。同样地,循环是一个封闭的连续的命令序列,并有一个到开始处的跳转作为一个入口,还有若干个出口。循环与高级操作命令 do, while 和 for 相对应。OllyDbg 能够识别任何复杂的嵌套循环。他们会在反汇编栏Disassembly中用长而粗括号标记。如果入口不是循环的第一个命令,OllyDbg 会用一个小三角进行标记。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。