OllyDbg入门完全教程(完美排版)

上传人:仙*** 文档编号:86728742 上传时间:2022-05-08 格式:DOC 页数:40 大小:321.50KB
收藏 版权申诉 举报 下载
OllyDbg入门完全教程(完美排版)_第1页
第1页 / 共40页
OllyDbg入门完全教程(完美排版)_第2页
第2页 / 共40页
OllyDbg入门完全教程(完美排版)_第3页
第3页 / 共40页
资源描述:

《OllyDbg入门完全教程(完美排版)》由会员分享,可在线阅读,更多相关《OllyDbg入门完全教程(完美排版)(40页珍藏版)》请在装配图网上搜索。

1、wordOllyDbg完全教程目录第一章 概述1第二章 组件5一、一般原理General prnciples5二、反汇编器Disassembler8三、分析器Analysis9四、Object扫描器Object scanner12五、Implib扫描器 Implib scanner12第三章 OllyDbg的使用13一、如何开始调试How to start debugging session13二、CPU 窗口CPU window14三、断点Breakpoints14四、数据窗口Dump15五、可执行模块窗口Executable modules window16六、内存映射窗口Memory m

2、ap window17七、监视与监察器Watches and inspectors19八、线程Threads19九、调用栈Call stack20十、调用树Call tree21十一、选项Options21十二、搜索Search22十三、自解压文件Selfextracting (SFX) files22十四、单步执行与自动执行Stepbystep execution and animation23十五、Hit跟踪Hit trace23十六、Run 跟踪Run trace24十七、 快捷键26十八、插件Plugins29十九、技巧提示Tips and tricks29第四章 其他功能30一、调试

3、独立的DLLDebugging of standalone DLLs30二、解码提示Decoding hints32三、表达式赋值Evaluation of expressions32四、自定义函数描述Custom function descriptions34第一章 概述OllyDbg 是一种具有可视化界面的 32 位汇编分析调试器。它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。Version 1.10 是最终的发布版本。 这个工程已经停止,我不再继续支持这个软件了。但不用担心:全新打造的OllyDbg2.00 不久就会面世!运行环境:OllyDbg可以以

4、在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP未经完全测试操作系统中工作,但我们强烈建议你采用300MHz以上的奔腾处理器以达到最优效果。还有,OllyDbg 是极占内存的,因此如果你需要使用诸如追踪调试Trace之类的扩展功能话,建议你最好使用128MB以上的内存。支持的处理器:OllyDbg支持所有 80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE指令集以与相关的数据格式,但是不支持SSE2指令集。配置: 有多达百余个选项用来设置OllyDbg的外观和运行。数据格式:OllyDbg的数据窗口能够显示的所有数据格式:HEX、ASCII、UN

5、ICODE、 16/32位有/无符号/HEX整数、32/64/80位浮点数、地址、反汇编MASM、IDEAL或是HLA、PE文件头或线程数据块。帮助: 此文件中包含了关于理解和使用OllyDbg的必要的信息。如果你还有 Windows API 帮助文件的话由于的问题没有包括在内,你可以将它挂在OllyDbg 中,这样就可以快速获得系统函数的相关帮助。启动: 你可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到OllyDbg中,或者重新启动上一个被调试程序,或是挂接Attach一个正在运行的程序。OllyDbg支持即时调试。OllyDbg根本不需要安装,可直接在软盘中运行! 调

6、试DLLs: 你可以利用OllyDbg调试标准动态库 (DLLs)。OllyDbg 会自动运行一个可执行程序。这个程序会加载库,并允许你调用库的输出函数。源码级调试:OllyDbg可以识别所有 Borland 和 Microsoft 格式的调试信息。这些信息包括源代码、函数名、标签、全局变量、静态变量。有限度的支持动态栈变量和结构。代码高亮:OllyDbg的反汇编器可以高亮不同类型的指令如:跳转、条件跳转、入栈、出栈、调用、返回、特殊的或是无效的指令和不同的操作数常规general、FPU/SSE、段/系统存放器、在栈或内存中的操作数,常量。你可以定制个性化高亮方案。线程:OllyDbg可以调

7、试多线程程序。因此你可以在多个线程之间转换,挂起、恢复、终止线程或是改变线程优先级。并且线程窗口将会显示每个线程的错误就像调用 GETLASTERROR 返回一样。分析:OllyDbg 的最大特点之一就是分析。它会分析函数过程、循环语句、选择语句、表tables、常量、代码中的字符串、欺骗性指令tricky constructs、API调用、函数中参数的数目,import表等等。这些分析增加了二进制代码的可读性,减少了出错的可能性,使得我们的调试工作更加容易。Object扫描:OllyDbg 可以扫描Object文件/库包括 OMF 和 COFF 格式,解压代码段code segments并且

