PCSH91_305 板


LINE

http://forum.slime.com.tw/thread175371.html 一,什麽是 OllyDbg? OllyDbg 是一种具有可视化介面的 32 位汇编-分析侦错器。它的特别之处在於可以在没 有来源码时解决问题,并且可以处理其它编译器无法解决的难题。 Version 1.10 是最终的发怖版本。 这个工程已经停止,我不再继续支持这个软体了。但 不用担心:全新打造的 OllyDbg 2.00 不久就会面世! 执行环境: 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表等等。. 这些分析增加了二进制程式码的可读性,减少了出 现错误的可能性,使得我们的侦错工作更加容易。 Object扫瞄。 OllyDbg 可以扫瞄Object文件/库(包括 OMF 和 COFF 格式),解压程式 码段〔code segments〕并且对其位置进行转发IP。 Implib扫瞄。 由於一些DLL文件的输出函数使用的索引号,对於人来说,这些索引号没有 实际含义。如果您有与DLL相应的输入库〔import library〕,OllyDbg 就可以将序号转 换成符号名称。 完全支持Unicode: 几乎所有支持 ASCII 的操作同时也支持 UNICODE,反之亦然。 名称: OllyDbg 可以根据 Borland 和 Microsoft 格式的侦错讯息,显示输入/输出符号 及名称。Object 扫瞄器可以识别库函数。其中的名称和注释您可任意增加。如果DLL中的 某些函数是通过索引号输出的,则您可通过挂接输入库〔import library〕来恢复原来的 函数名称。不仅如此,OllyDbg还能识别大量的常量符号名(如:视窗消息、错误程式码 、位域〔bit fields〕…)并能够解码为已知的函数使用。 已知函数:OllyDbg 可以识别 2300 多个 C 和 Windows API 中的常用函数及其使用的参 数。您可以增加描述讯息、预定义解码。您还可以在已知函数设定 Log 断点并可以对参 数进行记录。 函数使用: OllyDbg 可以在没有侦错讯息或函数程序使用非标准的开始部分〔prolog〕 和结尾部分〔epilog〕的情况下,对递回使用进行回溯。 译者注: 004010D0 push ebp \ 004010D1 mov ebp,esp | 004010D3 sub esp,10h |prolog 004010D6 push ebx | 004010D7 push esi | 004010D8 push edi / …… 004010C5 pop edi \ 004010C6 pop esi | 004010C7 pop ebx |epilog 004010C8 mov esp,ebp | 004010CA pop ebp | 004010CB ret / 栈:在栈视窗中,OllyDbg 能智能识别返回位址和栈框架〔Stack Frames〕。并会留下一 些先前的使用。如果程序停在已知函数上,堆叠视窗将会对其参数进行分析解码。 译者注:栈框架〔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〕,它以 二维表的形式呈现,可以允骟楹徒峁菇髿薪饴敕治觥?nbsp; Heap walk.:在关於Win95的系统中,OllyDbg 可以列出所有的已分配的堆。 关键句:在关於NT的系统中,OllyDbg 可列出被侦错程序的所有系统关键句。 执行:.您可以单步执行、步入子程序或者步过子程序。您也可以执行程序直到函数返回 时、执行到指定位址处,还可以自动执行。当程序执行时,您仍然可以操纵程序并能够检 视记忆体、设定断点甚至修改程式码。您也可以任意的暂停或重新启动被侦错的程序。 Hit跟踪:.Hit跟踪可以显示出目前已执行的指令或函数程序,说明 您检验程式码的各个 分支。Hit跟踪会在指定指令到达之前设定断点,而在这个指令执行後,会把这个断点清 除掉。 译者注:Hit在英文中是「击中」的意思,指令如果执行了就表示这个指令被「击中」了 ,没有执行的指令就是「未击中」,这样我们就很容易看出被侦错程序哪些部分执行了, 而哪些没有执行。 Run跟踪: Run跟踪可以单步执行程序,它会在一个很大的循环缓冲区中模拟执行程序。 这个模拟器包含了除了SSE指令集以外的所以暂存器、标志、执行绪错误、消息、已经函 数的参数。您可以储存指令,这样可以非常方便地侦错自修改程式码(译者注:比如加壳 程序)。您可以设定条件中断,条件包括位址范围、陈述式、指令。您可以将Run 跟踪讯息储存到一个文件中,这样就可以对比两次执行的差别。Run跟踪可以回溯分析已 执行过的上百万条指令的各种细节。 统计: 统计〔Profiler〕可以在跟踪时计算某些指令出现的次数。因此您就能了解程式 码的哪一部分被频繁执行。 修正档: 内装汇编器能够自动找到修改过的程式码段。二进制编辑器则会以ASCII、 UNICODE或者十六进制的形式同步显示修改後的资料。修改後的资料同其它资料一样,能 够进行复制-贴上操作。原来的资料会自动制作备份,以便资料恢复时使用。您可以把修 改的部分直接复制到执行文件中,OllyDbg会自动修正。OllyDbg还会记录以前侦错程序中 使用的所有修正档。您可以通过空格键实现修正档的启动或者禁止。 自解压文件: 当侦错自解压文件时,您往往希望跳过解压部分,直接停在程序的原始入 口点。OllyDbg的自解压跟踪将会使您实现这一目的。如果是加保护的自解压段,自解压 跟踪往往会失败。而一旦OllyDbg找到了入口点,它将会跳过解压部分,并准确的到达入 口点。 插件:您可以把自己的插件增加到 OllyDbg 中,以增加新的功能。OllyDbg 的插件能够 访问几乎所有重要的资料的结构、能够在 OllyDbg 的视窗中增加表单和快捷键,能够使 用100个以上的插件API函数。插件API函数有详细的说明我的文件。预设值安装已经包含 了两个插件:指令行插件和书签插件。 UDD:OllyDbg 把所有程式或模组相关的讯息储存至单独的文件中,并在模组重新载入时 继续使用。这些讯息包括了标签、注释、断点、监视、分析资料、条件等等 更多:这里介绍的功能,仅仅是 OllyDbg 的部分功能。因为其具有如此丰富的功能,以 至於 OllyDbg 能成为非常方便的侦错器! 二,一般原理〔General principles〕 我希望您能对80x86系列处理器的内部结构有所了解,同时具有一定的编写汇编程序的能 力。对於Microsoft Windows方面的知识,您也要熟悉。 OllyDbg是执行在Windows 95、Windows 98、Windows ME、Windows NT 和 Windows 2000 系统下的一个单工作、多执行绪的分析程式码级侦错工具。它可以侦错PE格式的执行文件 及动态连接库,并可以对其打修正档。「程式码级」意味着您可以直接与位元 、字元或 处理器指令打交道。OllyDbg 仅使用已公开的 Win32 API 函数,因此它可以在所有 Windows 作业系统及後继版本中使用。但是由於我没有对 XP 系统进行彻底测试,因此 不能保证 OllyDbg 功能的充分发挥。注意:OllyDbg 不支持对 .NET 程序的侦错。 OllyDbg不是面向编译器的。它没有特别的规则规定必须是哪一个编译器产生的程式码。 因此,OllyDbg可以非常好的处理通过编译器产生的程式码,或是直接用汇编写入的程式 码。 OllyDbg可以并行侦错程序。您无须暂停执行程序,就可以浏览程式码和资料,设定断点 、停止或恢复执行绪,甚至直接修改记忆体。(这可以视为一种软体侦错的模式,与之相 对的硬体模式则是当工作在执行时侦错器被阻滞,反之亦然)。假使所需的操作比较复杂 ,OllyDbg会让工作终止一小段时间,但是这种暂停对於用户来说是透明的。 有时工作会发生非法操作。您可以把OllyDbg设定成即时〔just-in-time〕侦错器,它会 挂接出现错误程序,并停在程序产生异常的地方。 通过OllyDbg,您可以侦错单独的DLL〔standalone DLLs〕文件。作业系统不能直接执行 DLL 文件,因此 OllyDbg 将一个可以载入 DLL 的小程序压缩到资源里,这个程序允许 您使用最多10个参数的输出函数。 OllyDbg是完全面向模组[module-oriented]的。模组〔Module〕包括可执行文件(副档名 通常为.EXE)和在启动时载入或需要时动态载入的动态连接库(副档名通常为.DLL )。在侦错期间,您可以设定断点〔breakpoints〕、定义新的标签〔labels〕、注释〔 comment〕汇编指令,当某个模组从记忆体中卸载〔unload〕时,侦错器会把这些讯息储 存在文件中,档案名就是模组的名称,副档名为.UDD(表示 用户自订文件〔 User-Defined Data〕)当OllyDbg下一次载入该模组时,它会自动恢复所有的侦错讯息, 而不管是哪一个程序使用这个模组。假设您正在侦错程序Myprog1,这个程序使用了Mydll 。您在 Mydll 中设定了一些断点,然後您开始侦错Myprog2,这个程序同样使用了Mydll 。这时您会发现,所有 Mydll 中的断点依然存在,即使 Mydll 载入到不同的位置! 一些侦错器把被侦错工作的记忆体当作一个单一的(并且大部分是空的)大小为2 ^32字 元的区域。OllyDbg采用了与之不同的技术:在这里,记忆体由许多独立的块组成,任何 对记忆体内容的操作都被限制在各自的块内。在大多数情况下,这种方式工作得很好并且 方便了侦错。但是,如果模组包含好几个可执行段〔executable sections〕,您将不能 一次看到全部程式码,然而这种情况是非常少见的。 OllyDbg 是一个很占用记忆体的程序〔memory-hungry application〕。它在启动时就需 要 3 MB,并且当您第一次安装载入被侦错的程序时还需要一到两兆的记忆体。每一次的 分析、制作备份、跟踪或者文件资料显示都需要占用一定的记忆体。因此当您侦错一个很 大的项目,发现程序管理器显示有 40 或 60 兆记忆体被占用时,请不要惊慌。 为了有效地侦错一些不带源码的程序,您必须首先理解它是如何工作的。OllyDbg 包含的 大量特性可以使这种理解变得非常容易。 首先,OllyDbg包含一个内装的程式码分析器。分析器遍历整个程式码,分出指令和资料 ,识别出不同的资料档案类型和程序,分析出标准API函数(最常用的大约有1900个)的 参数并且试着猜出未知函数的参数数目。您也可以加入自己的函数说明〔your own function descriptions〕。它标记出程序入口点和跳转目的地,识别出跳转表〔 table-driven switches〕和指向字串串的游标,加入一些注释,甚至标示出跳转的方向 等等。在分析结果的基础上,使用树〔call tree〕显示哪些函数被指定程序使用(直接 或间接)并且识别出递回使用、系统使用和叶子程序〔leaf procedures〕。如果需要的 话,您可以设定解码提示〔decoding hints〕来说明 分析器解析那些不明确的程式码或 资料。 OllyDbg还包含Object扫瞄器〔Object Scanner〕。如果您有库文件〔libraries〕或目标 文件〔object files〕,扫瞄器会在被侦错的程序中定位这些库函数。在全部函数使用中 ,对标准函数的使用占很重要的一部分(据我估计可达70%)。如果您知道正要被使用的 函数的功能,您就不必把注意力集中在这个函数上,可以简单地单步步过〔 step over〕这个call。分析器知道400多个标准C函数,比如fopen和memcpy。然而我必须 承认当前版本的OllyDbg不能定位很短的函数(比一个return指令多不了多少的)或相似 的函数(只在重定位上有不同)。 Object扫瞄器[Object scanner]也能够识别输入库[import libraries]。如果某个DLL是 按序号输出的,您不会看到函数名,只会发现一堆无意义的神秘数位。这种DLL的开发者 通常会提供一个输入库来实现函数符号名与序号间的对应。让OllyDbg使用这个输入库, 它就会恢复原始的函数符号名。 物件导向的语言(如C++),使用了一种叫做名称修饰〔name mangling〕的技术,把函数 档案类型和参数都加入函数名中。OllyDbg 可以解码〔demangle〕这种函数名,使程序更 易读。 译者注:C++的名称修饰是编译器将函数的名称转变成为一个唯一的字串串的程序,这个 字串串会对函数的类、其命名空间、其参数表,以及其他等等进行编码。C++的名称修饰 适用於静态成员函数,也适用於非静态成员函数。静态函数的名称修饰的一个好处之一, 是能够在不同的类里使用同一个名称来宣告两个或者更多的静态成员函数----而不会发生 名称上的冲突。 OllyDbg完全支持 UNICODE,几乎所有对 ASCII 字串串的操作都可以同样套用於 UNICODE 。 汇编指令都是很相似的。您经常会搞不清自己是不是已经跟踪过某一段程式码。在 OllyDbg 中您可以加入自己的标签〔labels〕和注释〔comments〕。这些极大地方便了 侦错。注意一旦您注释了某个DLL,以後每次载入这个DLL时,注释和标签都有效----尽管 您在侦错不同的程序。 OllyDbg可以跟踪标准的栈画格〔stack frames〕(由PUSH EBP; MOV EBP,ESP所新增的) 。现代编译器有禁止产生标准栈框架的选项,在这种情况下分配栈〔stack walk 〕是不可能的。当程序执行到已知的函数时,栈视窗〔stack window〕解析它的参数,使 用栈〔Call stack〕视窗显示到达当前位置所使用函数的序列。 现代的物件导向应用程式广泛地使用了一种叫做结构化异常处理〔Structured Exception Handling,SHE〕的技术。SHE视窗〔SEH window〕 可以显示异常处理链。 多种不同的搜寻〔search〕选项可以让您找到二进制程式码或资料、指令或指令序列、常 量或字串串、符号名或在 Run跟踪中的一条记录。 对於任何位址或常量,OllyDbg 可以找出参考〔referencing〕到该位址或常量的全部指 令的列表。然後您可以在这个列表里找出对您来说是重要的参考。举例来说,某个函数可 能被直接使用,或者经过编译器最佳化後把位址放入暂存器间接使用,或者把位址压入堆 叠作为一个参数----没问题,OllyDbg 会找出所有这样的地方。它甚至能找到并列出所有 和某个指定的位置有关的跳转。(真的?哦,天哪!……) OllyDbg 支持所有标准档案类型的断点〔breakpoints〕----非条件和条件断点、记忆体 断点(写入或访问)、硬体断点或在整个记忆体块上下断点(後两项功能只在Window ME,NT,2000,XP中有效)。条件陈述式可以非常复杂(「当 [ESP+8] 的第 2 位被设定, 并且 123456 位置处的字〔word〕小於10,或者 EAX 指向一个以「ABC」开头的 UNICODE 字串,但跳过前10次断点而在第11次中断」)。您可以设定一条或多条指令, 当程序暂停时由OllyDbg传送给插件插件〔plugins〕。除了暂停,您还可以记录某个陈述 式的值(可以带有简短的说明),或者记录 OllyDbg 已知的函数的参数。在Athlon 2600+、Windows2000 环境下,OllyDbg 可以每秒处理多达 25000 个条件断点。 另一个有用的特性是跟踪。OllyDbg 支持两种方式的跟踪:hit和run。在第一种情况下, 它对指定范围内的每条指令上设定断点(比如在全部可执行程式码中)。当到达设断的指 令後,OllyDbg 清除断点并且把该指令标记为hit。这种方法可以用来检测某段程式码是 否被执行。Hit跟踪速度惊人的快,在一个很短时间的启动後程序几乎达到了全速(译者 注:这应该是与不进行侦错时速度相比而言)。因为INT3断点可能对资料有灾难性的影响 ,所以我建议不要使用模糊识别程序。当程式码没有被分析时Hit跟踪是不可以使用的。 Run跟踪〔Run trace〕 是一步一步地执行程序,同时记录精确的执行历史和所有暂存器 的内容、已知的参数和可选的指令(当程式码是自修改时会有说明 )。当然,这需要大 量的记忆体(每个指令需要15至50个字元,取决於侦错的模式)但是可以精确地回溯和分 析。您可以只在选定的一段程式码甚至是一条指令中进行Run跟踪,或者您可以跳过无关 紧要的程式码。对於每个位址,OllyDbg能够计算这个位址在Run跟踪日志中出现的次数, 虽然会导致执行缓慢但是可以得到程式码执行的统计。比如说,某指令让您在每个已识别 的程序入口处进行Run跟踪,那麽统计〔profile〕就会给您每个程序被使用的次数。在到 达某条指令、某个位址范围或指令计数器达到某一数值时Run跟踪可以自动地暂停〔pause 〕。 在多执行绪程序里OllyDbg可以自动管理执行绪〔threads〕,如果您单步侦错或跟踪程序 ,它会自动恢复当前执行绪而挂起其它执行绪。如果您执行程序,OllyDbg 会恢复先前的 执行绪状态。 您可以为记忆体块建立抓图 (叫做制作备份)。OllyDbg会高亮显示所有的改动。您可以 把制作备份储存到文件或从文件中读取出来,从而发现两次执行的不同之处。您可以检视 制作备份,搜寻下一处改动,恢复全部或选定的改动。修正档管理器〔Patch manager〕 记录了上次套用到程序中的所有修正档,在下次侦错时可以再次套用它们。 您可以很容易地把您的修正档加在可执行文件上。OllyDbg 会自动进行修正。 您不能在带有 Win32 的16位 Windows 下使用 OllyDbg。这种32位增强作业系统无法实现 某些必需的侦错功能。 您既不能侦错 DOS 程序也不能侦错16位 NE(New Executable)格式文件,我也没有打算 在未来的版本中支持这些。安息吧,古老而美好的命令提示字元! 三,反汇编器〔Disassembler〕 反汇编器识别所有的标准80x86、保护、FPU、MMX和3DNow!指令集(包括Athlon增强的MMX 指令集)。但它不识别ISSI指令,尽管计划要在下个版本中支持这种指令。某些过时或者 未公开的指令,像LOADALL,也不支持。 反汇编器可以正确解码16位位址。但它假设所有的段都是32位的(段内容使用32位)。这 对於PE〔Portable Executable〕格式文件总是真的。OllyDbg不支持16位的NE 〔New Executables〕格式。 如果您熟悉MASM或者TASM,那麽反汇编的程式码对於您没有任何问题。但是,一些特例也 是存在的。以下指令的解码与Intel的标准不同: AAD (ASCII Adjust AX Before Division) - 该指令的解码後的一般形式为:AAD imm8 AAM (ASCII Adjust AX After Multiply) - 该指令(非十进制数)的一般解码形式为:AAM imm8 SLDT (Store Local Descriptor Table register) - 操作数总被解码为16位。这个指令的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 位形式。而汇编器两种形式都支持。 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位形式 明确的32位形式 PUSHA PUSHAW PUSHAD POPA POPAW POPAD LOOP LOOPW LOOPD LOOPE LOOPWE LOOPDE LOOPNE LOOPWNE LOOPDNE PUSHF PUSHFW PUSHFD POPF POPFW POPFD IRET IRETW IRETD 您可以改变解码大小敏感助记符〔decoding of size-sensitive mnemonics〕.。根据选 项,反汇编器从三种可能中选项之一进行解码。这个选项也会影响汇编器的预设值处理方 式。 解码MMX和3DNow!指令总是开启的,尽管您的处理器并不支持这些指令。 四,分析器〔Analysis〕 OllyDbg 整合了一个快速而强大的程式码分析器。您可以从快捷表单,或者在CPU视窗的 反汇编面板中按 Ctrl+A ,或者在可执行模组中选项「分析全部模组〔Analyze all modules〕」,来使用它。 分析器有很高的启发性。它能区分程式码和资料,标记入口和跳转目的位址,识别转换表 〔switch tables〕,ASCII 和 UNICODE 串,定位函数程序,循环,高阶转换〔 high-level switches〕并且能解码标准API函数的参数(示例〔example〕)。OllyDbg 的其他部分也广泛的使用了分析後的资料。 这是如何实现的?我将为您揭开这一神秘面纱。第一遍,OllyDbg反汇编程式码段中所有 可能的位址,并计算使用的每个目的位址的个数。当然,很多使用是假的,但不可能两个 错误的使用都指向了相同的指令,当然如果有三个的话,就更不可能了。因此如果有三个 或者更多的使用指向了相同的位址,我可以肯定的说这个位址是某个频繁使用的子程序的 入口。从定位的入口出发,我继续跟踪所有的跳转和函数使用,等等。按这种方法,我可 能准确定位99.9% 的指令。但是,某些字元并不在这个链条上。我再用20多种高效的启发 方法(最简单的方法,比如「直接访问前64K记忆体是不允许的,像在MOV [0],EAX中」) 来探测他们 有时,分析器在您感兴趣的地方分析错误。有两种解决方法:或者从选的部分移除分析( 快捷键退格键),这样 OllyDbg 将使用预设值的解码(反汇编)方式;或者设定 解码提示〔decoding hints〕并重新分析。注意:在某些情况下,当分析器认为您的提示 是不合适的,或者有冲突,则可能忽略您的设定。 探测程序的函数程序也很简单。在分析器眼中看来,程序只是一个连绵不断的程式码,从 一个入口开始,可能达到(至少从理论上)所有的指令(除了NOP以及类似的用於填充间 隙的指令)。您可能指定三个识别等级。严格的函数程序要求有准确的一个入口,并且至 少有一个返回。在启发等级下,分析器只要求程序有一个入口。而如果您选项模糊模式, 差不多连贯的程式码都会被识别为单独的程序。现代编译器进行全局程式码最佳化,有可 能把一个程序分成几个部份。在这种情况下,模糊模式非常有用。但是也会误识别的机率 也就更高。 同样地,循环是一个封闭的连续的指令序列,并有一个到开始处的跳转作为一个入口,还 有若干个出口。循环与进阶操作指令 do, while 和 for 相对应。OllyDbg 能够识别任何 复杂的嵌套循环。他们会在反汇编栏〔Disassembly〕中用长而粗括号标记。如果入口不 是循环的第一个指令,OllyDbg会用一个小三角进行标记。 为了实现一个转换〔switch〕, 许多编译器,读取转换变数〔switch variable〕到暂存 器中,然後减它,像如下的程式码序列: MOV EDX,<switch variable> SUB EDX,100 JB DEFAULTCASE JE CASE100 ; Case 100 DEC EDX JNE DEFAULTCASE ... ; Case 101 这个序列可能还包含一到两阶的转换表、直接比较、最佳化和其他元素。如果在比较或跳 转的很深处,这就很难知道哪是一个分支〔Case〕。OllyDbg 会说明 您,它会标记所有 的分支,包括预设值的,甚至尝试分析每个分支的含义,如'A'、WM_PAINT 或者 EXCEPTION_ACCESS_VIOLATION。如果指令序列没有修改暂存器(也就是仅仅由比较组成 ),那麽这可能不是转换,而很有可能是选项嵌套: if (i==0) {...} else if (i==5) {...} else if (i==10) {...} 如果需要OllyDbg将选项嵌套解码成选项语句,请在分析1〔Analysis1〕中设定相关选项 。 OllyDbg包含多达1900条常用API函数,这些都作为内部预处理资源。这个列表包含了 KERNEL32, GDI32, USER32, ADVAPI32, COMDLG32, SHELL32, VERSION, SHLWAPI, COMCTL32, WINSOCK, WS2_32 和 MSVCRT。您可以增加自己的函数描述〔add your own descriptions〕。如果分析器遇到的使用,使用了已知的函数名(或者跳转到这样的函数 ),它将在使用之前立即解码PUSH指令。因此,您只需略微一看就能明白函数使用的含义 。OllyDbg还包含了大约400多种的标准C函数。如果您有原始的库文件,我推荐您在分析 前扫瞄目标文件。这样OllyDbg将能解码这些C函数的参数。 如果选项「猜测未知函数的参数个数」开启,分析器将会决定这个使用函数程序使用的长 度为双字的参数个数。并且标记他们为参数1〔Arg1〕,参数2〔 Arg2〕,等等。注意: 无论如何,暂存器参数是无法识别的,所以不会增加参数的数目。分析器使用了一种比较 安全的方法。例如,它不能识别的没有参数的函数程序,或者该程序POP 指令直接做返回前的暂存器恢复,而不销毁参数。然而,识别出来的函数参数数目通常非 常高,这大大加大了程式码的可读性。 分析器能够跟踪整型暂存器的内容。现代最佳化编译器,特别是奔腾系列,频繁地使用暂 存器读取常量和位址,或使用尽量少的使用记忆体。如果某个常量读取到暂存器中,分析 器会注意它,并尝试解码函数和其参数。分析器还能完成简单的算术计算,甚至可以跟踪 压入推叠和出栈。 分析器不能区分不同类的名称〔different kinds of names〕. 。如果您将某些函数指定 为已知的名称,OllyDbg将会解码所有到该位址的使用。这是几个预定义的特殊名称 WinMain, DllEntryPoint and WinProc。您可能使用这些标签标记主程序、DLL的的入口 以及视窗程序(注意:OllyDbg不检查用户自订的标签是否唯一)。另外,假定预定义参 数assume predefined arguments是一种更好的方法 不幸的是,没有一般规则能够做到100%的准确分析。在某些情况下,例如当模组包含了 P-Code或程式码段中包换了大量的资料,分析器可能将一些资料解释成程式码。如果统计 分析显示程式码部分很可能是压缩包或者经过加密了,分析器会发出警告。如果您想使用 Hit跟踪〔Hit trace〕,我建议您不要使用模糊分析〔fuzzy analysis〕,因为设定断点 的地方可能正是资料部分。 自解压文件〔Self-extractable files〕 通常有一个自抽取器,在「正式」程式码段之 外。如果您选项自解压选项〔SFX option〕中的「增强程式码段,包含抽取器〔Extend code section to include self-extractor〕」,OllyDbg将会增强程式码段,形式上允 许分析它,并可以使用Hit跟踪〔Hit〕 trace和Run跟踪〔Run trace〕。 五,Object扫瞄器〔Object scanner〕 扫瞄器将特定的目标文件或者目标库(包括OMF和COFF两种格式),抽取出程式码段,然 後将这些段定位在当前模组的程式码节〔Code section〕中.如果段定位好了,扫瞄器将从 目标文件中的侦错讯息抽取名称(也就是所谓的库标签〔library labels〕)。这极大的 增加了程式码与资料的可读性. 扫瞄器并不会对已识别的目标文件进行标签匹配,所以它不能识别非常小或相似的函数( 比如:两个函数只是在重定位有区别)。因此要经常检查扫瞄器传送到登入视窗的警告列 表! 六,Implib扫瞄器 〔Implib scanner〕 某些DLL的输出符号仅仅是一个序号。许多符号都是井号加数位(比如:MFC42.#1003), 这非常不便於理解。幸运的是,软体零售商提供了输入连接程式库(implibs),它与序 号符号名相关。 使用implib扫瞄器的方法:从主表单中选项侦错〔Debug〕|选项输入连接库〔Select import libraries〕。当您载入应用程式时,OllyDbg会读取连接库并从内装表格〔 internal tables〕中抽取符号名。每次遇到序号符号,而对应的连接库已经注册到 OllyDbg中时,这个序号符号会被取代。 七,如何开始侦错〔How to start debugging session〕 最简单的方法是:执行 OllyDbg,点击表单上的文件〔File〕|开启〔Open〕,选项您想 侦错的程序。如果程序需要指令行参数,您可以在对话视窗底部的输入栏中,输入参数或 者选项以前侦错时输入过的一条参数。 OllyDbg 能够侦错独立的DLL〔stand-alone DLLs〕。在这种情况下,OllyDbg 会新增并 执行一个小的应用程式来载入连接库并根据您的需要使用输出函数。 如果您想重新启动上一次侦错的程序,只要按一下 Ctrl+F2(这是重新启动程序的快捷键 ),这样 OllyDbg 会以同样的参数执行这个程序。另一种做法是在表单中选项文件〔 File〕,从历史列表中选项程序。您也可以在 Windows 档案总管中将可执行文件或 DLL 文件拖拉到 OllyDbg 中。 当然,您可以在 OllyDbg 启动时,执行指定带有执行参数的被侦错程序。例如:您可以 在桌面新增一个 OllyDbg 的建立捷迳,右击并选项「内容」,在「建立捷迳」中的「目 标」中增加侦错的程序的全路径。这样,您每次双按建立捷迳时,OllyDbg 将自动执行被 侦错程序。注意:DLL文件不支持这种方式。 您可以把正在执行的工作挂接到 OllyDbg 中。在表单中开启 文件〔File〕|挂接〔 Attach〕,从工作列表中选项要挂接的工作。注意:在您关闭 OllyDbg 的同时,这个工 作也会被关闭。不要挂接系统工作,否则可能会导致整个作业系统的崩溃。(事实上在大 多数情况下,作业系统禁止您挂接敏感工作)。 OllyDbg 可以作为即时〔just-in-time〕侦错器。这需要在系统注册表中注册。在表单中 选项选项〔Options〕|即时侦错〔Just-in-time debugging〕 并在弹出的对话视窗中按 下按钮「设定OllyDbg为即时侦错器」〔Make OllyDbg just-in-time debugger〕。今後 ,如果某个应用程式发生了非法操作,系统将提示您是否用 OllyDbg 侦错这个程序。作 业系统会启动 OllyDbg 并直接停在发生异常的地方。如果您选项了「挂接时不询问」〔 attaching without confirmation〕,则在即时侦错时OllyDbg不会弹出询问对话视窗。 如果想恢复成以前的即时侦错器〔Restore old just-in-time debuger〕,按相应的按钮 即可。 另一种方法是把 OllyDbg 增加到与可执行文件关联的快捷表单中(这个想法是 Jochen Gerster 提出的)。在主表单中,选项选项〔Options〕|增加到档案总管中〔Add to Explorer〕。以後您可以在所有的文件列表中,右击可执行文件或DLL,在快捷表单中选 项OllyDbg。这个功能会新增四个注册表键值: HKEY_CLASSES_ROOT\exefile\shell\Open with OllyDbg HKEY_CLASSES_ROOT\exefile\shell\Open with OllyDbg\command HKEY_CLASSES_ROOT\dllfile\shell\Open with OllyDbg HKEY_CLASSES_ROOT\dllfile\shell\Open with OllyDbg\command OllyDbg能够侦错控制台程序(关於文字的)。 OllyDbg不能侦错.NET应用程式。.NET程序是由微软的中间语言这种伪指令组成的,或是 on-the-fly to native ?6 commands编译的。 注意:如果您执行的是Windows NT、2000 或XP作业系统,您应该拥有管理员权限以便能 够侦错程序。。, 八,CPU 视窗〔CPU window〕 对於用户来说,CPU视窗在OllyDbg中是最重要的视窗。您侦错自己程序的绝大部分操作都 要在这个视窗中进行。它包括以下五个面板(这五个面板的大小都是可以调节的): 反汇编〔Disassembler〕 讯息〔Information〕 资料〔Dump〕 暂存器〔Registers〕 栈〔Stack〕 按TAB键,可以切换到下一个CPU面板中(顺时针方向)。 按Shift+TAB,可以切换到前一个CPU面板(逆时针方向)。 九,断点〔Breakpoints〕 OllyDbg支持数种不同档案类型的断点: - 一般断点〔Ordinary breakpoint〕, 将您想中断的指令的第一个字元,用一个特殊指 令INT3(侦错器陷阱)来替代。您可以在反汇编视窗中选要设断点的指令行并按下 F2 键 就可以设定一个此档案类型的断点。也可以在快捷表单中设定。再次按下 F2 键时,断点 将被移除。注意,程序将在设断指令被执行之前中断下来。 INT3断点的设定数量是没有限制的。当您关闭被侦错程序或者侦错器的时候,OllyDbg将 自动把这些断点储存到硬碟中,永远不要试图在资料段或者指令的中间设定这种断点,如 果您试图在程式码段以外设定断点,OllyDbg将会警告。您可以在安全性选项〔Security options〕中永远关闭这个提示,在某些情况下侦错器会插入原有的的临时INT3 断点。 - 条件断点〔Conditional breakpoint〕 (快捷键 Shift+F2) 是一个带有条件陈述式 的普通INT3断点。当侦错器遇到这类断点时,它将计算陈述式的值,如果结果非零或者陈 述式无效,将暂停被侦错程序,当然,由条件为假的断点引起的预先配置是非常高的(主 要归因於作业系统的反应时间)。在Windows NT、奔腾Ⅱ/450处理器环境下 OllyDbg每秒最多处理2500个条件为假的断点。条件断点的一个典型使用情况就是在 Windows消息上设定断点(比如 WM_PAINT)。为此,您可以将伪变数 MSG 同适当的参数 说明联合使用。如果视窗被启动,参考一下後面的消息断点描述。 - 条件记录断点 〔Conditional logging breakpoint〕 (Shift+F4)是一种条件断点, 每当遇到此类断点或者满足条件时,它将记录已知函数陈述式或参数的值。例如,您可以 在一些视窗程序函数上设定记录断点并列出对该函数的所有使用。或者只对接收到的 WM_COMMAND消息标帜符设断,或者对新增文件的函数(CreateFile)设断,并且记录以唯 读方式开启的档案名等,记录断点和条件断点速度相当,并且从记录视窗中浏览上百条消 息要比按上百次F9轻松的多,您可以为陈述式选项一个预先定义好的解释说明。 您可以设定通过的次数 - 每次符合暂停条件时,计数器就会减一。如果通过计数在减一 前,不等於零,OllyDbg就会继续执行。如果一个循环执行100次(十进制),在循环体内 设定一个断点,并设定通过次数为99(十进制)。OllyDbg将会在最後一次执行循环体时 暂停。 另外,条件记录断点允许您传送一个或多个指令给插件〔plugins〕。例如,您需要使用 指令行插件改变一个暂存器的内容,然後继续执行程序。 - 消息断点〔Message breakpoint〕和条件记录断点基本相同,除了OllyDbg会自动产生 一个条件,这个条件允许在视窗程序的入口处设定某些消息(比如WM_PSINT)断点,您可 以在视窗〔Windows〕中设定它。 - 跟踪断点〔Trace breakpoint〕 是在每个选指令上设定的一种特殊的INT3断点。如果 您设定了Hit跟踪〔hit trace〕 ,断点会在指令执行後移除,并在该位址处做一个标记 。如果您使用的是Run跟踪〔run trace〕 ,OllyDbg会增加跟踪资料记录并且断点仍然是 保持启动状态。 - 记忆体断点〔Memory breakpoint〕 OllyDbg每一时刻只允许有一个记忆体断点。您可 以在反汇编视窗、CPU视窗、资料视窗中选项一部分记忆体,然後使用快捷表单设定记忆 体断点。如果有以前的记忆体断点,将被自动移除。您有两个选项:在记忆体访问(读, 写,执行)时中断,或记忆体写入时中断。设定此类断点时,OllyDbg将会改变所选部分 的记忆体块的内容。在与80x86相容的处理器上将会有4096字元的记忆体被分配并保护起 来。即使您仅仅选项了一个字元,OllyDbg 也会将整个记忆体块都保护起来。这将会引起 大量的错误警告,请小心使用此类断点。某些系统函数(特别是在Windows95/98下)在访 问受保护的记忆体时不但不会产生侦错事件反而会造成被侦错程序的崩溃。 - 硬断点〔Hardware breakpoint〕(仅在Windows ME,NT或2000下可用)在80x86相容的 处理器上,允许您设定4个硬体断点。和记忆体断点不同,硬体断点并不会降低执行速度 ,但是最多只能覆盖四个字元。在单步执行或者跟踪程式码时,OllyDbg能够使用硬断点 替代INT3断点。 - 记忆体访问一次性断点〔Single-shot break on memory access〕 (仅在Windows NT 或2000下可用)。您可以通过记忆体视窗的快捷表单(或按F2),对整个记忆体块设定该 类断点。当您想捕捉使用或返回到某个模组时,该类断点就显得特别有用。中断发生以後 ,断点将被移除。 - 暂停Run跟踪〔Run trace pause〕 (快捷键:Ctrl+T)是在每一步Run跟踪〔run trace〕 时都要检查的一个条件集.您可以在EIP进入某个范围或超出某个范围时暂停,某 个条件为真时暂停,或者指令与指定的模式匹配时暂停,或者当指令可疑的时候暂停。注 意,这一选项会极大的(高达20%)降低Run跟踪的速度。 OllyDbg也可以在一些侦错事件〔debugging events〕上暂停程序执行。比如载入或卸载 DLL,启动或终止执行绪,或者程序发出侦错字串串的时候。 10,资料视窗〔Dump〕 资料视窗用於显示记忆体或文件的内容。您可以从以下预处理格式〔predefined formats 〕中选项一种显示方式:字元〔byte〕、文本〔text〕、整数〔integer〕、浮点数〔 float 〕、位址〔address〕,反汇编〔disassembly〕、 PE头〔PE Header〕。 所有的dump视窗支持制作备份〔backup〕、搜寻和编辑操作。CPU 视窗〔CPU window〕的 Dump面板允许您对可执行程式码的资料和可执行文件(.exe,或.dll)的记忆体映射做如 下操作:定义标签〔labels〕、设定 记忆体断点〔memory breakpoints〕, 寻找参考〔 references〕。资料表单〔Dump menu〕只显示与选部分相关的指令。 如果 制作备份〔backup〕可用,则按下第一个列标题栏,会在位址〔Address〕/制作备 份〔Backup〕 两种显示模式之间切换。点击其他列标题栏,会改变Dump模式。 像反汇编视窗一样,资料视窗也储存了大量检视记忆体位址的历史记录。您可以通过「+ 」和「-」键来访问您过去检视过的资料位址空间。 要翻动一字元的资料,可以按住Ctrl l键并按上/下方向键。 可执行模组视窗〔Executable modules window〕 可执行模组视窗(快捷键:Alt+E)列出了当前被侦错工作载入的所有可执行模组。它也 显示了很多有用的讯息,比如模组大小、入口位址、模组版本、以及可执行文件路径等。 一些讯息,如以十进制显示的模组大小、入口位址的符号名、是否为系统模组等,通常是 被隐藏的。如果想看,可以增加相应栏的宽度。快捷表单支持以下操作: 重新整理〔Actualize〕 - 重新扫瞄模组并去除对新载入模组的高亮显示。在大多数情况 下,OllyDbg会自动完成该操作。 检视记忆体〔View memory〕 - 开启记忆体视窗,并定位到属於该模组映射的第一个记忆 体块处。 在CPU视窗中检视程式码〔View code in CPU〕 (快捷键:Enter键键) - 在反汇编视窗 中显示模组的可执行程式码。 跟进到入口〔Follow entry〕 - 在反汇编视窗中跟进到模组的入口处。 在CPU视窗中检视资料〔Dump data in CPU〕 -在CPU视窗的资料面板中显示模组的资料段 。块程式码段。 显示名称〔View names〕 (快捷键:Ctrl+N) -显示当前模组定义或使用的全部名称〔 names〕(包括输出表、引入表、连接库、用户自订)。 标记为系统DLL〔Mark as system DLL〕, 标记为非系统DLL〔Mark as non-system DLL〕 - 将选模组标记为系统或非系统内容。如 果设定为系统内容,则在Run跟踪〔Run trace〕 时会直接执行(不进行跟踪)这个模组 ,从而大大加快跟踪速度。预设值情况下,所有驻停留在系统目录(通常在Windows 95/98下为c:\windows\system ,在WinNT/2000/XP下为c:\winnt\system32)的模组都认 为是系统模组。 立即更新.udd文件〔Update .udd file now〕 -向文件「<模组名>.udd」写入模组相关的 全部资料,udd文件储存了在侦错期间设定的断点、标签、注释、监视、分析等讯息。当 模组卸载时OllyDbg会自动新增.udd文件。 检视可执行文件〔View executable file〕 - 显示可执行文件的全部内容。 检视全部资源〔View all resources〕 - 以列表形式显示模组定义的全部资源,并带有 一个简简信息。OllyDbg并不把资源当作单独实体来支持。您可以抽取〔Dump〕并以二进 制的形式进行编辑。 检视资源字串串〔View resource strings〕 -以列表形式显示资源字串串及其标帜符。 检视Run跟踪的统计〔View run trace profile〕 - 在此模组中计算统计〔profile〕 。 相关资讯:Run跟踪〔Run trace〕. 分析全部模组〔Analyze all modules〕 -允许同时分析全部模组。分析将从程式码中抽 取大量的有用讯息;程式码经过份析後再进去行侦错,通常会非常快并且可靠。 滑鼠双按某一行,将会在反汇编视窗中显示模组的执行程式码。 十,记忆体映射视窗〔Memory map window〕 记忆体映射视窗显示了被侦错程序分配的所有记忆体块。因为没有标准的方法来完成这项 工作,所以OllyDbg可能会把一个大的记忆体块分成几个部分。然而,在大多数情况下, 并非一定要精确处理。如果想检视由应用程式通过使用GlobalAlloc()和LocalAlloc()等 申请的记忆体块列表,请使用堆列表〔Heap list〕。 如果记忆体块是可执行模组的一个节,OllyDbg则会报告这个记忆体块所包含的资料档案 类型:程式码、资料、资源等。 Windows95/98是和WindowsNT/2000是有一些区别的。在Windows95/98下,OllyDbg是不能 显示被映射文件的名称的。另外,Windows95/98不允许的访存档案类型为读和写,然而, 在WindowsNT/2000下,OllyDbg却有拥有更多功能,包括执行访问,写复制〔 copy-on-write〕以及监视标志位。OllyDbg忽略写复制〔copy-on-write〕内容。 如果OllyDbg发现程序分配了新记忆体或者重新分配了已经存在的记忆体块,它将在记忆 体映射视窗中高亮显示相应的记录,去掉高亮度显示,可以选项快捷表单中的重新整理〔 Actualize〕项。 您可以按Alt+M来使用记忆体视窗。 以下是快捷表单中可以选项的表单项: 重新整理〔Actualize〕 - 更新已分配记忆体的列表并去除对新记忆体块的高亮显示。 在反汇编视窗中检视〔View in Disassembler〕 -在反汇编视窗中检视:在反汇编视窗中 开启记忆体块,这一选项仅在某些模组的记忆体块中包含可执行程式码或者自解压器时可 用。 在CPU资料视窗中检视〔Dump in CPU〕 - 在CPU的资料视窗中显示记忆体块的内容。 资料视窗〔Dump〕 - 在单独视窗中显示记忆体块内容。如果记忆体块的档案类型已知, 则OllyDbg会自动选项显示格式。 检视全部资源〔View all resources〕 - 如果记忆体块包含资源资料,则列出所有资源 及相关资料。OllyDbg并不把资源当作单独实体来支持。您可以显示其资料并以二进制的 形式进行编辑。 检视资源字串串〔View resource strings〕 - 如果记忆体块包含资源资料,则列出全部 资源字串串及其标帜符。 搜寻〔Search〕 - 允许搜寻所有的记忆体块,从选项处开始,搜寻匹配的二进制串。如 果找到,则OllyDbg将显示该记忆体块。记忆体映像视窗和资料视窗共享同一种搜寻模式 ,所以您可以在弹出的资料视窗中立即继续搜寻该二进制串出现的下一位置。按Esc键可 以关闭资料视窗。 搜寻下一个〔Search next〕(快捷键:Ctrl+L) - 继续上次搜寻。 设定访问中断〔Set break-on-access〕 (快捷键:F2,仅在WindowsNT/2000下可用) - 保护整个记忆体块。当中断发生後OllyDbg暂停被侦错程序并清除断点。这类断点在您 想捕捉使用或返回到某个模组的时候特别有用。 清除访问中断〔Remove break-on-access〕 (快捷键:F2) - 从记忆体块中清除访问中 断保护。 设定记忆体访问断点〔Set memory breakpoint on access〕 - 在整个记忆体块上设定断 点,每当该记忆体块被访问时程序都将中断。OllyDbg只支持一个记忆体访问断点。在 Windows95/98下,当系统程序访问含有记忆体断点的记忆体块时,可能会导致所被侦错程 序崩溃,因此,不到万不得已,请不要设定这种断点。 设定记忆体写入断点〔Set memory breakpoint on write〕 - 在整个记忆体块上设定断 点,每当该记忆体块被写入资料时程序都将中断。在Windows95/98下,当系统程序访问含 有记忆体断点的记忆体块时,可能会导致所被侦错程序崩溃,因此,不到万不得已,请不 要设定这种断点。 清除记忆体断点〔Remove memory breakpoint〕 - 清除记忆体断点。 清除自解压记忆体断点〔Remove SFX memory breakpoint〕 - 停止搜寻自解压程序〔 self-extractable (SFX) program〕的真实入口。这个搜寻使用了特殊档案类型的记忆体 断点。 访问设定〔Set access〕 -设定整个记忆体块的保护内容,可选项的有: 禁止访问〔No access〕 唯读〔Read only〕 读/写〔Read/write〕 执行〔Execute〕 执行/读〔Execute/read〕 完全访问〔Full access〕 复制到剪下板〔Copy to clipboard〕 整行〔Whole line〕 -以多行文本(包括解释)的方式把所选记录复制到剪下板,如果复 制时想排除某些列,可将该列的宽度置为最小(该栏剩余的边框将变灰)。 整个表格〔Whole table〕 -以多行文本的方式将整个记忆体映像讯息复制到剪下板,该 文本的第一行为视窗标题("记忆体映射〔Memory map〕"), 第二行为列标题栏,後面 几行的内容为记忆体资料记录。复制将保持列的宽度。如果复制时想排除某些列,可将该 列的宽度置为最小(该栏剩余的边框将变灰)。 十一,监视与监察器〔Watches and inspectors〕 监视〔Watch〕 视窗包含若干个陈述式〔expressions〕。它在第二列里显示这些陈述式 的值。OllyDbg 会把这些陈述式储存到主模组的.UDD文件中,因此它们在下一次侦错时同 样有效。 监察器〔inspector〕是显示若干变数、1/2维阵列或是选定项目结构阵列〔selected items of array of structures〕的独立视窗。它的陈述式与监视视窗中的基本相同,只 是多包含了两个参数:%A和%B。您可以指定这两个参数的界限,OllyDbg 将会用所有可能 的组合替代陈述式中的%A和%B。从0开始一直到界限(不包含界限),并在表格中显示结 果。参数%B(列数)的界限不能超过16。 例如,如果您指定了陈述式%A+%B,并且限定%A和%B的上限为3,您将获得如下的表格: 十三,执行绪〔Threads〕 OllyDbg 以简单而有效的执行绪管理为特色。如果您单步侦错、跟踪、执行到返回或者执 行到所选,则执行绪管理器将停止除当前执行绪以外的所有执行绪。即使当前执行绪被挂 起,它也会将其恢复。在这种情况下,如果您手动挂起或者恢复执行绪,动作将被延期。 如果您执行被侦错的应用程式,OllyDbg将恢复最初的执行绪状态。(从侦错器的角度来 看,Hit跟踪〔hit trace〕和自由执行是等效的)。 依据这种方案,执行绪视窗可能会有如下五种执行绪状态: 启动〔Active〕 - 执行绪执行中,或被侦错讯息暂停t 挂起〔Suspended〕 - 执行绪被挂起 跟踪〔Traced〕 - 执行绪被挂起,但OllyDbg正在单步跟踪此执行绪 暂停〔Paused〕 - 执行绪是活动的,但OllyDbg临时将其挂起,并在跟踪其它的执行绪 结束〔Finished〕 - 执行绪结束 . 执行绪视窗同时也显示了最後的执行绪错误(GetlastError函数的返回值)并计算该执行 绪以用户模式和系统模式(仅NT/2000/XP)执行的时间。执行绪视窗还会高亮主执行绪的 标帜符。 以下在快捷表单中可用: 重新整理〔Actualize〕 - 标记所有执行绪为旧的。 挂起〔Suspend〕 - 挂起执行绪。 恢复〔Resume〕 - 恢复先前挂起的执行绪。 设定优先等级〔Set priority〕 - 调整工作中执行绪的优先等级。以下选项可用: 空闲〔Idle〕 - 工作中执行绪的最低优先等级 最低〔Lowest〕 低〔Low〕 标准〔Normal〕 高〔High〕 最高〔Highest〕 时间临界〔Time critical〕 - 最高优先等级 在CPU视窗开启〔Open in CPU〕(双按)- 在CPU视窗中显示所选执行绪的当前状态。 十四,复制到剪下板〔Copy to clipboard〕 整行〔Whole line〕 -全部行--以多行文本的形式并带注释将所选记录复制到剪下板。如 果在复制时想排除某个栏目,可以将该栏的宽度置为最小(栏目的残留部分将变灰)。 整个表格〔Whole table〕 - 整个表格--以多行文本的形式将整个记忆体映像复制到剪下 板,该文本的第一行包含视窗标题(「记忆体映射〔Memory map〕」),第二行是栏目标 题,所有後继行是记忆体资料记录。复制将保持栏目的宽度。如果在复制时想排除某些栏 目,可以将该栏的宽度置为最小(栏目的残留部分将变灰)。 十五,使用栈〔Call stack〕 使用栈视窗(快捷键:Alt+K)根据选定执行绪的栈,尝试反向跟踪函数使用顺序并将其 显示出来,同时包含被使用函数的已知的或隐含的参数。如果使用函数新增了标准的堆叠 框架(PUSH EBP; MOV EBP,ESP),则这个工作非常容易完成。现代的最佳化编译器并不 会为栈框架而操心,所以OllyDbg另辟蹊径,采用了一个变通的办法。例如,跟踪程式码 到下一个返回处,并计算其中全部的压入推叠、出栈,及 ESP 的修改。如果不成功,则 尝试另外一种办法,这个办法风险更大,速度也更慢:移动栈,搜寻所有可能的返回位址 ,并检查这个位址是否被先前的已分析的指令使用。如果还不行,则会采用启发式搜寻。 栈移动〔Stack Walk〕可能会非常慢。OllyDbg 仅在使用栈视窗开启时才会使用。 使用栈视窗包含5个栏目:位址〔Address〕、栈〔Stack〕、程序〔Procedure〕,使用来 自〔Called from〕,框架〔Frame〕。位址〔Adress〕栏包含栈位址,栈〔Stack〕 栏显示了相应的返回位址或参数值。 函数〔Procedure〕(或 函数/参数〔Procedure / arguments〕)显示了被使用函数的位 址,在某些情况下,OllyDbg并不能保证该位址是正确的并会增加如上标记之一: ? 找到的入口点不可靠 可能〔Maybe〕 OllyDbg无法找到精确的入口点,报告的位址是用启发式算法猜测的。 包含〔Includes〕 OllyDbg无法找到入口点,仅知道该函数包含显示的位址 通过按例标题栏上的按钮或从表单中选项「隐藏/显示参数〔Hide/Show arguments〕」, 可以在显示或隐藏函数的参数之间切换。 使用来自〔Called from〕用於显示使用该函数的指令位址。最後一栏是框架〔Frame〕这 一栏预设值是隐藏的,如果框架游标的值(暂存器EBP)已知的话,则该栏用於显示这个 值。 当使用函数经过份析〔analyzed〕.後,栈移动会更可靠并且迅速。 十六,使用树〔Call tree〕 使用树(快捷键:在反汇编视窗中Ctrl+K)利用分析〔Analysis〕的结果来找出指定函数 程序直接或间接使用的函数列表,同时列出指定函数程序被使用的位址。为了避免由此可 能造成的副作用。使用树会判断选定函数是否明确地是递回的。「明确地」意味着它不会 跟踪目标未知的使用,比如CALL EAX。如果函数程序中有未知使用,使用树将会增加标记 「未知目标」。 某些函数使用将会增加如下注释之一: 叶子〔Leaf〕 不使用其他函数 纯函数〔Pure〕 不使用函数,不会产生副作用 单返回〔RETN〕 只有一个RETN 指令 系统〔Sys〕 系统动态连接库中的函数。系统动态连接库定义为储存在系统目录下的动态 连接库。 如果想在使用树上移动,可以双按「被使用〔Called from〕」或「使用/直接使用〔 Calls/Calls directly〕」两栏中的位址。使用树视窗储存了移动记录(快捷键「-」和 「+」)。 如果被侦错的程序包含几个模组,推荐您分析所有模组。Call tree 不会试图处理系统函 数。 十七,选项〔Options〕 外观选项〔Appearance options〕 一般〔General〕 预设值〔Defaults〕 对话视窗〔Dialogs〕 目录〔Directories〕 字体〔Fonts〕 颜色〔Colours〕 程式码高亮〔Code highlighting〕 侦错选项〔Debugging options〕 (Alt+O) 安全〔Security〕 侦错〔Debug〕 事件〔Events〕 异常〔Exceptions〕 跟踪〔Trace〕 自解压〔SFX〕 字串串〔Strings〕 位址〔Addresses〕 指令〔Commands〕 反汇编〔Disasm〕 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 在跟踪采取了保护或者反侦错技术的解压程序时通常会失败。 二十,单步执行与自动执行〔Step-by-step execution and animation〕 您可以通过按 F7(单步步入)或 F8(单步步过),对程序进行单步侦错。这两个单步执 行操作的主要区别在於:如果现用的指令是一个子函数,按F7,将会进入子函数,并停在 子函数的第一条指令上;而按 F8,将会一次执行完这个子函数。如果您单步步过的子函 数中含有断点或其他侦错事件,执行将会被暂停,但 OllyDbg 会在子函数的後一条指令 上,自动下一个断点,而这个断点您迟早会碰到。 如果被侦错程序停在异常上,您可以跳过它,并转到被侦错程序建立的关键句处。只需简 单的 Shift 键和任何一个单步指令。 如果需要连续按F7、F8键上百次,您可以使用自动执行(Ctrl+F7或者Ctrl+F8)功能。在 这种情况下,OllyDbg 将自动重复F7或者F8操作,并且既时更新所有的视窗。这个程序会 在下面情况停止: --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.115.4.134







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP