关键词不能为空

当前您在: 主页 > 英语 >

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

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-10 14:52
tags:

-

2021年2月10日发(作者:ptt是什么)



OllyDbg


完全教程



目录



第一章



概述


......................... .........................................


1


第二章



组件


......................... .........................................


5


一、一般原理[


General prnciples



........................................


5


二、反汇编器[


Disassem bler



.............................................


8


三、分析器[


Analysis< /p>



........................... ........................


9


四 、


Object


扫描器[


Object scanner




......................................


12


五、


Implib


扫描器




Implib scanner




.....................................


12


第三章


OllyDbg


的使用



...... ..................................................


13


一、如何开始调试[


How to start debugging session



......................


13


二、


CPU


窗口[


CPU window



..............................................


14


三、断点[


Breakpoin ts



.................................................


14


四、数据窗口[


Dump



............................. .......................


15


五、可执行模块窗口[


Executable modules window



.........................


16


六、内存映射窗口[


Memory map window



...................................


17


七、监视与监察器[


Watches and inspectors



..............................


19

< p>
八、线程[


Threads


............................................... ......


19


九、调用栈[


Call stack



................................................


20


十、调用树[


Call tree



.................................................


21


十一、选项[


Options< /p>



........................... ........................


21


十二、搜索[


Search



... .................................................


22


十三、自解压文件[


Self< /p>



extracting (SFX) files



........................


22


十四、单步执行与自动执行[


Step



by



step execution and animation



......


23


十五、


Hit

< br>跟踪[


Hit trace




....................................... .......


23


十六、


Run


跟踪[


Run trace



.............................................


24


十七、



快捷键


........................ ...................................


26


十八、插件[


Plugins



......................................... ..........


29


十九、技巧提示[


Tips and tricks



.......................................


29


第四章



其他功能


....................... ......................................


30


一、调试独立的


DLL



Debugging of stand



alone DLLs




.....................


30


二、解码提示[


Decoding hints



..........................................


32


三、表达式赋值[


Evaluation of expressions



.............................


32


四、自定义函数描述[


Custom function descriptions



......................


34






第一章



概述




OllyDbg


是一种具有可视化界面的



32


位汇编—分析调试器。


它的特别之处在于可以在

没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。



V


ersion


1.10


是最终的发布版本。



这个工程已经停 止,我不再继续支持这个软件了。


但不用担心:全新打造的


Ol lyDbg2.00


不久就会面世!



运行环境:


OllyDbg


可以以在任何采用奔腾处理器的< /p>



Windows 95



98



ME



NT


或是



XP


(未经完全测试)操作系统中工作,但我们强烈建议你采用


300



MHz


以上的奔腾处理

器以达到最佳效果。还有,


OllyDbg


是极占内存的 ,因此如果你需要使用诸如追踪调试



Trace


]之类的扩展功能话,建议你最好使用


128MB


以 上的内存。



支持的处理器:


Olly Dbg


支持所有



80x86


、奔腾、


MMX



3D NOW




Athlon

< p>
扩展指令


集、


SSE


指令 集以及相关的数据格式,但是不支持


SSE2


指令集。



配置:



有多达百余 个选项用来设置


OllyDbg


的外观和运行。



数据格式:


OllyDbg


的数据窗口能够显示的所有数据格式:


HEX



ASCII



UNICODE




16/32


位有

< br>/


无符号


/HEX


整数、


32/64/80


位浮点数、


地址、


反汇编



MASM


、< /p>


IDEAL


或是


HLA

< br>)



PE


文件头或线程数据块。



帮助:



此 文件中包含了关于理解和使用


OllyDbg


的必要的信息。< /p>


如果你还有



Windows


API


帮助文件的话(由于版权的问题



没有包括在内)


,你


可以将它挂在< /p>


OllyDbg


中,这样就可以快速获得系统函数的相关帮助< /p>




启动:


< /p>


你可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放



OllyDbg


中,


或者 重新启动上一个被调试程序,


或是挂接



Attach



一个正在运行的程序。


OllyDbg


支持即时调试。


OllyDbg


根本不需要安装,可直接在软盘中运行!




调试


DLLs



< /p>


你可以利用


OllyDbg


调试标准动态 链接库



(DLLs)



OllyDbg


会自动运行


一个可执行程序。这个程序会加载链接库,并允许你调用 链接库的输出函数。



源码级调试:


O llyDbg


可以识别所有



Borland




Microsoft


格式的调试信息。


这些信息


包括源代码、函数名、标签、全局变量、静态变量。有限度的支持动态(栈) 变量和结构。



代码高亮:


OllyD bg


的反汇编器可以高亮不同类型的指令


(如:


跳转、


条件跳转、


入栈、


出栈 、调用、返回、特殊的或是无效的指令)和不同的操作数(常规[


general




FPU/SSE




/


系统寄存器、在栈或内存中的操 作数,常量)


。你可以定制个性化高亮方案。



线程:


OllyDbg


可以调试多线程程序。因此你可 以在多个线程之间转换,挂起、恢复、


终止线


程或


是改变


线程


优先


级。并


且线


程窗


口将会


显 示


每个


线程的


错误

(就


像调用



GETLASTERROR


返回一样)




分析:


OllyDbg


的最大特点之 一就是分析。它会分析函数过程、循环语句、选择语句、


表[


t ables



、常量、代码中的字符串、欺骗性指令[


tricky constructs




API


调用、函数中参


数的数目,


import


表等等。这些分析增加了二进制代码的可读性,减少了出错 的可能性,使


得我们的调试工作更加容易。




1



Object


扫描:


OllyDbg


可以扫描


Object


文件

< p>
/


库(包括



OMF




COFF


格式)


,解压代


码段[


code segments


]并且对其位置进行定向。



Implib


扫描:



由于一些


DLL


文件的输出函数使用的索引号,对于人 来说,这些索引号


没有实际含义。如果你有与


DLL

< p>
相应的输入库[


import library




OllyDbg


就可以将序号转


换成符号名称。



完全支持


Unicode




几乎所有支持



ASCII


的操作同时也支持



UNICODE


,反之亦然。



名称:


OllyDbg


可以根据



Borland




Microsoft


格式的调试信息,显示输入


/


输出符号


及名称。


Obj ect


扫描器可以识别库函数。其中的名称和注释你可任意添加。如果


DLL


中的


某些函数是通过索引号输出的,则你可通过 挂接输入库[


import library


]来恢复原来的函 数


名称。


不仅如此,


OllyDbg< /p>


还能识别大量的常量符号名


(如:


窗口消 息、


错误代码、


位域



bit


fields



…< /p>


)并能够解码为已知的函数调用。



已知函数:


OllyDbg


可以识别



2300


多个



C




Windows


API


中的常用函数及其使用


的参数 。你可以添加描述信息、预定义解码。你还可以在已知函数设定



Log


断点并可以对


参数进行记录。



函数调用:


OllyDbg


可以在没有调试信 息或函数过程使用非标准的开始部分[


prolog



和结尾部分[


epilog


]的情况下,对递归 调用进行回溯。



译者注:



004010D0




push



ebp
















004010D1




mov




ebp,esp


004010D3




sub




esp,10h


004010D6




push



ebx


004010D7




push



esi


004010D8




push



edi


……



004010C5




pop




edi


004010C6




pop




esi


004010C7




pop




ebx


004010CA




pop




ebp


004010CB




ret



















|



|>epilog



|



|












|




|>prolog




|




|



/



004010C8




mov




esp,ebp


/


栈:在栈窗口中,


OllyDbg


能智能识别返回地址和栈框架[


Stack Frames



。并会留下一


些先前的调用。如果程序停 在已知函数上,堆栈窗口将会对其参数进行分析解码。



译者注:栈框架[


Stack Frames

< br>]是指一个内存区域,用于存放函数参数和局部变量。



SEH


链:



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



搜索:方法真是太多了!可精确、模糊搜索命令或命令序列,搜索常数,搜索二进制、


文本字符串,搜索全部命令地址,搜索全部常量或地址域[


address r ange



,搜索所有能跳到


选定地址 的跳转,


搜索所有调用和被调用的函数,


搜索所有参考字符串,


在不同模块中搜索


所有调用、搜索函数名称,在全部已分配的内 存中搜索二进制序列。如果搜索到多个结果,


你可以对其进行快速操作。



2




窗口:


OllyDbg


能够列出关于 调试程序中的各种窗口,


并且可以在窗口、


类甚至选定的


消息上设置断点。




资源:如果



Windows API


函数使用了参考资源串,


OllyDbg

可以显示它。其支持显示


的类型仅限于附带资源[


atta ched resources


]的列表、数据显示及二进制编辑。



断点:


OllyDbg


支持各种断点:一般 断点、条件断点、记录断点(比如记录函数参数到


记录窗口)


、 内存读写断点、硬件断点(只适用于


ME/NT/2000


)等 。在


Hit


跟踪情况下,可


以在模块的 每条命令上都设置


INT3


断点。在使用


500



MHZ


处理器的

< p>


Windows


NT


中,


OllyDbg


每秒可以处理高达



5000


个中断。




监视与监察器:


每个监视都是一个表达式并能实时显示表达式的值。

你可以使用寄存器、


常数、地址表达式、布尔值以及任何复杂代数运算,你还可以比 较


ASCII



UNICODE



符串。监察器[


inspectors


]是一种包含了两个的索引序列的监视[


Watches

< p>


,它以二维表的


形式呈现,可以对数组和结构进 行解码分析。





Heap walk.


:在基于


Win 95


的系统中,


OllyDbg


可以列出所有的已分配的堆。



句柄: 在基于


NT


的系统中,


OllyDbg


可列出被调试程序的所有系统句柄。



执行:


.


你可以单步执行、步入子程序或者步过子程序。你也可 以执行程序直到函数返


回时、


执行到指定地址处,


还可以自动执行。


当程序运行时,


你仍然可以操纵程 序并能够查


看内存、设置断点甚至修改代码。你也可以任意的暂停或重启被调试的程序。



Hit


跟踪:


.Hit


跟踪可以显示出目前已执行的指令或函数过程,帮助你检验代码的各个


分支。


Hit


跟踪会在指定指令到达之前设置 断点,而在这个指令执行后,会把这个断点清除


掉。



译者注:


Hit


在英文中是


击中



的意思,指令如果运行了 就表示这个指令被



击中


< p>
了,


没有执行的指令就是



未击中




这样我们就很容易看出被 调试程序哪些部分运行了,


而哪些


没有运行。

< br>


Run


跟踪:



Run


跟踪可以单步执行程序,它会在一个很大的循环缓冲区中模拟运行程< /p>


序。这个模拟器包含了除了


SSE


指令集 以外的所以寄存器、标志、线程错误、消息、已经


函数的参数。


你可以保存命令,


这样可以非常方便地调试自修改代码(译者注:


比如加壳程


序)


。你可以设置条件中断,条件包括地址范围、 表达式、命令。你可以将


Run


跟踪信息保

存到一个文件中,


这样就可以对比两次运行的差别。


Run


跟踪可以回溯分析已执行过的上百


万条命令的各种细节。



统计:



统计[< /p>


Profiler


]可以在跟踪时计算某些指令出现的次数。因此 你就能了解代码


的哪一部分被频繁执行。


补丁:内置汇编器能够自动找到修改过的代


码段。二进制编辑器则会以


ASCII



UNICODE


或者十六进制的形式同步显示修改后的数据。修改后的数据同其它数据一样,能


够进行 复制—粘贴操作。


原来的数据会自动备份,


以便数据恢复时使用 。


你可以把修改的部


分直接复制到执行文件中,


OllyDbg


会自动修正。



OllyDbg


还会记录以前调试过程中使用的


所有补丁。你 可以通过空格键实现补丁的激活或者禁止。



自解压文件:



当调试自解压文件时, 你往往希望跳过解压部分,直接停在程序的原始


入口点。


Oll yDbg


的自解压跟踪将会使你实现这一目的。如果是加保护的自解压段,自解压


跟踪往往会失败。


而一旦


OllyDbg


找到了入口点,


它将会跳过解压部分,


并准 确的到达入口


点。




3



插件:


你可以把自己的插件添加到


OllyDbg


中,


以增加新的功能。


OllyDbg


的插件能够


访问几乎所有重要的数据的结构、能够在


OllyDbg


的窗口中添加菜单和快捷键,能够使用


100


个以上 的插件


API


函数。


插件


API


函数有详细的说明文档。


默认安装已经包含了 两个插


件:命令行插件和书签插件。




UDD



OllyDbg

< p>
把所有程序或模块相关的信息保存至单独的文件中,并在模块重新加


载时继 续使用。这些信息包括了标签、注释、断点、监视、分析数据、条件等等



更多:


这里介绍的功能,


仅仅是

OllyDbg


的部分功能。


因为其具有如此丰富的功能,



至于


OllyDbg


能成为非常方便的调试器!





4



第二章



组件



一、一般原理[


General prnciples




我希望你能对


80x86


系列处理器的内部结构有所了解,

< br>同时具有一定的编写汇编程序的


能力。对于


Micros oft Windows


方面的知识,你也要熟悉。



OllyDbg


是运行在


Windows 95



Windows 98



Windows ME



Windows NT




Windows


2000


系统下的一个单进程、


多线程的分析代码级调 试工具。


它可以调试


PE


格式的执行文 件


及动态链接库,


并可以对其打补丁。



代码级



意味着你可以直接与比特、


字节或处理器指令


打交道。


OllyD bg


仅使用已公开的



Win32


API


函数,因此它可以在所有



Windows


操作系


统及后继版本 中使用。但是由于我没有对



XP


系 统进行彻底测试,因此不能保证


OllyDbg


功能的充分发挥 。注意:


OllyDbg


不支持对



.NET


程序的调试。


< p>
OllyDbg


不是面向编译器的。它没有特别的规则规定必须是哪一个编 译器产生的代码。


因此,


OllyDbg


可以非常好的处理通过编译器生成的代码,或是直接用汇编写入的代码。


< p>
OllyDbg


可以并行调试程序。


你无须暂停执 行程序,


就可以浏览代码和数据,


设置断点、

< br>停止或恢复线程,甚至直接修改内存。


(这可以视为一种软件调试的模式,与之相 对的硬件


模式则是当进程在运行时调试器被阻滞,反之亦然)


。 假使所需的操作比较复杂,


OllyDbg


会让进程终止一小段 时间,


但是这种暂停对于用户来说是透明的。


有时进程会发生非 法操作。


你可以把


OllyDbg


设置 成即时



just


< br>in



time



调试器,


它会挂接出错程序,


并停在程序产


生异常的地方。



通过


OllyDbg


,你可以调试单独的


DLL


standalone DLLs


]文件。操作系统不能 直接运




DLL

< br>文件,


因此


OllyDbg


将一 个可以加载



DLL


的小程序压缩到 资源里,


这个程序允许


你调用最多


10


个参数的输出函数。



OllyDbg


是完全面向模块


[module



oriented]


的。模块[


Modul e


]包括可执行文件(扩展


名通常为


. EXE



和在启动时加载或需要时动态加载的动态链接库(扩展 名通常为


.DLL





调试期间,你可以设置断点[


breakpoint s



、定义新的标签[


labels< /p>



、注释[


comment


]汇


编指令,当某个模块从内存中卸载[


unloa d


]时,调试器会把这些信息保存在文件中,文


件名就是模块的 名称,扩展名为


.UDD


(表示



用户自定义文件[


User



Defined


Data





OllyDbg


下一次加载该模 块时,


它会自动恢复所有的调试信息,


而不管是哪一个程序使用 这


个模块。


假设你正在调试程序


Myp rog1


,这个程序使用了


Mydll


。你在



Mydll


中设置了一


些断点,


然后你开始调试


Myprog2< /p>



这个程序同样使用了


Mydll



这时你会发现,


所有



Mydll


中的断点依然存在,即使



Mydll


加载到不同的位置!



一些调试器把被 调试进程的内存当作一个单一的(并且大部分是空的)大小为


2 ^32



节的区域。


OllyDbg


采用了与之不同的技术:在这里,内存由许多独立的块组成,任何对内


存内容的操作都被 限制在各自的块内。


在大多数情况下,


这种方式工作得很好并且 方便了调


试。


但是,


如果模块包含好几 个可执行段



executable



sections




你将不能一次看到全部代


码,然而这种情况是非常少见的。


OllyDbg


是一个很占用内存的程序



memory



hung ry application




它 在启动时就需要



3


MB

< p>
,并且当你第一次装载被调试的程序时还需要一到两兆的内存。每一次的分析、备份、



5



跟踪或者文件数据 显示都需要占用一定的内存。


因此当你调试一个很大的项目,


发 现程序管


理器显示有



40




60


兆内存被占用时,请不要惊慌。



< /p>


为了有效地调试一些不带源码的程序,


你必须首先理解它是如何工 作的。


OllyDbg


包含


的大量特 性可以使这种理解变得非常容易。



首先,

OllyDbg


包含一个内置的代码分析器。分析器遍历整个代码,分出指令和数据 ,


识别出不同的数据类型和过程,分析出标准


API

< p>
函数(最常用的大约有


1900


个)的参数并


且试着猜出未知


函数的参


数数目。你


也可以加入


自己的函数


说明[


your


own


function


descriptions



。它标记出程序入口点 和跳转目的地,识别出跳转表[


table


< br>driven switches



和指向字符串的指针 ,加入一些注释,甚至标示出跳转的方向等等。在分析结果的基础上,


调用树[


call


tree


]显示哪些函数被指定过程 调用(直接或间接)并且识别出递归调用、系


统调用和叶子过程



leaf procedures




如果需要的话,


你可以设置解码提示



decoding hints



来 帮助分析器解析那些不明确的代码或数据。



OllyDbg< /p>


还包含


Object


扫描器[

< p>
Object Scanner



。如果你有库文 件[


libraries


]或目标文


件 [


object files



,扫描 器会在被调试的程序中定位这些库函数。在全部函数调用中,对标准


函数的调用占很重要 的一部分


(据我估计可达


70%




如果你知道正要被调用的函数的功能,


你 就不必把注意力集中在这个函数上,可以简单地单步步过[


step

< br>over


]这个


call


。分析 器


知道


400


多个标准


C


函数,比如


fopen


和< /p>


memcpy


。然而我必须承认当前版本的


OllyDbg



能定位很短的函数


(比一个


return


命令多不了多少的)

或相似的函数


(只在重定位上有不同)


< br>Object


扫描器


[Object scanner]


也能够识别输入库


[import libr aries]



如果某个


DLL


是按序号输


出的,你不会看到函数名,只会发现一堆无意义的神秘数字 。这种


DLL


的开发者通常会提


供一个 输入库来实现函数符号名与序号间的对应。



OllyDbg< /p>


使用这个输入库,


它就会恢复


原始的函数 符号名。



面向对象的语言(如


C++



,使用了一种叫做名称修饰[


nam e mangling


]的技术,把函


数类型和参数都加入函数 名中。


OllyDbg


可以解码


[< /p>


demangle



这种函数名,


使程序更易读。


译者注:


C++


的名称修饰是编译器将函数的名称转变成为一个唯一的字符串的过程,


这个字


符串会对函数的类、其命名空间、其参数表,以及其他等等进行编码。

< br>


C++


的名称修饰适


用于静态 成员函数,


也适用于非静态成员函数。


静态函数的名称修饰的一 个好处之一,


是能


够在不同的类里使用同一个名称来声明两个或 者更多的静态成员函数————而不会发生


名称上的冲突。



OllyDbg


完全支持



UNICODE


,几乎所有对



ASCII


字符串的操作都可以同样应用于



UNICODE



< br>汇编指令都是很相似的。你经常会搞不清自己是不是已经


跟踪过某一段代码。在< /p>


OllyDbg


中你可以加入自己的标签[


labels


]和注释[


comments

< br>]


。这些极大地方便了调试。


注意一旦你注释了某个


DLL



以后每次加载这个


DLL


时,


注释和标签都有效————尽管

< p>
你在调试不同的程序




OllyDbg


可以跟踪标准的栈帧



stack frames



(由


PUSH EBP; MOV EBP


,ESP


所创建的)



现代编译器有禁止产生标准栈框架的选项,在这种情况下分配栈[

< p>
stack walk


]是不可能的。


当程序运行 到已知的函数时,栈窗口[


stack window


]解析它的参数,调用栈[


Call stack



窗口显示到达当前位置所调用函数的序列。

< br>




6



现代的面向对象应用程序广泛地使用了一种叫做结构化异常处 理[


Structured Exception


Handl ing,SHE


]的技术。


SHE


窗口 [


SEH window




可以显示异常处理链。



多种不同的搜 索[


search


]选项可以让你找到二进制代码或数据、命令 或命令序列、常


量或字符串、符号名或在



Run


跟踪中的一条记录。



对于任何地址或常量,


OllyDbg


可以找出参考[


referencing


]到该地址或常量的 全部


命令的列表。然后你可以在这个列表里找出对你来说是重要的参考。举例来说,某个 函数


可能被直接调用,或者经过编译器优化后把地址放入寄存器间接调用,或者把地址压 入堆


栈作为一个参数————没问题,


OllyDbg


会找出所有这样的地方。它甚至能找到并列出


所有和某个指定的位置有 关的跳转。



OllyDbg


支持所 有标准类型的断点[


breakpoints


]————非条件 和条件断点、内存断




< p>



访问




硬件





在整



< br>存块




断点

< br>(



两项






Window


ME,NT,2000,XP

< br>中有效)



条件表达式可以非常复杂





[ESP+8]


的第



2


位被设置,


并且



123456


位置处的字[


word


]小于


10


,或者


EAX


指向一个以


“ABC”


开头的



UNICODE

< p>


串,


但跳过前


10


次断点而在第


11


次中断

< br>”




你可以设定一条或多条指 令,


当程序暂停时由


OllyDbg


传 递给插件插件[


plugins



。除 了暂停,你还可以记录某个表达式的值(可以带有


简短的说明)


,或者记录


OllyDbg


已知的函数的参数。在


Athlon 2600+



Windows2000


环境


下,


OllyDbg


可以每秒处理多达



25000


个条件断点。



另一个有用的特性是跟踪。


OllyDbg

< br>支持两种方式的跟踪:


hit



run




在第一种情况下,


它对指定范围内的每条指令上设置断点


(比如在全部可执行代码中)



当到达设断的指令后,


OllyDbg< /p>


清除断点并且把该指令标记为


hit


。这 种方法可以用来检测


某段代码是否被执行。


Hit


跟踪速度惊人的快,在一个很短时间的启动后程序几乎达到了全


速(译者注: 这应该是与不进行调试时速度相比而言)


。因为


INT3


断点可能对数据有灾难


性的影响,


所以我建议 不要使用模糊识别过程。


当代码没有被分析时


Hit

< p>
跟踪是不可以使用


的。



Run


跟踪[


Run trace


]是一步一步地执行程序,同时记录精确的运行历史和所有寄存器


的 内容、已知的参数和可选的指令(当代码是自修改时会有帮助)


。当然,这需要大量的内



(每个指令需要


15



50


个字节,


取决于调试的 模式)


但是可以精确地回溯和分析。


你可


以只在选定的一段代码甚至是一条指令中进行


Run


跟踪,< /p>


或者你可以跳过无关紧要的代码。


对于每个地址,


OllyDbg


能够计算这个地址在


Run

< p>
跟踪日志中出现的次数,


虽然会导致执行


缓慢但是 可以得到代码执行的统计。比如说,某命令让你在每个已识别的过程入口处进行


Run< /p>


跟踪,那么统计[


profile


]就会 给你每个过程被调用的次数。在到达某条指令、某个地


址范围或指令计数器达到某一数值 时


Run


跟踪可以自动地暂停[


pau se





在 多线程程序里


OllyDbg


可以自动管理线程[


threads



,如果你单步调试或跟踪程序,< /p>


它会自动恢复当前线程而挂起其它线程。


如果你运行程序,


OllyDbg


会恢复先前的线程状态。




可以为内存块建立快照(叫做备份)



OllyDbg


会高亮显示所有的改动。你可以把备


份保存到文件或从文件中读取出来,


从而发现两次运行的不同之处。


你可以查看备份,


搜索


下一处改动,恢复全 部或选定的改动。补丁管理器[


Patch manager


] 记录了上次应用到程序


中的所有补丁,


在下次调试时可以再次应 用它们。


你可以很容易地把你的补丁加在可执行文


件上。


OllyDbg


会自动进行修正。



你不能在带有



Win32



16




Windows


下使用


< p>
OllyDbg


。这种


32


位扩展操作系统无



7



法实现某些必需的调试功


能。你既


< p>


调试



DOS


程序也


不能调试


16




NE



New


Executable


)格式文件


,我也没有打算在未来的版 本中支持这些。




二、反汇编器[< /p>


Disassembler




反汇编器识别所有的标准


80x86


、保护、< /p>


FPU



MMX



3DNow!


指令集(包括


Athl on


扩展的


MMX


指令集)

< p>
。但它不识别


ISSI


命令,尽管计划要在下个版 本中支持这种命令。某


些过时或者未公开的命令,像


LOADA LL


,也不支持。



反汇编器可以正确 解码


16


位地址。


但它假设所有的段都 是


32


位的


(段属性使用


32


位)



这对于


PE



Portable

Executable


]格式文件总是正确的。


OllyD bg


不支持


16


位的

< br>NE



New


Executables


]格式。


< /p>


如果你熟悉


MASM


或者


TASM


,那么反汇编的代码对于你没有任何问题。但是,一些


特例也是存在的。以下命令的解码与


Intel


的标准 不同:



AAD (ASCII Adjust AX Before Division)


—该命令的解码后的一般形式为:


AAD imm8


AAM (ASCII Adjust AX After Multipl y)


—该命令


(非十进制数)


的一般解 码形式为:


AAM


imm8


SLDT


(Store


Local


Descriptor Table


register)


—操作数总被解码为


16


位。这个命令的< /p>


32


位形式会在目的操作数的低


16


位中存储段选择器,并保留高


16


位不变。



SALC (Sign



extend Carry bit to AL, undocumented)



OllyDbg


支持这个未公开指令。



PINSRW (Insert Word From Integer Register, Athlon extension to MMX)


—在


AMD


的官方


文档中,这个命令的内存形式使用了


16


位内存操作数;然而寄存器形式需要


32


位 寄存器,


但只使用了低


16


位。


为了方便处理,


反汇编器解码寄存器为


16< /p>


位形式。


而汇编器两种形式


都支持。



CVTPS2PI


and


CVTTPS2PI


(Convert


Packed


Single



Precision


Floating


to


Packed


Doubleword, Convert with Truncation Packed Single



Precision Floating to Packed Doubleword)


—在这些命令中,


第一 个操作数是


MMX


寄存器,


第二个或者 是


128



XMM

寄存器或者是


64


位内存区域。为了方便处理,内存操作数 也被解码为


128


位。



有些指令的助记符要依赖操作数的大小:



不分大小的形式



明确的


16


位形式



PUSHA


POPA


LOOP



LOOPE


PUSHF



POPF


IRET










PUSHAW



POPAW



LOOPW



LOOPWE



LOOPWNE


PUSHFW



POPFW


IRETW












明确的


32


位形式



PUSHAD


POPAD


LOOPD


LOOPDE


LOOPDNE


PUSHFD


POPFD


IRETD


LOOPNE



你可以改变解码大小敏感助记符[


decoding of size



sensitive mnemonics



。根据选项,



8



反汇编器从三种可能中选择之一 进行解码。


这个选项也会影响汇编器的默认处理方式。


解码


MMX



3DNow!

指令总是开启的,尽管你的处理器并不支持这些指令。




三、分析器[


Analysis




OllyDbg


整合了一个快速而强大 的代码分析器。你可以从快捷菜单,或者在


CPU


窗口




汇编


< p>
板中




Ctrl+A






可执



模块


中选





析全



模块



Analyze


all


modules




,来使用它。




分析器有很高的启 发性。


它能区分代码和数据,


标记入口和跳转目的地址,


识别转换表



switch


tables




ASCII




UNICODE


串,定位函数过程,循环,高阶转换[


high



level


switches


]并且能解 码标准


API


函数的参数(示例[


ex ample




OllyDbg


的其他部分也广泛


的使用了分析后的数据 。



这是如何实现的?我将为你揭开这一神秘面纱。第一遍,< /p>


OllyDbg


反汇编代码段中所有


可能 的地址,


并计算调用的每个目的地址的个数。


当然,

< p>
很多调用是假的,


但不可能两个错


误的调用都指向 了相同的命令,


当然如果有三个的话,


就更不可能了。


因此如果有三个或者


更多的调用指向了相同的地址,我可以肯定的说这个 地址是某个频繁使用的子程序的入口。


从定位的入口出发,


我继 续跟踪所有的跳转和函数调用,


等等。


按这种方法,

< p>
我可能准确定



99.9%

的命令。但是,某些字节并不在这个链条上。我再用


20


多 种高效的启发方法(最


简单的方法,


比如



直接访问前


64K


内存是不允许的 ,


像在


MOV [0],EAX





来探测他们。


有时,


分析器在你感兴趣的地方分析错误。


有两种解决方法:< /p>


或者


从选中的部分移除分析


(快


捷键退格键)



这样


O llyDbg


将使用默认的解码


(反汇编)

方式;


或者设置解码提示



dec oding


hints



并重新分析 。


注意:


在某些情况下,


当分析器认为 你的提示是不合适的,


或者有冲突,


则可能忽略你的设置。



探测程序的函数过程也很简单。


在分析器 眼中看来,


程序只是一个连绵不断的代码,


< br>一个入口开始,可能达到(至少从理论上)所有的命令(除了


NOP


以及类似的用于填充间


隙的命令)


。你可能指定三个 识别级别。严格的函数过程要求有准确的一个入口,并且至少


有一个返回。


在启发级别下,


分析器只要求过程有一个入口。


而如 果你选择模糊模式,


差不


多连贯的代码都会被识别为单独的过程 。


现代编译器进行全局代码优化,


有可能把一个过程

< p>
分成几个部份。在这种情况下,模糊模式非常有用。但是也会误识别的机率也就更高。



同样地,循环是一个封闭的连续的命令序列,并有一个到开始处的跳转作为 一个入口,


还有若干个出口。


循环与高级操作命令



do, while




for


相对应。


OllyDbg < /p>


能够识别任何复


杂的嵌套循环。他们会在反汇编栏[


Disassembly


]中用长而粗括号标记


。< /p>


如果入口不是循


环的第一个命令,


Oll yDbg


会用一个小三角进行标记





9



< /p>


为了实现一个转换[


switch



,


许多编译器,读取转换变量[


switch

< br>variable


]到寄存器


中,然后减它,像如下的代 码序列:








MOV EDX,







SUB EDX,100







JB DEFAULTCASE







JE CASE100









; Case 100







DEC EDX







JNE DEFAULTCASE







...
















; Case 101



这个序列可能还包含一到两阶的转换表、

直接比较、


优化和其他元素。


如果在比较或跳


转的很深处,这就很难知道哪是一个分支[


Case




OllyDbg


会帮助你,它会 标记所有的分




< br>括





















'A'



WM_PAINT






10



EXCEPTION_ACC ESS_VIOLA


TION


。如果命令序列没有修改寄存器( 也就是仅仅由比较组


成)


,那么这可能不是转换,而很有可能是 选择嵌套:








if (i==0) {...}







else if (i==5) {...}







else if (i==10) {...}


如果需要


OllyDbg


将选择嵌套解码成选择语句,请在分析


1


Analysis1


]中设置相关选


项。

< br>


OllyDbg


包含多达


19 00


条常用


API


函数,这些都作为内 部预处理资源。这个列表包含



KERNEL32, GDI32, USER32, ADV


API32, COMDLG32, SHELL32, VERSION, SHLWAPI,


COMCTL32, WINSOCK, WS2_32




MSVCRT



你可以添加自己的函数描述

< br>[


add your own


description s



。如果分析器遇到的调用,使用了已知的函数名(或者跳转 到这样的函数)


,它


将在调用之前立即解码

PUSH


命令。因此,你只需略微一看就能明白函数调用的含义。

< br>OllyDbg


还包含了大约


400

多种的标准


C


函数。


如果你有原始 的库文件,


我推荐你在分析前


扫描目标文件。这样


OllyDbg


将能解码这些


C

函数的参数。



如果选项



猜测未知函数的参数个数



开启,

< p>
分析器将会决定这个调用函数过程使用的长


度为双字的参数个数。并且标记 他们为参数


1



Arg1



,参数


2




Arg2



,等等。注意 :无


论如何,


寄存器参数是无法识别的,


所以不会增加参数的数目。


分析器使用了一种比较安全


的方法 。例如,它不能识别的没有参数的函数过程,或者该过程


POP


命令直接做返回前的


寄存器恢复,


而不销毁参数。


然而,


识别出来的函数参数数目通常非常高,


这大大 加大了代


码的可读性。



分析器能够跟 踪整型寄存器的内容。


现代优化编译器,


特别是奔腾系列,


频繁地使用寄


存器读取常量和地址,


或使用 尽量少的使用内存。


如果某个常量读取到寄存器中,


分析器会< /p>


注意它,


并尝试解码函数和其参数。


分析 器还能完成简单的算术计算,


甚至可以跟踪压栈和


出栈。



分析器不能区分不同类的名称[


different


kinds


of


names



。如果你将某些函数指定为已


知的名称,< /p>


OllyDbg


将会解码所有到该地址的调用。这是几个预定义的 特殊名称


WinMain,


DllEntryPoint


and


WinProc


。你可能使用 这些标签标记主程序、


DLL


的的入口以及窗口过程

< p>
(注意:


OllyDbg


不检查用户自定义的标签 是否唯一)


。另外,假定预定义参数


assume


predefined arguments


是一种更好的方法 ,不幸的是,没有一般规则能够做到


100%


的准确分


析。在某些情况下,例如当模块包含了


P



Code


或代码段中包换了大量的数据,分析器可

< br>能将一些数据解释成代码。


如果统计分析显示代码部分很可能是压缩包或者经过加 密了,



析器会发出警告。


如果你想使 用


Hit


跟踪[


Hit trace< /p>



,我建议你不要使用模糊分析[


fuz zy


analysis



,因为设置 断点的地方可能正是数据部分




自解 压文件[


Self



extracta ble


files




通常有一个自提取器,在



正式


代码段之外。如


果你选择自解压选项[

< br>SFX option


]中的



扩展代码段,包含提取器[


Extend code section to


include


self



extractor





OllyDbg


将会扩展代码段,形式上允许分析它,并可 以使用


Hit


跟踪[


Hit

< p>



trace



Run


跟踪[


Run trace







11




四、


Object

< br>扫描器[


Object scanner





扫描器将特定的目标文件或者目标库(包括


OMF


和< /p>


COFF


两种格式)


,提取出代码段,< /p>


然后将这些段定位在当前模块的代码节[


Code sectio n


]中


.


如果段定位好了


,


扫描器将从目标


文件中的调试信息提取名称(也就 是所谓的库标签[


library


labels




。这极大的增加了代码


与数据的可读性。


扫描器并不会对已识别的目标文件进行标签匹配,

所以它不能识别非常小


或相似的函数(比如:两个函数只是在重定位有区别)


。因此要经常检查扫描器发送到登陆


窗口的警告列表!




五、


Implib


扫描器




Implib scanner







DLL














许< /p>









< p>







MFC42.#1003



,这非常不便于理解。幸运的是,软件零售商提供了输入连接库(

implibs




它与序号符号 名相关。



使用


implib


扫描器的方法:从主菜单中选择


调试



Debug


]—


>


选择


输入链接库



Select


import libraries




当你加载应用程序时,


OllyDbg


会读取链接库并从内置表格



internal table s



中提取符号名。


每次遇到序号符号 ,


而对应的链接库已经注册到


OllyDbg

< br>中时,


这个序号符


号会被替换。





12



第三章


OllyDbg


的使用



一、如何开始调试[


How to start debugging session




最简单的方法是:运行



OllyDb g


,点击菜单上的文件[


File


]—


>


打开[


Open


,选择你


想调试的程序。


如果程 序需要命令行参数,


你可以在对话框底部的输入栏中,


输入参数 或者


选择以前调试时输入过的一条参数。



OllyDbg


能够调试独立的


DL L



stand


alone DLLs



。在这种情况下,


OllyDbg


会创建


并运行一个小的应用程序来加 载链接库并根据你的需要调用输出函数。



如果你想重新启动上一次调试的程序,只要按一下


< p>
Ctrl+F2


(这是重启程序的快捷键)


(?? ?)


,这样


OllyDbg


会以同样的 参数运行这个程序。另一种做法是在菜单中选择文件



File




从历史列表中选择程序。


你也可以在



Windows


资源管理器中将可执行文件或



DLL


文件拖拽到


OllyDbg


中。



当然,


你可以在


O llyDbg


启动时,


运行指定带有运行参数的被调试程序。< /p>


例如:


你可以


在桌面创建一个

< p>
OllyDbg


的快捷方式,右击并选择



属性



,在



快捷方式



中的


“< /p>


目标



中添加


调 试的程序的全路径。


这样,


你每次双击快捷方式时,

< p>
OllyDbg


将自动运行被调试程序。



意:


DLL


文件不支持这种方式。




你可以把正在运行的进程挂接到

< p>
OllyDbg


中。


在菜单中打开文件

< p>


File




>


挂接



Attach




从进程列表中选择要挂接的进程。 注意:在你关闭


OllyDbg


的同时,这个进程也会被关闭。


不要挂接系统进程,否则可能会导致整个操作系统的崩溃。


(事 实上在大多数情况下,操作


系统禁止你挂接敏感进程)




OllyDbg


可以作为即时

< p>


just



in



time



调试器 。


这需要在系统注册表中注册。


在菜单


中选择选项[


Options


]—


>< /p>


即时调试[


Just


< br>in



time debugging




并在弹出的对 话框中单击


按钮



设置


OllyDbg


为即时调试器




MakeOllyDbgjust



in



time


debugger



。今后,如果某


个应用程序发生了非 法操作,系统将提示你是否用


OllyDbg


调试这个程序。 操作系统会启



OllyDbg


并直接 停在发生异常的地方。如果你选择了



挂接时不询问

< p>



attaching


without


confirmation

< br>]


,则在即时调试时


OllyDbg

不会弹出询问对话框。如果想恢复成以前的即时调


试器[


R estore old just



in



time debuger



,按 相应的按钮即可。



另一种方法是把


O llyDbg


添加到与可执行文件关联的快捷菜单中(这个想法是



Jochen


Gerster


提出的)


。在主菜单中,选择选项[


Options

< p>
]—


>


添加到资源管理器中[

Add


to


Explorer



。以后你可以在所有的文件列表中,右击可执行文件或


DLL


,在快捷菜单中选择


OllyDbg


。 这个功能会创建四个注册表键值:



HKEY_CLASSES_ROOTexefileshellOpen with OllyDbg


HKEY_CLASSES_ROOTexefileshellOpen with OllyDbgcommand


HKEY_CLASSES_ROOTdllfileshellOpen with OllyDbg


HKEY_CLASSES_ROOTdllfileshellOpen with OllyDbgcommand


OllyDbg


能够调试控制 台程序(基于文字的)




OllyD bg


不能调试


.NET


应用程序。


.NET


程序是由微软的中间语言这种伪指令组成的,


或是


on



the



fly to native ?6 commands


编译的。





13



注意:


如果你运行的是


Windows NT



2000


< br>XP


操作系统,


你应该拥有管理员权限以


便能够调试程序。





二、


CPU


窗口[


CPU window




对于用户来说,


CPU


窗口在


OllyDbg


中是最重要的窗口。你调试自己程序的绝大部分


操作都要在这个窗口中进行。 它包括以下五个面板(这五个面板的大小都是可以调节的)




?



?



?



?



?



反汇编[


Disassembler




信息[


Information




数据[


Dump



< /p>


寄存器[


Registers




栈[


Stack


]< /p>




TAB


键, 可以切换到下一个


CPU


面板中(顺时针方向)





Shift+TAB< /p>


,可以切换到前一个


CPU


面板(逆时针 方向)





三、断点[


Breakpoints




OllyDbg


支持数种不同类型的断点:


一般断点



Ordinary


breakpoint



,


将你想中断的命令的第一个字节,用一个特殊命令


INT3


(调试器陷阱)来替代。你可以在反汇编窗口中选中要设断点的指令行并按下



F2



就可以设定一个此类型的断点 。也可以在快捷菜单中设置。再次按下


F2


键时,断点将被删


除。注意,


程序将在设断指令被执行之前中断下来



INT3


断点的


设置数量 是没有限制的



当你关闭被调试程序或者调试器的时候,


OllyDbg


将自动把这些断点保存到硬盘中,

永远不


要试图在数据段或者指令的中间设置这种断点


,如果 你试图在代码段以外设置断点,


OllyDbg


将会警告。你可 以在安全选项[


Security


options

< p>
]中永远关闭这个提示,在某些情


况下调试器会插入自带的临时

< p>
INT3


断点。



条件断点



Conditional


breakpoint



(快捷键



Shift+F2


)是一个带有条件表达 式的普通


INT3


断点。当调试器遇到这类断点时,它将计算表 达式的值,如果结果非零或者表达式无


效,


将暂停被调试程序,


当然,


由条件为假的断点引起的开销是非常高的


(主要归因于操作


系统的反应时间)


。在


Windows


NT


、奔腾Ⅱ

/450


处理器环境下


OllyDbg

每秒最多处理


2500


个条件为假的断点。


条件断点的一个典型使用情况


就是在


Windows< /p>


消息上设置断点(比如



WM_PAIN T




为此,


你可以将伪变量



MSG


同适当的参 数说明联合使用。


如果窗口被激活,


参考一下后面的消息断点描 述。



条件记录断点


Conditional


logging


breakpoint




Shift+F4


)是一种条件 断点,每当遇到


此类断点或者满足条件时,


它将记录已知函数表 达式或参数的值。


例如,


你可以在一些窗口

过程函数上设置记录断点并列出对该函数的所有调用。


或者只对接收到的

< p>
WM_COMMAND


消息标识符设断,或者对创建文件的函数(


CreateFile


)设断,并且记录以只读方式打开的


文件名等,


记录断点和条件断点速度相当,


并且从记 录窗口中浏览上百条消息要比按上百次


F9


轻松的多,你可以为 表达式选择一个预先定义好的解释说明。你可以设置通过的次数—



14



每次符合暂停条件时,计数器 就会减一。如果通过计数在减一前,不等于零,


OllyDbg


就会


继续执行。如果一个循环执行


100


次(十进制)


,在循环体内设置一个断点,并设置通过次


数为


99


(十进制)


OllyDbg


将会在最后一次执行循环体时暂停。



另外,条件记录断点允许你传递一个或多个命令给插件[


plugi ns



。例如,你需要使用


命令行插件 改变一个寄存器的内容,然后继续执行程序。



消息断点



Message brea kpoint



和条件记录断点基本相同,

除了


OllyDbg


会自动产生一


个条件,这个条件允许在窗口过程的入口处设置某些消息(比如


WM_PSINT


)断点,你可


以在窗口[


Windows


]中设置它。



跟踪断点



Trace breakpoint




是在每个选 中命令上设置的一种特殊的


INT3


断点。

如果


你设置了


Hit


跟踪[


hit trace



,断点会在命令执行后 移除,并在该地址处做一个标记。如果


你使用的是


Run


跟踪



run trace

< br>]



OllyDbg


会添加跟踪 数据记录并且断点仍然是保持激活状


态。



内存断点



Memory break point



OllyDbg


每一时刻 只允许有一个内存断点


。你可以在反


汇编窗口、


CPU


窗口、数据窗口中选择一部分内存,然后使用快捷菜单设置内存断点。如


果有以前的内存断点,


将被自动删除。


你有两个选择:


在内存访问


(读,


写,


执行)


时中断,


或内存写入时中断。设 置此类断点时,


OllyDbg


将会改变所选部分的内存块的属 性。在与


80x86


兼容的处理器上将会有

4096


字节的内存被分配并保护起来。即使你仅仅选择了一个

字节,


OllyDbg


也会将整个内存块都保护起来。< /p>


这将会引起大量的错误警告,


请小心使用此


类断点。某些系统函数(特别是在


Windows95/98


下)在访问受保护的内存时不但不会产生


调试事件反而会造成被调试程序的崩溃。



硬断点



Hardware brea kpoint



(仅在


Windows ME



NT



2000


下可用)



80x86


兼容


的处理器上,


允许你设置


4


个硬件断点


。和内存断点不同,硬件断点并不会降低 执行速度,


但是最多只能覆盖四个字节。在单步执行或者跟踪代码时,

< br>OllyDbg


能够使用硬断点代替


INT3

< p>
断点。



内存访问一次性断点


Single



shot break on memory access



(仅在


Windows NT



2000


下可用)


。你可以通过内存窗口的快捷菜单(或按


F2



,对整个内存块设置该类断点。当你


想捕捉调用或返回到某个模块时 ,


该类断点就显得特别有用。


中断发生以后,

< br>断点将被删除。



暂停


Run< /p>


跟踪



Run trace pause




(快捷键:

< p>
Ctrl+T



是在每一步


Run


跟踪



run trace< /p>



时都要检查的一个条件集。


你可以在< /p>


EIP


进入某个范围或超出某个范围时暂停,

某个条件为


真时暂停,


或者命令与指定的模式匹配时暂停,


或者当命令可疑的时候暂停。


注意,


这 一选


择会极大的


(高达


20%



降低


Run


跟踪的速 度。


OllyDbg


也可以在一些调试事件


debugging


events

]上暂停程序执行。比如加载或卸载


DLL


,启动或终止线 程,或者程序发出调试字符


串的时候。




四、数据窗口[


Dump

< p>



数据窗口用于显示内存或文件的内容。你可以 从以下预处理格式[


predefined formats



中选择一种显示方式:


字节



byte




文本



text



、< /p>


整数



integer

< br>]



浮点数


< br>float




地址

< p>


address



,< /p>


反汇编[


disassembly





PE


头[


PE Header






15



所 有的


dump


窗口支持备份[


back up



、搜索和编辑操作。


CPU


窗口[


CPU window


]的


Dump


面板允许你对可执行代码的数据和可执行文件



.exe



< p>
.dll



的内存映射做如下操作:


定义标签[


labels



、设置内存断点[


memory


breakpoints



,


查找参考[


references



。数据菜


单[


Dump menu


]只显示与选中部分相关的命令。



如果



备份



backup



可用,


则单击第一个列标题栏,


会在地址


< br>Address



/


备份



Backup




两种显示模式之间切换。点击其他列标题栏,会改变


Dump< /p>


模式。



像反汇编窗口一样,数据窗口也 保存了大量查看内存地址的历史记录。你可以


通过


“+”





< p>
键来访问过去查看过的数据地址空间


。要翻动一字节的数据,可以按住


Ctrl+




C trl+






五、可执行模块窗口[


Executable modules window




可执行模块窗口(快 捷键:


Alt+E


)列出了当前被调试进程加载的所有可执行模 块。它


也显示了很多有用的信息,比如模块大小、入口地址、模块版本、以及可执行文件 路径等。


一些信息,


如以十进制显示的模块大小、


入口地址的符号名、


是否为系统模块等,


通常是被< /p>


隐藏的。如果想看,可以增加相应栏的宽度。快捷菜单支持以下操作:


刷新[


Actualize


]— 重新扫描模块并去除对新加载模块的高亮显示。在大多数情况下,


OllyDbg


会自动完成该操作。



查看内存[


View memory


] —打开内存窗口,并定位到属于该模块镜像的第一个内存块


处。




CPU


窗口中查看代码[

< p>
V


iew code in CPU


< p>


快捷键:回车键


)—在反汇编窗口中显


示模块的可执行代码。



跟进到入口[


Follow entry


]—在反汇编窗口中跟进到模块的入口处。




CPU


窗口中查看数据[

< br>Dump data in CPU


]—在


CPU


窗口的数据面板中显示模块的


数据段。块代码段。


显示名称[


View


name s



(快捷键:


Ctrl+N


)—显示


当前模块


定义或使用的全部名称



names



(包 括输出表、引入表、链接库、用户自定义)




标记为系统


DLL



Mark as system DLL




标记 为非系统


DLL



Mark as non



system DLL



—将选中模块标记为系统或非系统属性。


如果设置为系统属性,则在


Run


跟踪



Run trace



时会直接执行(不进行跟踪)这个模块, 从而大大加快跟踪速度。默认情况下,所有驻留在





录(


通常



Windows


95/98




c:windowssystem




WinNT/2000/XP



c:winntsystem32


)的模块都认为是系统 模块。



立即更新


.udd

< p>
文件[


Update .udd


file


now


]—向文件


“<

模块名


>.udd”


写入模块相关的全

部数据,


udd


文件保存了在调试期间设置的断点、标签、 注释、监视、分析等信息。当模块


卸载时


OllyDbg


会自动创建


.udd


文件。

< br>


查看可执行文件[


View executable file


]—显示可执行文件的全部内容。



查看全部资源[


View all resources


]—以列表形式显示模块定义的全部资源,并带有一



16



个简短信息。


OllyDbg


并不把资源当作单独实体来支持。你可以提取[


Dump


]并以二进制


的形式进行编辑。



查看资源字符串[


View resource strings


]—以列表形式显示资源字符串及其标识符。



查看


Run


跟踪的统计[


View run trace profile


]—在此模块中计算统计[


profile



< br>


分析全部模块[


Analyze


all


modules


]—允许同时 分析全部模块。分析将从代码中提取


大量的有用信息;代码经过分析后再进行调试,通常 会非常快并且可靠。



鼠标双击某一行,将会在反汇编窗口中显示模块的执行代码。





六、内存映射窗口[


Memory map window




内存映射窗口显示了 被调试程序分配的所有内存块。


因为没有标准的方法来完成这项任


务,所以



OllyDbg


可能会把 一个大的内存块分成几个部分。然而,在大多数情况下,并非


一定要精确处理。如果想查 看由应用程序通过调用


GlobalAlloc ()



LocalAlloc()


等申请的内


存块列 表,请使用堆列表[


Heap list





如果内存块是可执行模块的一个节,


OllyDbg


则会报告 这个内存块所包含的数据类型:


代码、数据、资源等。



Windows95/98


是和


Window sNT/2000


是有一些区别的。在


Windows95/9 8


下,


OllyDbg


是不能显示被映 射文件的名称的。另外,


Windows95/98


不允许的访 存类型为读和写,然而,



WindowsNT/2000


下,


OllyDbg


却有拥有更多功能,包 括执行访问,写复制[


copy



on



write


]以及监视标志位。


OllyDbg


忽略写复制[


copy



on



writ e


]属性。



如果

OllyDbg


发现程序分配了新内存或者重新分配了已经存在的内存块,


它将在内存映


射窗口中高亮显示相应的记录,去掉高亮度显示,可以选择 快捷菜单中的刷新[


Actualize


项。你可以按


Alt+M


来调用内存窗口。



以下是快捷菜单中可以选择的菜单项:


< p>
刷新[


Actualize


]—更新已分配内存的 列表并去除对新内存块的高亮显示。



在反汇编窗口中查看[


View in Disassembl er


]—在反汇编窗口中查看:在反汇编窗口中


打开内存块,< /p>


这一选项仅在某些模块的内存块中包含可执行代码或者自解压器时可用





CPU


数据窗口中查看[


Dump in CPU


]—在


CPU


的数据窗口中显示内存块的内容。




数据窗口


[< /p>


Dump



—在单独窗口中显示内存块内 容。


如果内存块的类型已知,



Oll yDbg


会自动选择显示格式。



查看全部资源[


View all resources


]—如果内存块包含资源数据,则列出所有资源及相


关数据。


OllyDbg


并不把资源当作单独实体来支持。你可以显示其数据并以 二进制的形式进


行编辑。



查看资源字符串[


View resource string s


]—如果内存块包含资源数据,则列出全部资源


字符串及其标 识符。




17



搜索[


Search


]—允许搜索所有的内存块,从选择处开始,搜索匹配的二进制串。如果


找到,



OllyDbg


将显示该内存块。< /p>


内存映像窗口和数据窗口共享同一种搜索模式,


所以你

< p>
可以在弹出的数据窗口中立即继续搜索该二进制串出现的下一位置。



Esc


键可以关闭数据


窗口。



搜索下一个[


Search next

< p>


(快捷键:


Ctrl+L


)—继续上次搜索。



设置访问中断[


Set break



on



access

< br>]


(快捷键:


F2


,仅在


WindowsNT/2000


下可用)


—保 护整个内存块。


当中断发生后


OllyDbg

< br>暂停被调试程序并清除断点。


这类断点在你想捕


捉调用或 返回到某个模块的时候特别有用。



清除访问中断[


Remove break


on



access

< p>


(快捷键:


F2


)—从 内存块中清除访问中断


保护。



设置内存访问断点



Set memory breakpoint on access


]—在整个内存块上设置断 点,每


当该内存块被访问时程序都将中断。


OllyDbg


只支持一个内存访问断点。在


Windows95/98

< p>
下,


当系统程序访问含有内存断点的内存块时,


可 能会导致所被调试程序崩溃,


因此,


不到


万不得已,请不要设置这种断点。



设置内存写入断点



Set memory breakpoint on write



— 在整个内存块上设置断点,


每当


该内存块被写入数据时程序都将 中断。在


Windows95/98


下,当系统程序访问含有内 存断点


的内存块时,可能会导致所被调试程序崩溃,因此,不到万不得已,请不要设置这 种断点。



清除内存断点[


Remove memory breakpoint


]—清除内存断点。



清除自解压内存断点[


Remove


SFX


memory


breakp oint


]—停止搜索自解压程序[


self

< br>—


extractable (SFX) program


]的真实入口。这个搜索使用了特殊类型的内存断点。



访问设置[


Set access


]—设置整个内存块的保护属性,可选择的有:



禁止访问[


No access




只读[


Read only





/


写[


Read/write




执行[


Execute

< br>]



执行


/

读[


Execute/read




完全访问[


Full access




复制到剪切板[


Copy to clipboard






整行[


Whole


line


]—以多行文本(包括解释)的方式把所选记录复制到剪切板,如果< /p>


复制时想排除某些列,可将该列的宽度置为最小(该栏剩余的边框将变灰)




整个表格[


Whole table


]—以多行文本的方式将整个内存映像信息复制到剪切板,该文


本的第一行为窗口标题(



内存映射[


Memory map




)< /p>


,第二行为列标题栏,后面几行的内


容为内存数据记录。


复制将保持列的宽度。


如果复制时想排除某些列,


可将该列的宽度置为


最小(该栏剩余的边框将变灰)






18



七、监视与监察器[


Watches and inspectors




监 视[


Watch


]窗口包含若干个表达式[

expressions



。它在第二列里显示这些表达式 的


值。


OllyDbg


会把这些表达 式保存到主模块的


.UDD


文件中,因此它们在下一次调试时同 样


有效。



监察器[

< br>inspector


]是显示若干变量、


1/2


维数组或是选定项目结构数组[


selected items


of array of structures


]的独立窗口 。它的表达式与监视窗口中的基本相同,只是多包含了两


个参数:


%A



%B


。你可以指定这两个参数 的界限,


OllyDbg


将会用所有可能的组合代替


表达式中的


%A



%B




0


开始一 直到界限


(不包含界限)



并在表格中 显示结果。


参数


%B


(列数)的界限不 能超过


16




例如,


如果你指定了表达式


%A+%B



并且限定


%A


< br>%B


的上限为


3



你将获得如下的


表格:






八、线程[


Threads




OllyDbg


以简单而有效的线程管理为特色。


如果你单步调试、

< p>
跟踪、


执行到返回或者执


行到所选,


则线程管理器将停止除当前线程以外的所有线程。


即使当前线程被挂起,


它也会


将其恢复。


在这种情况下,


如果你手动挂起或者恢复线程,


动作将被延期。


如果你运行被调


试的应用程序,


OllyDbg


将恢复最初的线程状态。


(从调试器的角度来看,


Hi t


跟踪



hit trace



和自由运行是等效的)



依据这种方案,线程窗口可能会有如下五种线程状态:



激活[


Active





线程运行中,或被调试信息暂停


t


挂 起[


Suspended




跟踪[


Traced






暂停[


P aused






结束[


Finished





线程被挂起



线程被挂起,但


OllyDbg


正在单步跟踪此线程



线程是活动的,



OllyDbg


临时将其挂起,


并在跟踪其它的线程



线程结束



线程窗口同时也显示了最后 的线程错误(


GetlastError


函数的返回值)并计算 该线程以


用户模式和系统模式(仅


NT/2000/XP


)运行的时间。线程窗口还会高亮主线程的标识符。



以下在快捷菜单中可用:



刷新[


Actualize


]—标记所有线程为旧的。


挂起[


Suspend


]—挂起 线程。



恢复[


Resume


]—恢复先前挂起的线程。



设置优先级[


Set priority


]—调整进程中线程的优先级。以下选项可用:




19


-


-


-


-


-


-


-


-



本文更新与2021-02-10 14:52,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/629781.html

OllyDbg入门完全教程(完美排版)的相关文章