8、对其位置进展定向。Implib扫描: 由于一些DLL文件的输出函数使用的索引号,对于人来说,这些索引号没有实际含义。如果你有与DLL相应的输入库import library,OllyDbg 就可以将序号转换成符号名称。完全支持Unicode: 几乎所有支持 ASCII 的操作同时也支持 UNICODE,反之亦然。名称:OllyDbg可以根据 Borland 和 Microsoft 格式的调试信息,显示输入/输出符号与名称。Object 扫描器可以识别库函数。其中的名称和注释你可任意添加。如果DLL中的某些函数是通过索引号输出的,如此你可通过挂接输入库import library来恢复原来的函数

9、名称。不仅如此,OllyDbg还能识别大量的常量符号名如:窗口消息、错误代码、位域bit fields并能够解码为的函数调用。函数:OllyDbg 可以识别 2300 多个 C 和 Windows API 中的常用函数与其使用的参数。你可以添加描述信息、预定义解码。你还可以在函数设定 Log 断点并可以对参数进展记录。函数调用:OllyDbg可以在没有调试信息或函数过程使用非标准的开始局部prolog和结尾局部epilog的情况下,对递归调用进展回溯。译者注:004010D0 push ebp 004010D1 mov ebp,esp |004010D3 sub esp,10h |prolog

10、004010D6 push ebx |004010D7 push esi |004010D8 push edi/004010C5 pop edi 004010C6 pop esi |004010C7 pop ebx |epilog004010C8 mov esp,ebp |004010CA pop ebp |004010CB ret/栈:在栈窗口中,OllyDbg 能智能识别返回地址和栈框架Stack Frames。并会留下一些先前的调用。如果程序停在函数上,堆栈窗口将会对其参数进展分析解码。译者注:栈框架Stack Frames是指一个内存区域,用于存放函数参数和局部变量。SEH 链: 跟踪

11、栈并显示结构化异常句柄链。全部链会显示在一个单独的窗口中。搜索:方法真是太多了!可准确、模糊搜索命令或命令序列,搜索常数,搜索二进制、文本字符串,搜索全部命令地址,搜索全部常量或地址域address range,搜索所有能跳到选定地址的跳转,搜索所有调用和被调用的函数,搜索所有参考字符串,在不同模块中搜索所有调用、搜索函数名称,在全部已分配的内存中搜索二进制序列。如果搜索到多个结果,你可以对其进展快速操作。窗口:OllyDbg 能够列出关于调试程序中的各种窗口,并且可以在窗口、类甚至选定的消息上设置断点。 资源:如果 Windows API 函数使用了参考资源串,OllyDbg 可以显示它。其

12、支持显示的类型仅限于附带资源attached resources的列表、数据显示与二进制编辑。断点:OllyDbg支持各种断点:一般断点、条件断点、记录断点比如记录函数参数到记录窗口、内存读写断点、硬件断点只适用于ME/NT/2000等。在Hit跟踪情况下,可以在模块的每条命令上都设置INT3断点。在使用500MHZ处理器的 Windows NT 中,OllyDbg 每秒可以处理高达 5000 个中断。 监视与监察器:每个监视都是一个表达式并能实时显示表达式的值。你可以使用存放器、常数、地址表达式、布尔值以与任何复杂代数运算,你还可以比拟ASCII和UNICODE字符串。监察器inspecto

13、rs是一种包含了两个的索引序列的监视Watches,它以二维表的形式呈现,可以对数组和结构进展解码分析。 Heap walk.:在基于Win95的系统中,OllyDbg 可以列出所有的已分配的堆。句柄:在基于NT的系统中,OllyDbg 可列出被调试程序的所有系统句柄。执行:.你可以单步执行、步入子程序或者步过子程序。你也可以执行程序直到函数返回时、执行到指定地址处,还可以自动执行。当程序运行时,你仍然可以操纵程序并能够查看内存、设置断点甚至修改代码。你也可以任意的暂停或重启被调试的程序。Hit跟踪:.Hit跟踪可以显示出目前已执行的指令或函数过程,帮助你检验代码的各个分支。Hit跟踪会在指定

14、指令到达之前设置断点,而在这个指令执行后,会把这个断点去除掉。 译者注:Hit在英文中是“击中的意思,指令如果运行了就表示这个指令被“击中了,没有执行的指令就是“未击中,这样我们就很容易看出被调试程序哪些局部运行了,而哪些没有运行。Run跟踪: Run跟踪可以单步执行程序,它会在一个很大的循环缓冲区中模拟运行程序。这个模拟器包含了除了SSE指令集以外的所以存放器、标志、线程错误、消息、已经函数的参数。你可以保存命令,这样可以非常方便地调试自修改代码译者注:比如加壳程序。你可以设置条件中断,条件包括地址X围、表达式、命令。你可以将Run跟踪信息保存到一个文件中,这样就可以比照两次运行的差异。Ru

15、n跟踪可以回溯分析已执行过的上百万条命令的各种细节。统计: 统计Profiler可以在跟踪时计算某些指令出现的次数。因此你就能了解代码的哪一局部被频繁执行。补丁:内置汇编器能够自动找到修改正的代码段。二进制编辑器如此会以ASCII、UNICODE或者十六进制的形式同步显示修改后的数据。修改后的数据同其它数据一样,能够进展复制粘贴操作。原来的数据会自动备份,以便数据恢复时使用。你可以把修改的局部直接复制到执行文件中,OllyDbg会自动修正。 OllyDbg还会记录以前调试过程中使用的所有补丁。你可以通过空格键实现补丁的激活或者禁止。自解压文件:当调试自解压文件时,你往往希望跳过解压局部,直接停

16、在程序的原始入口点。OllyDbg的自解压跟踪将会使你实现这一目的。如果是加保护的自解压段,自解压跟踪往往会失败。而一旦OllyDbg找到了入口点,它将会跳过解压局部,并准确的到达入口点。插件:你可以把自己的插件添加到OllyDbg中,以增加新的功能。OllyDbg 的插件能够访问几乎所有重要的数据的结构、能够在OllyDbg的窗口中添加菜单和快捷键,能够使用100个以上的插件API函数。插件API函数有详细的说明文档。默认安装已经包含了两个插件:命令行插件和书签插件。 UDD:OllyDbg 把所有程序或模块相关的信息保存至单独的文件中,并在模块重新加载时继续使用。这些信息包括了标签、注释、

17、断点、监视、分析数据、条件等等更多:这里介绍的功能,仅仅是OllyDbg的局部功能。因为其具有如此丰富的功能,以至于OllyDbg能成为非常方便的调试器! 第二章 组件一、一般原理General prnciples我希望你能对80x86系列处理器的内部结构有所了解,同时具有一定的编写汇编程序的能力。对于Microsoft Windows方面的知识,你也要熟悉。OllyDbg是运行在Windows 95、Windows 98、Windows ME、Windows NT 和 Windows 2000系统下的一个单进程、多线程的分析代码级调试工具。它可以调试PE格式的执行文件与动态库,并可以对其打补

18、丁。“代码级意味着你可以直接与比特、字节或处理器指令打交道。OllyDbg 仅使用已公开的 Win32 API 函数,因此它可以在所有 Windows 操作系统与后继版本中使用。但是由于我没有对 XP 系统进展彻底测试,因此不能保证OllyDbg功能的充分发挥。注意:OllyDbg 不支持对 .NET 程序的调试。OllyDbg不是面向编译器的。它没有特别的规如此规定必须是哪一个编译器产生的代码。因此,OllyDbg可以非常好的处理通过编译器生成的代码,或是直接用汇编写入的代码。OllyDbg可以并行调试程序。你无须暂停执行程序,就可以浏览代码和数据,设置断点、停止或恢复线程,甚至直接修改内存

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

20、模块Module包括可执行文件扩展名通常为.EXE和在启动时加载或需要时动态加载的动态库扩展名通常为.DLL。在调试期间,你表示 用户自定义文件UserDefined Data当OllyDbg下一次加载该模块时,它会自动恢复所有的调试信息,而不管是哪一个程序使用这个模块。假设你正在调试程序Myprog1,这个程序使用了Mydll。你在 Mydll 中设置了一些断点,然后你开始调试Myprog2,这个程序同样使用了Mydll。这时你会发现,所有 Mydll 中的断点依然存在,即使 Mydll 加载到不同的位置!一些调试器把被调试进程的内存当作一个单一的并且大局部是空的大小为2 32字节的区域。O

21、llyDbg采用了与之不同的技术:在这里,内存由许多独立的块组成,任何对内存内容的操作都被限制在各自的块内。在大多数情况下,这种方式工作得很好并且方便了调试。但是,如果模块包含好几个可执行段executable sections,你将不能一次看到全部代码,然而这种情况是非常少见的。OllyDbg 是一个很占用内存的程序memoryhungry application。它在启动时就需要 3 MB,并且当你第一次装载被调试的程序时还需要一到两兆的内存。每一次的分析、备份、跟踪或者文件数据显示都需要占用一定的内存。因此当你调试一个很大的项目,发现程序管理器显示有 40 或 60 兆内存被占用时,请不

22、要惊慌。 为了有效地调试一些不带源码的程序,你必须首先理解它是如何工作的。OllyDbg 包含的大量特性可以使这种理解变得非常容易。首先,OllyDbg包含一个内置的代码分析器。分析器遍历整个代码,分出指令和数据,识别出不同的数据类型和过程,分析出标准API函数最常用的大约有1900个的参数并且试着猜出未知函数的参数数目。你也可以参加自己的函数说明your own function descriptions。它标记出程序入口点和跳转目的地,识别出跳转表tabledriven switches和指向字符串的指针,参加一些注释,甚至标示出跳转的方向等等。在分析结果的根底上,调用树call tree

23、显示哪些函数被指定过程调用直接或间接并且识别出递归调用、系统调用和叶子过程leaf procedures。如果需要的话,你可以设置解码提示decoding hints来帮助分析器解析那些不明确的代码或数据。OllyDbg还包含Object扫描器Object Scanner。如果你有库文件libraries或目标文件object files,扫描器会在被调试的程序中定位这些库函数。在全部函数调用中,对标准函数的调用占很重要的一局部据我估计可达70%。如果你知道正要被调用的函数的功能,你就不必把注意力集中在这个函数上,可以简单地单步步过step over这个call。分析器知道400多个标准C函数

24、,比如fopen和memcpy。然而我必须承认当前版本的OllyDbg不能定位很短的函数比一个return命令多不了多少的或相似的函数只在重定位上有不同。Object扫描器Object scanner也能够识别输入库import libraries。如果某个DLL是按序号输出的,你不会看到函数名,只会发现一堆无意义的神秘数字。这种DLL的开发者通常会提供一个输入库来实现函数符号名与序号间的对应。让OllyDbg使用这个输入库,它就会恢复原始的函数符号名。面向对象的语言如C+,使用了一种叫做名称修饰name mangling的技术,把函数类型和参数都参加函数名中。OllyDbg 可以解码dema

25、ngle这种函数名,使程序更易读。译者注:C+的名称修饰是编译器将函数的名称转变成为一个唯一的字符串的过程,这个字符串会对函数的类、其命名空间、其参数表,以与其他等等进展编码。 C+的名称修饰适用于静态成员函数,也适用于非静态成员函数。静态函数的名称修饰的一个好处之一,是能够在不同的类里使用同一个名称来声明两个或者更多的静态成员函数而不会发生名称上的冲突。OllyDbg完全支持 UNICODE,几乎所有对 ASCII 字符串的操作都可以同样应用于 UNICODE。汇编指令都是很相似的。你经常会搞不清自己是不是已经跟踪过某一段代码。在OllyDbg中你可以参加自己的标签labels和注释ment

26、s。这些极大地方便了调试。注意一旦你注释了某个DLL,以后每次加载这个DLL时,注释和标签都有效尽管你在调试不同的程序。OllyDbg可以跟踪标准的栈帧stack frames由PUSH EBP; MOV EBP,ESP所创建的。现代编译器有禁止产生标准栈框架的选项,在这种情况下分配栈stack walk是不可能的。当程序运行到的函数时,栈窗口stack window解析它的参数,调用栈Call stack窗口显示到达当前位置所调用函数的序列。现代的面向对象应用程序广泛地使用了一种叫做结构化异常处理Structured Exception Handling,SHE的技术。SHE窗口SEH wi

27、ndow 可以显示异常处理链。多种不同的搜索search选项可以让你找到二进制代码或数据、命令或命令序列、常量或字符串、符号名或在 Run跟踪中的一条记录。对于任何地址或常量,OllyDbg 可以找出参考referencing到该地址或常量的全部命令的列表。然后你可以在这个列表里找出对你来说是重要的参考。举例来说,某个函数可能被直接调用,或者经过编译器优化后把地址放入存放器间接调用,或者把地址压入堆栈作为一个参数没问题,OllyDbg 会找出所有这样的地方。它甚至能找到并列出所有和某个指定的位置有关的跳转。OllyDbg 支持所有标准类型的断点breakpoints非条件和条件断点、内存断点写

28、入或访问、硬件断点或在整个内存块上下断点后两项功能只在 Window ME,NT,2000,XP中有效。条件表达式可以非常复杂“当 ESP+8 的第 2 位被设置,并且 123456 位置处的字word小于10,或者 EAX 指向一个以“ABC开头的 UNICODE 字串,但跳过前10次断点而在第11次中断。你可以设定一条或多条指令,当程序暂停时由OllyDbg传递给插件插件plugins。除了暂停,你还可以记录某个表达式的值可以带有简短的说明,或者记录OllyDbg的函数的参数。在Athlon 2600+、Windows2000 环境下,OllyDbg 可以每秒处理多达 25000 个条件断

29、点。另一个有用的特性是跟踪。OllyDbg 支持两种方式的跟踪:hit和run。在第一种情况下,它对指定X围内的每条指令上设置断点比如在全部可执行代码中。当到达设断的指令后,OllyDbg去除断点并且把该指令标记为hit。这种方法可以用来检测某段代码是否被执行。Hit跟踪速度惊人的快,在一个很短时间的启动后程序几乎达到了全速译者注:这应该是与不进展调试时速度相比而言。因为INT3断点可能对数据有灾难性的影响,所以我建议不要使用模糊识别过程。当代码没有被分析时Hit跟踪是不可以使用的。Run跟踪Run trace是一步一步地执行程序,同时记录准确的运行历史和所有存放器的内容、的参数和可选的指令当

30、代码是自修改时会有帮助。当然,这需要大量的内存每个指令需要15至50个字节,取决于调试的模式但是可以准确地回溯和分析。你可以只在选定的一段代码甚至是一条指令中进展Run跟踪,或者你可以跳过无关紧要的代码。对于每个地址,OllyDbg能够计算这个地址在Run跟踪日志中出现的次数,虽然会导致执行缓慢但是可以得到代码执行的统计。比如说,某命令让你在每个已识别的过程入口处进展Run跟踪,那么统计profile就会给你每个过程被调用的次数。在到达某条指令、某个地址X围或指令计数器达到某一数值时Run跟踪可以自动地暂停pause。在多线程程序里OllyDbg可以自动管理线程threads,如果你单步调试或

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

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

33、ASM或者TASM,那么反汇编的代码对于你没有任何问题。但是,一些特例也是存在的。以下命令的解码与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 b

34、it 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, Convertwith T

35、runcation Packed SinglePrecision Floating to Packed Doubleword)在这些命令中,第一个操作数是MMX存放器,第二个或者是128位XMM存放器或者是64位内存区域。为了方便处理,内存操作数也被解码为128位。有些指令的助记符要依赖操作数的大小:不分大小的形式明确的16位形式明确的32位形式PUSHAPUSHAWPUSHADPOPAPOPAWPOPADLOOPLOOPWLOOPDLOOPELOOPWELOOPDELOOPNELOOPWNELOOPDNEPUSHF PUSHFWPUSHFDPOPFPOPFWPOPFDIRETIRETWIRE

36、TD你可以改变解码大小敏感助记符decoding of sizesensitive mnemonics。根据选项,反汇编器从三种可能中选择之一进展解码。这个选项也会影响汇编器的默认处理方式。解码MMX和3DNow!指令总是开启的,尽管你的处理器并不支持这些指令。三、分析器AnalysisOllyDbg 整合了一个快速而强大的代码分析器。你可以从快捷菜单,或者在CPU窗口的反汇编面板中按 Ctrl+A ,或者在可执行模块中选择“分析全部模块Analyze all modules,来使用它。分析器有很高的启发性。它能区分代码和数据,标记入口和跳转目的地址,识别转换表switch tables,AS

37、CII 和 UNICODE 串,定位函数过程,循环,高阶转换highlevel switches并且能解码标准API函数的参数示例example。OllyDbg 的其他局部也广泛的使用了分析后的数据。这是如何实现的?我将为你揭开这一神秘面纱。第一遍,OllyDbg反汇编代码段中所有可能的地址,并计算调用的每个目的地址的个数。当然,很多调用是假的,但不可能两个错误的调用都指向了一样的命令,当然如果有三个的话,就更不可能了。因此如果有三个或者更多的调用指向了一样的地址,我可以肯定的说这个地址是某个频繁使用的子程序的入口。从定位的入口出发,我继续跟踪所有的跳转和函数调用,等等。按这种方法,我可能准确

38、定位99.9% 的命令。但是,某些字节并不在这个链条上。我再用20多种高效的启发方法最简单的方法,比如“直接访问前64K内存是不允许的,像在MOV 0,EAX中来探测他们。有时,分析器在你感兴趣的地方分析错误。有两种解决方法:或者从选中的局部移除分析快捷键退格键,这样OllyDbg将使用默认的解码反汇编方式;或者设置解码提示decoding hints并重新分析。注意:在某些情况下,当分析器认为你的提示是不适宜的,或者有冲突,如此可能忽略你的设置。探测程序的函数过程也很简单。在分析器眼中看来,程序只是一个连绵不断的代码,从一个入口开始,可能达到至少从理论上所有的命令除了NOP以与类似的用于填充

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

40、,OllyDbg会用一个小三角进展标记。为了实现一个转换switch, 许多编译器,读取转换变量switch variable到存放器中,然后减它,像如下的代码序列: MOV EDX, SUB EDX,100 DEFAULTCASE JE CASE100 ; Case 100 DEC EDX JNE DEFAULTCASE . ; Case 101这个序列可能还包含一到两阶的转换表、直接比拟、优化和其他元素。如果在比拟或跳转的很深处,这就很难知道哪是一个分支Case。OllyDbg 会帮助你,它会标记所有的分支,包括默认的,甚至尝试分析每个分支的含义,如A、WM_PAINT 或者 EXCEPT

41、ION_ACCESS_VIOLATION。如果命令序列没有修改存放器也就是仅仅由比拟组成,那么这可能不是转换,而很有可能是选择嵌套: if (i=0) . else if (i=5) . else if (i=10) .如果需要OllyDbg将选择嵌套解码成选择语句,请在分析1Analysis1中设置相关选项。OllyDbg包含多达1900条常用API函数,这些都作为内部预处理资源。这个列表包含了KERNEL32, GDI32, USER32, ADVAPI32, DLG32, SHELL32, VERSION, SHLWAPI, CTL32, WINSOCK, WS2_32 和 MSVCRT

42、。你可以添加自己的函数描述add your own descriptions。如果分析器遇到的调用,使用了的函数名或者跳转到这样的函数,它将在调用之前立即解码PUSH命令。因此,你只需略微一看就能明白函数调用的含义。OllyDbg还包含了大约400多种的标准C函数。如果你有原始的库文件,我推荐你在分析前扫描目标文件。这样OllyDbg将能解码这些C函数的参数。如果选项“猜想未知函数的参数个数开启,分析器将会决定这个调用函数过程使用的长度为双字的参数个数。并且标记他们为参数1Arg1,参数2 Arg2,等等。注意:无论如何,存放器参数是无法识别的,所以不会增加参数的数目。分析器使用了一种比拟安全

43、的方法。例如,它不能识别的没有参数的函数过程,或者该过程POP命令直接做返回前的存放器恢复,而不销毁参数。然而,识别出来的函数参数数目通常非常高,这大大加大了代码的可读性。分析器能够跟踪整型存放器的内容。现代优化编译器,特别是奔腾系列,频繁地使用存放器读取常量和地址,或使用尽量少的使用内存。如果某个常量读取到存放器中,分析器会注意它,并尝试解码函数和其参数。分析器还能完成简单的算术计算,甚至可以跟踪压栈和出栈。分析器不能区分不同类的名称different kinds of names。如果你将某些函数指定为的名称,OllyDbg将会解码所有到该地址的调用。这是几个预定义的特殊名称WinMain

44、, DllEntryPoint and WinProc。你可能使用这些标签标记主程序、DLL的的入口以与窗口过程注意:OllyDbg不检查用户自定义的标签是否唯一。另外,假定预定义参数assume predefined arguments是一种更好的方法,不幸的是,没有一般规如此能够做到100%的准确分析。在某些情况下,例如当模块包含了PCode或代码段中包换了大量的数据,分析器可能将一些数据解释成代码。如果统计分析显示代码局部很可能是压缩包或者经过加密了,分析器会发出警告。如果你想使用Hit跟踪Hit trace,我建议你不要使用模糊分析fuzzy analysis,因为设置断点的地方可能正

45、是数据局部。自解压文件Selfextractable files 通常有一个自提取器,在“正式代码段之外。如果你选择自解压选项SFX option中的“扩展代码段,包含提取器Extend code section to include selfextractor,OllyDbg将会扩展代码段,形式上允许分析它,并可以使用Hit跟踪Hit trace和Run跟踪Run trace。 四、Object扫描器Object scanner扫描器将特定的目标文件或者目标库包括OMF和COFF两种格式,提取出代码段,然后将这些段定位在当前模块的代码节Code section中.如果段定位好了,扫描器将从目

46、标文件中的调试信息提取名称也就是所谓的库标签library labels。这极大的增加了代码与数据的可读性。扫描器并不会对已识别的目标文件进展标签匹配,所以它不能识别非常小或相似的函数比如:两个函数只是在重定位有区别。因此要经常检查扫描器发送到登陆窗口的警告列表!五、Implib扫描器 Implib scanner某些DLL的输出符号仅仅是一个序号。许多符号都是井号加数字比如:MFC42.#1003,这非常不便于理解。幸运的是,软件零售商提供了输入连接库implibs,它与序号符号名相关。使用implib扫描器的方法:从主菜单中选择调试Debug选择输入库Select import libra

47、ries。当你加载应用程序时,OllyDbg会读取库并从内置表格internal tables中提取符号名。每次遇到序号符号,而对应的库已经注册到OllyDbg中时,这个序号符号会被替换。第三章OllyDbg的使用一、如何开始调试How to start debugging session最简单的方法是:运行 OllyDbg,点击菜单上的文件File打开Open,选择你想调试的程序。如果程序需要命令行参数,你可以在对话框底部的输入栏中,输入参数或者选择以前调试时输入过的一条参数。OllyDbg 能够调试独立的DLLstandalone DLLs。在这种情况下,OllyDbg 会创建并运行一个小

48、的应用程序来加载库并根据你的需要调用输出函数。如果你想重新启动上一次调试的程序,只要按一下 Ctrl+F2这是重启程序的快捷键?,这样OllyDbg会以同样的参数运行这个程序。另一种做法是在菜单中选择文件File,从历史列表中选择程序。你也可以在 Windows 资源管理器中将可执行文件或 DLL 文件拖拽到OllyDbg中。当然,你可以在OllyDbg启动时,运行指定带有运行参数的被调试程序。例如:你可以在桌面创建一个OllyDbg的快捷方式,右击并选择“属性,在“快捷方式中的“目标中添加调试的程序的全路径。这样,你每次双击快捷方式时,OllyDbg 将自动运行被调试程序。注意:DLL文件不

49、支持这种方式。 你可以把正在运行的进程挂接到OllyDbg中。在菜单中打开文件File挂接Attach,从进程列表中选择要挂接的进程。注意:在你关闭OllyDbg的同时,这个进程也会被关闭。不要挂接系统进程,否如此可能会导致整个操作系统的崩溃。事实上在大多数情况下,操作系统禁止你挂接敏感进程。OllyDbg 可以作为即时justintime调试器。这需要在系统注册表中注册。在菜单中选择选项Options即时调试Justintime debugging 并在弹出的对话框中单击按钮“设置OllyDbg为即时调试器MakeOllyDbgjustintime debugger。今后,如果某个应用程序发

50、生了非法操作,系统将提示你是否用OllyDbg 调试这个程序。操作系统会启动OllyDbg并直接停在发生异常的地方。如果你选择了“挂接时不询问attaching without confirmation,如此在即时调试时OllyDbg不会弹出询问对话框。如果想恢复成以前的即时调试器Restore old justintime debuger,按相应的按钮即可。另一种方法是把OllyDbg添加到与可执行文件关联的快捷菜单中这个想法是 Jochen Gerster 提出的。在主菜单中,选择选项Options添加到资源管理器中Add to Explorer。以后你可以在所有的文件列表中,右击可执行文

51、件或DLL,在快捷菜单中选择OllyDbg。这个功能会创建四个注册表键值:HKEY_CLASSES_ROOTexefileshellOpen with OllyDbgHKEY_CLASSES_ROOTexefileshellOpen with OllyDbgmandHKEY_CLASSES_ROOTdllfileshellOpen with OllyDbgHKEY_CLASSES_ROOTdllfileshellOpen with OllyDbgmandOllyDbg能够调试控制台程序基于文字的。OllyDbg不能调试.NET应用程序。.NET程序是由微软的中间语言这种伪指令组成的,或是ont

52、hefly to native ?6 mands编译的。 注意:如果你运行的是Windows NT、2000 或XP操作系统,你应该拥有管理员权限以便能够调试程序。二、CPU 窗口CPU window对于用户来说,CPU窗口在OllyDbg中是最重要的窗口。你调试自己程序的绝大局部操作都要在这个窗口中进展。它包括以下五个面板这五个面板的大小都是可以调节的:l 反汇编Disassemblerl 信息Informationl 数据Dumpl 存放器Registersl 栈Stack按TAB键,可以切换到下一个CPU面板中顺时针方向。按Shift+TAB,可以切换到前一个CPU面板逆时针方向。三、断

53、点BreakpointsOllyDbg支持数种不同类型的断点:一般断点Ordinary breakpoint, 将你想中断的命令的第一个字节,用一个特殊命令INT3调试器陷阱来替代。你可以在反汇编窗口中选中要设断点的指令行并按下 F2 键就可以设定一个此类型的断点。也可以在快捷菜单中设置。再次按下F2 键时,断点将被删除。注意,程序将在设断指令被执行之前中断下来。INT3断点的设置数量是没有限制的。当你关闭被调试程序或者调试器的时候,OllyDbg将自动把这些断点保存到硬盘中,永远不要试图在数据段或者指令的中间设置这种断点,如果你试图在代码段以外设置断点,OllyDbg将会警告。你可以在安全选

54、项Security options中永远关闭这个提示,在某些情况下调试器会插入自带的临时INT3断点。条件断点Conditional breakpoint快捷键 Shift+F2是一个带有条件表达式的普通INT3断点。当调试器遇到这类断点时,它将计算表达式的值,如果结果非零或者表达式无效,将暂停被调试程序,当然,由条件为假的断点引起的开销是非常高的主要归因于操作系统的反响时间。在Windows NT、奔腾/450处理器环境下OllyDbg每秒最多处理2500个条件为假的断点。条件断点的一个典型使用情况就是在Windows消息上设置断点比如 WM_PAINT。为此,你可以将伪变量 MSG 同适当

55、的参数说明联合使用。如果窗口被激活,参考一下后面的消息断点描述。条件记录断点Conditional logging breakpointShift+F4是一种条件断点,每当遇到此类断点或者满足条件时,它将记录函数表达式或参数的值。例如,你可以在一些窗口过程函数上设置记录断点并列出对该函数的所有调用。或者只对接收到的WM_MAND消息标识符设断,或者对创建文件的函数CreateFile设断,并且记录以只读方式打开的文件名等,记录断点和条件断点速度相当,并且从记录窗口中浏览上百条消息要比按上百次F9轻松的多,你可以为表达式选择一个预先定义好的解释说明。你可以设置通过的次数每次符合暂停条件时,计数器

56、就会减一。如果通过计数在减一前,不等于零,OllyDbg就会继续执行。如果一个循环执行100次十进制,在循环体内设置一个断点,并设置通过次数为99十进制。OllyDbg将会在最后一次执行循环体时暂停。另外,条件记录断点允许你传递一个或多个命令给插件plugins。例如,你需要使用命令行插件改变一个存放器的内容,然后继续执行程序。消息断点Message breakpoint和条件记录断点根本一样,除了OllyDbg会自动产生一个条件,这个条件允许在窗口过程的入口处设置某些消息比如WM_PSINT断点,你可以在窗口Windows中设置它。跟踪断点Trace breakpoint 是在每个选中命令上

57、设置的一种特殊的INT3断点。如果你设置了Hit跟踪hit trace,断点会在命令执行后移除,并在该地址处做一个标记。如果你使用的是Run跟踪run trace,OllyDbg会添加跟踪数据记录并且断点仍然是保持激活状态。内存断点Memory breakpointOllyDbg每一时刻只允许有一个内存断点。你可以在反汇编窗口、CPU窗口、数据窗口中选择一局部内存,然后使用快捷菜单设置内存断点。如果有以前的内存断点,将被自动删除。你有两个选择:在内存访问读,写,执行时中断,或内存写入时中断。设置此类断点时,OllyDbg将会改变所选局部的内存块的属性。在与80x86兼容的处理器上将会有4096

58、字节的内存被分配并保护起来。即使你仅仅选择了一个字节,OllyDbg 也会将整个内存块都保护起来。这将会引起大量的错误警告,请小心使用此类断点。某些系统函数特别是在Windows95/98下在访问受保护的内存时不但不会产生调试事件反而会造成被调试程序的崩溃。硬断点Hardware breakpoint仅在Windows ME,NT或2000下可用在80x86兼容的处理器上,允许你设置4个硬件断点。和内存断点不同,硬件断点并不会降低执行速度,但是最多只能覆盖四个字节。在单步执行或者跟踪代码时,OllyDbg能够使用硬断点代替INT3断点。内存访问一次性断点Singleshot break on

59、memory access仅在Windows NT或2000下可用。你可以通过内存窗口的快捷菜单或按F2,对整个内存块设置该类断点。当你想捕捉调用或返回到某个模块时,该类断点就显得特别有用。中断发生以后,断点将被删除。暂停Run跟踪Run trace pause 快捷键:Ctrl+T是在每一步Run跟踪run trace时都要检查的一个条件集。你可以在EIP进入某个X围或超出某个X围时暂停,某个条件为真时暂停,或者命令与指定的模式匹配时暂停,或者当命令可疑的时候暂停。注意,这一选择会极大的高达20%降低Run跟踪的速度。OllyDbg也可以在一些调试事件debugging events上暂停程

60、序执行。比如加载或卸载DLL,启动或终止线程,或者程序发出调试字符串的时候。四、数据窗口Dump数据窗口用于显示内存或文件的内容。你可以从以下预处理格式predefined formats中选择一种显示方式:字节byte、文本text、整数integer、浮点数float、地址address,反汇编disassembly、 PE头PE Header。所有的dump窗口支持备份backup、搜索和编辑操作。CPU 窗口CPU window的Dump面板允许你对可执行代码的数据和可执行文件.exe,或.dll的内存映射做如下操作:定义标签labels、设置内存断点memory breakpoint

61、s, 查找参考references。数据菜单Dump menu只显示与选中局部相关的命令。如果 备份backup可用,如此单击第一个列标题栏,会在地址Address/备份Backup 两种显示模式之间切换。点击其他列标题栏,会改变Dump模式。像反汇编窗口一样,数据窗口也保存了大量查看内存地址的历史记录。你可以通过“+和“键来访问过去查看过的数据地址空间。要翻动一字节的数据,可以按住Ctrl+或Ctrl+。五、可执行模块窗口Executable modules window可执行模块窗口快捷键:Alt+E列出了当前被调试进程加载的所有可执行模块。它也显示了很多有用的信息,比如模块大小、入口地址

62、、模块版本、以与可执行文件路径等。一些信息,如以十进制显示的模块大小、入口地址的符号名、是否为系统模块等,通常是被隐藏的。如果想看,可以增加相应栏的宽度。快捷菜单支持以下操作:刷新Actualize重新扫描模块并去除对新加载模块的高亮显示。在大多数情况下,OllyDbg会自动完成该操作。查看内存View memory打开内存窗口,并定位到属于该模块镜像的第一个内存块处。在CPU窗口中查看代码View code in CPU快捷键:回车键在反汇编窗口中显示模块的可执行代码。跟进到入口Follow entry在反汇编窗口中跟进到模块的入口处。在CPU窗口中查看数据Dump data in CPU在CPU窗口的数据面板中显示模块的数据段。块代码段。显示名称View names快捷键:Ctrl+N显示当前模块定义或使用的全部名称names包括输出表、引入表、库、用户自定义。标记为系统DLLMark as system DLL,标记为非系统DLLMark

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!