OllyDbg的help-怎样开始调试(翻译)
最简单的方法是启动OllyDbg,点击File|Open,然后选择你想调试的程序。程序需要命令行参数输入对话框下方的文本栏。
重新开始调试最后一个程序的快捷键是Ctrl+F2,并且OllyDbg使用相同的参数。 你也可以点选历史记录。把程序拖入OllyDbg也可以开始调试。 当然,当启动OllyDbg时,你在命令行中也能指定被调试的程序名和参数。比如: 你可以创建桌面快捷方式指向OllyDbg,选择属性,到快捷方式,把程序名加入目
标栏。每次你双击这个快捷图标,OllyDbg自动装载被调试程序。
你可以attach OllyDbg到某个正在运行的进程。点击File|Attach,从列表中选择 该进程。注意:当你关闭OllyDbg,这个进程也会终止。不要试图attach系统进程
,这很可能使系统完全SI机。(事实上,大多数情况下,OS不允许attach敏感进 程)
OllyDbg能作为just-in-time debugger。这需要在注册表中登记。点击
Options|Just-in-time debugging,在对话框中按“Make OllyDbg just-in-time debugger”。现在,当一些程序崩溃,你会被询问是否调试它。这样,操作系统 可以启动OllyDbg并直接停在异常发生处。如果你选择attaching without confirmation,OllyDbg不会询问直接启动。要恢复原来的just-in-time debugger,在出现的对话框中按相应的按纽就行了。
其它方法还有,把OllyDbg加入可执行文件的弹出式菜单。点击Options|Add to Explorer,按“Add OllyDbg to menu in Windows Explorer”。以后你可以右击 可执行文件点选OllyDbg。这个选项创建注册表键
HKEY_CLASSES_ROOT\\exefile\\shell\\Open with OllyDbg and
HKEY_CLASSES_ROOT\\exefile\\shell\\Open with OllyDbg\\command OllyDbg可以调试控制台(基于文本)程序。
注意:WindowsNT或Windows2000下,你必须有管理员权限 OllyDbg的help-通用快捷键(翻译) Golbal shortcuts(通用快捷键)
这些快捷键在OllyDbg中通用,不依赖于当前活动窗口。
Ctrl+F2---OllyDbg重置,重新开始调试。如果没有活动程序,OllyDbg装入历史列表中的第一个程序。OllyDbg重置会释放内存移除硬断点。
Alt+F2--关闭被调试的程序。如果程序还在活动状态,你会被询问是否执行该操作。
F3--显示“Open 32-bit .exe file”对话框,这里可以选择可执行文件和指定参数
Alt+F5--使OllyDbg显示在屏幕最前方。如果被调试程序中断时显示窗口遮住OllyDbg的一些区域,不继续运行又不能移动或最小化它。激活OllyDbg按Alt+F5可以解决。如果你再次按Alt+F5,OllyDbg会恢复为普通窗口。OllyDbg的当前状态显示在状态栏。
F7--step into,执行下一条简单命令。如果该命令是一个函数调用,进入调用函数内部。如果命令有REP前缀,执行该命令的一步操作。
Shift+F7--与F7相同,除了当被调试程序遇到某些异常时,首先尝试调用程序自己的异常处理过程。
Ctrl+F7--animate into,一步一步执行程序,也进入函数调用(就象你一直按着F7,不过更快)。当你执行一些单步或继续命令,程序到达有效断点,一些异常发生时,Animation终止。每步执行,OllyDbg重画所有窗口。要加速animation,关闭所有窗口而不要只改变现有窗口的大小。终止animation,也可按Esc。 F8-step over,执行下一条简单命令。如果该命令是一个函数调用,立刻执行完该函数(除非函数内部有断点或产生异常)如果命令有REP前缀,执行所有重复操作,并停于下一条命令。
Shift+F8--与F8相同,除了当被调试程序遇到某些异常时,首先尝试调用程序自己的异常处理过程。
Ctrl+F8--animate over,一步一步执行程序,但不进入函数调用(就象你一直按着F8,不过更快)。当你执行一些单步或继续命令,程序Animation到达有效断点或异常发生时,Animation终止。每步执行,OllyDbg重画所有窗口。要加速animation,关闭所有窗口而不要只改变现有窗口的大小。终止animation也可按Esc。
F9--继续执行程序。
Shift+F9--与F9相同。除了当被调试程序遇到某些异常时,首先尝试调用程序自己的异常处理过程。
Ctrl+F11--run trace into,一步一步执行程序,要进入函数调用,记录寄存器内容。Run trace 不重绘CPU窗口.
F12-悬挂所有线程以停止程序执行。最好用继续键和菜单命令(像F9)恢复执行线程,而不要用其它手动方法恢复。
Ctrl+F12--run trace over,一步一步执行程序,不进入函数调用,记录寄存器内容。Run trace不重绘CPU窗口。
ESC--如果animation或跟踪正在进行,将被终止。如果CPU窗口显示跟踪时的数据,此时转为显示实际数据。
Alt+B--打开或恢复Breakpoint窗口。这里可以编辑,删除和观察断点。 Alt+C--打开或恢复CPU窗口。 Alt+E--打开或恢复模块列表
Alt+E--打开或恢复Call stack窗口。 Alt+L--打开或恢复Log窗口。
Alt+M--打开或恢复Memory窗口。 Alt+O--打开Option对话框 Ctrl+P--打开Patch窗口。
Ctrl+T--打开Pause run trace对话框
Alt+X-中断OllyDbg。
多数窗口可以使用下列快捷键: Alt+F3--关闭活动窗口。 Ctrl+F4--关闭活动窗口。 F5--最大化或恢复活动窗口。 F6--激活下一个窗口。
Shift+F6--激活前一个窗口。
F10--打开激活窗口或面板的右键菜单。 LeftArrow--左移一个字符。 Ctrl+LeftArrow--左移一行。 RightArrow--右移一个字符。 Ctrl+RightArrow--右移一行。
OllyDbg的help-分析模块介绍(翻译) 分析
OllyDbg集成了快速超强的代码分析器。装载它,可以用弹出式菜单或者CPU窗口
的反汇编栏按Ctrl+A或者在执行模块选“Analyze all modules”。 分析器非常有用。它在数据中分辨代码,标记入口点和jump的目标,辨认switch tables,ASCII和UNICODE字符串,定位过程、循环、高级switch语句和解码标准
API函数参数(看范例)。OllyDbg的其它部分也广泛用于数据分析。
这怎么可能呢?我稍微介绍一下原理。首先,OllyDbg反汇编代码区所有可能的地
址,记下所有发现的调用及指向的目标。当然,许多这样的调用不正确,但是未 必会有两个错误的调用指向同一条命令,并且三个或三个以上更不可能。这样, 三个或更多调用指向同一地址,我就确信该地址是经常使用的子过程入口。从这 个入口开始,我跟踪所有的跳转和调用,反复操作。这种方法使我99.9%确定所 有命令。然而,某些字节不在这条链中,我采用大约20个更高效的方法(最简单 的如:“MOV [RA],Ra\"是无效命令).
过程检测也简单。过程,从分析器的角度看,就是从入口开始的代码的连续区域 ,(理论上)可以到达其它命令(除NOP或对齐填充外)。你可以指定三种识别级
。Strict级严格确认一个入口和至少一个出口。heuristical级,分析器尝试确认 入口。如果你选择fuzzy级,或多或少相容的代码区被分离为过程。现代编译器把
过程分成几个部分作公用代码优化。这种情况下,fuzzy级特别有用!然而,误解
的概率也相当高。
类似的,loop是一个封闭的连续命令序列,这里最后的命令跳到开头、一个入口 几个出口。Loop相当于高级操作语言中的do,while和for。OllyDbg能认识任何复
杂的嵌套循环。在反汇编区,他们用长长的大括号标记。如果入口不是循环的第 一条命令,OllyDbg用个小三角形作标记。
实现switch语句,多数编译器把switch变量装入寄存器,然后减去一部分,像下
面代码序列一样:
MOV EDX, JB DEFAULTCASE JE CASE100 ; Case 100 DEC EDX JNE DEFAULTCASE ... ; Case 101 这些序列也可能包含一级或两级switch表,直接比较,优化,填充等等。如果你 深入研究比较和跳转树,很难说哪一条命令是某个case语句。OllyDbg为你代劳。 它标记所有的case语句,包括default,甚至尝试猜测case的意思,如'A', WM_PAINT 或者 EXCEPTION_ACCESS_VIOLATION。如果命令序列不修改寄存器(只 由比较命令构成),那么不大可能是switch语句,但可能是if嵌套: if (i==0) {...} else if (i==5) {...} else if (i==10) {...} 让OllyDbg解码if嵌套为switch,选择Analysis1中相应的选项。 OllyDbg预置超过1900个常用API函数的描述。包括KERNEL32, GDI32, USER32, ADVAPI32, COMDLG32, SHELL32, VERSION, SHLWAPI, COMCTL32, WINSOCK, WS2_32 和 MSVCRT。你也可以加入自己的描述。如果分析器遇到已知函数名的调 用(或跳转到该函数),它尝试解码调用跟前的PUSH命令。因此,你可以粗略翻 译该调用的功能。OllyDbg也内置大约400个标准C函数的描述。如果你利用新库, 我建议你分析前先扫描对象文件。这种情况下,OllyDbg也会解码已知的C函数参 数。 如果选项“Guess number of arguments of unknown functions”被设置,分析 器尝试确认调用过程进栈的双字数目,并标记他们为参数Arg1,Arg2等等。注意: 如果有寄存器参数,OllyDbg还是不认识也不包括在上面的统计中。分析器采用了 一个安全的方法。例如,它不分辨无参数过程和返回前用POP恢复寄存器代替舍弃 参数的case语句。然而,能分辨出的函数数目相当多,并非常有助于提高代码的 可读性。 分析器能跟踪寄存器的值。现代优化编译器,特别是面向Pentium的,经常把常 量 和地址装入寄存器便于重复使用或减小内存占用空间。如果一些常量装入寄存器 ,分析器会注意它,并用于解码函数及其参数。还能执行简单的算术计算跟踪 push和pop命令。 分析器不能区别不同类型的名字。如果你用已有的名字命名一些函数,OllyDbg会 解码所有该地址的调用为原过程。WinMain,DllEntryPoint和WinProc是特殊的预 定义名。你可以使用这些标号标记主程序入口,DLL入口指针和window过程(注意 :OllyDbg不会检查用户定义标号的唯一性)。当然,最好的方法是显示已定义的 参数。 非常不幸,没有一般的规则用于100%的准确分析。有些情况下,例如当模块包含 p-代码或者代码区嵌入大量数据,分析器可能认为部分数据是代码。如果统计分 析显示代码可能被打包或加密,分析器会警告你。如果你想用hit跟踪方式,我建 议你不要用fuzzy分析方式,否则断点被设置在被误认为代码的数据上的几率很高。 自解压文件通常在主体代码外有解压代码。如果你选择SFX选项“Extend code section to include self-extractor”,OllyDbg会扩大代码区,形式上允许分 析它并跟踪。 OllDbg的一般原理(翻译)部分 我希望你熟悉80x86兼容CPU的内部结构,并且有汇编写程序的经历。我也希望你 熟悉Microsoft Windows. OllyDbg是一个单进程多线程的“机器代码级”debugger,用于Windows环境下的32位程序。它允许你debug和patch PE格式的可执行程序。OllDbg仅仅使用列入文档的Win32 API调用,所以可用于下一代32位Windows系统。OllDbg看来也可工作于Windows XP,但是我没有详尽的测试,因此不能保证功能完整。 OllyDbg不是面向编译器。它不含特别的规则显示某些情况下特定的编译程序生成哪些代码序列。因此,你可以一样对待任何编译器编译的,或者汇编书写的任何代码。 OllyDbg与被调试的程序同时工作。你可以浏览代码和数据、设置断点、停止或继续线程,甚至运行期修改内存(有时这叫作软调试方式)。当然,如果被请求的操作不是最基本的,OllyDbg就会短时暂停程序,但这对用户透明。有时不在调试状态运行的程序会意外崩溃。OllyDbg,这个“及时”debugger,会指出异常发生的位置。 OllyDbg强烈面向模块。模块这里指启动时加载的或动态加载的主执行文件或动态连接库。在调试区,你可以设置断点,定义新标号和注释汇编语句。当一些模块从内存卸载后,OllyDbg保存这些信息到扩展名为.UDD名字同被调试模块的文件中。下次当装载这些模块时,OllyDbg自动复原所有调试信息,不论程序是否使用这些模块。比如:你调试使用Mydll的程序Myprog1,并且在Mydll中设 置一些断点。那么当你调试Myprog2时,也使用Mydll,你会发现所有在Mydll中的断点还在那里,不管Mydll是否装载在不同的位置。 一些调试器把被调试进程的内存视为单个2**32字节区域。OllyDbg做了别的处理方法。内存由几个的块组成。任何内存操作都于块内。在大多数案例中,这工作优良并且容易调试。但是模块包含几个执行部分等等,你将不能立刻看到整个代码。然而这些例外不常见。 OllyDbg是内存消耗大户。启动时就要分配3MB内存,甚至更多。每次分析,备份,跟踪或文件转储另外再分配。所以当你调试大工程时消耗40或60M内存很正常。 要有效的调试一些无源代码的程序,你首先必须理解它是如何工作的。OllyDbg提供了大量的手段使理解更容易 [ 本帖最后由 渔歌子 于 2005-12-22 23:16 编辑 ] 转Draren总结的ollydbg v1.09d 中文版使用说明 一点一滴的积累,也就会了. 之所以选择ollydbg 1.我的os是winXP,无法使用trw2000,而softice装了多次均未成功,还蓝屏死机多次.郁闷. 2.友好的gui界面,不像softice.可以边干活边听歌,不像softice,把整个os都挂起了.多用两次,连时间都不知道了. 3.强大的内存查看功能,再不用什么-d了,而且跳转方便,爽!一目了然. 4.强大的右键菜单功能 ollydbg的界面: 菜单: 文件: 1.其中包括该菜单的下部有上次打开的纪录,该纪录保存有上次未清除的断点. 2.附加.对付那些Anti-Debug程序.先运行程序,再运行od,文件-->附加. 查看: 1.执行模块(Alt+E),查看程序使用的动态链接库 2.查看断点.Alt+B 调试: 1.运行(F9)加载程序后,运行! 2.暂停(F12) 3.单步进入(F7)遇见CALL进入!进入该子程序. 4.单步跳过(F8)遇见CALL不进去! 5.执行到返回(ALT+F9)就是执行到该子程的返回语句 ollydbg的16进制编辑功能.类似与hiew,hex workshop 查看-->文件 二进制文件编辑功能.查看-->文件,打开的文件是二进制显示.选中要改变的机器指令,空格,修改,右击-->保存. ollydbg的四个区域 左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值. 右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色显示. cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态. 不错; 左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息; 右下角的是当前堆栈情况,还有注释啊. F3选择打开程序. 使用 F9执行程序. 下断点: 1.对函数下下断点 在代码区右击-->搜索-->当前模块中的名称(ctrl+N),在跳出来的对话框中选择需要下的断点函数.->右击->查找导入参考(enter),按F2下断点.如果有多个地方调用了该函数就这样操作。 2.在需要的地方下断点 F2 添加注释: 在代码区第四列,右击-->注释 查看内存地址 右击内存地址列-->前往-->输入要查看的内存地址 在函数lstrlen的注释的上方,有一个变量string,当执行到该函数的时候,string后面会出现lstrlen函数的参数字符串.在实际使用中一般是输入的字符串.(很好用哦) 类似的还有lstrcmp,上面有string1,string2能够显示将要比较的两个字符串. 另外,一般在执行getwindowtext等函数后,右边寄存器列,eax会显示函数的返回值,即取到的内容.同时内存中也会有显示. 在反汇编中选中一条命令,如果其中有用到内存中的地址,右击-->在转存中跟随-->直接常数 此时内存地址会显示指令中引用到的内存字符 拷贝功能十分强大.直接选择要拷贝的内容.右击-->复制-->文件or剪贴板 ollydbg的条件断点可以按寄存器,存储器,消息(必须是消息的数字,如wm_command就是111)等等设断,非常强大,一旦设了之后记录到文件中,下次restart程序还能用,不用拿笔记,很方便。 显示跳转路进: 选项-->调试设置-->cpu页-->显示跳转的方向,显示跳转的路径,如果跳转没有实现则显示灰色路径。在cpu窗口中,机器码的前面显示\">\"符号.同时,在cpu窗口下的小缝中会显示跳转路径,从何跳转而来.右击-->前往...一般都是条件跳转,上面的内容就是比较的地方啦。:) 跟踪功能: 选项-->调试跟踪-->跟踪:设置运行跟踪的缓存大小.越大越好. 调试-->打开或清除运行跟踪 然后我们就可以用CTRL+F11或CTRL+F12开启“跟踪进入”和“ 跟踪跳过”了。当我们暂停程序的时候,可以用小键盘上的“+”,“-”,“*”来控制跟踪功能了。 其中,“跟踪进入”和运行类似,但是记录所有指令以及寄存器变化。并且会自动进入所有的CALL中。 “ 跟踪跳过”和“跟踪进入”类似,但是不进入CALL “+”用来显示跟踪缓冲区中的下一条指令 “-”用来显示跟踪缓冲区中的上一条指令 “*”用来发返回当前指令 让OD显示MFC42.DLL中的函数 打开调试-->选择导入库-->添加-->选择MFC43.LIB加入.重新载入MFC程序,就可以看到call后面的api函数了. 动态暂停以messagebox为例) 先运行目标程序,再运行od,选择文件-->附加.在目标程序运行出现对话框时,切换至od,F12暂停. 字符串参考: 在汇编代码区,右击-->搜索-->字符参考 更改二进制文件: 方法1.查看-->文件,打开文件,找到欲修改的偏移,使用机器码修改,然后右击保存文件.缺点是需要使用其他软件来获取偏移地址. 方法2.直接在反汇编代码区更改,这时可以使用汇编代码更改,不用记机器码.完了.右击-->复制到可执行文件-->保存文件.很是方便哪! 关于虚拟地址和偏移地址: ollydbg果然强大,太强大了,在欲修改的指令处右击-->复制到可执行文件,弹出窗口中光标所在行即是欲修改的指令所在的偏移地址,右击-->汇编,直接修改汇编指令,不用记机器码,又不用虚拟地址到偏移地址的转换.改完后保存文件.爽丫! olldbg 下怎么下消息断点? 如在softice 中下 BMSG 0084 WM_DESTROY,在olldbg下该怎么做? 不如下断 SendMessage,PostMessage,程序中的消息不一定都经过消息循环。 Ollydbg下消息断点的一个方法 原文: SoftIce can trace application messages. And Olly? by FuZzYBiT SoftIce can trace application messages. And Olly? And so does OllyDbg. That’s a very “hidden feature”. I guess it is sooo useful. 1. Open program 2. Names window [CTRL+N in CPU Window] 3. Find User32.TranslateMessage API 4. right click/FindReferences 5. conditional breakpoint [SHIFT+F4] 6. expression: MSG 7. Log function arguments: Always If you cannot find it, try right click SEARCH FOR-> ALL INTERMODULAR CALLS. But if I want to trap a specific message like WM_COMMAND? To Log Only WM_COMMAND Do it in this fashion: 1. Open program 2. Names window [CTRL+N in CPU Window] 3. Find User32.TranslateMessage API 4. right click/FindReferences 5. conditional breakpoint [SHIFT+F4] 6. Condtion box: MSG==WM_COMMAND 7. Log function arguments: On Condition If you can’t find User32.TranslateMessage API, do the same as above. 翻译: SoftIce 能够跟踪应用程序的消息,那么OllyDbg呢? by FuZzYBiT OllyDbg也是可以的,那是一个非常\"隐蔽的功能\"。它是如此的有用。 1. 打开程序 2. 名字窗口[ 在CPU窗口中按CTRL+N ] 3. 查找 User32.TranslateMessage API 4. 右击/FindReferences(查找参考) 5. 下条件断点 [SHIFT+F4] 6. 表达式: MSG 7. 记录函数参数:永远 如果你不能找到它,试试右击鼠标,然后搜索全部模块中的名称。 但是如果我想要捕捉一个特定的消息如WM_COMMAND呢? 只对WM_COMMAND记录 用这个方法做: 1. 打开一个程序 2. 名字窗口[ 在CPU窗口中按CTRL+N ] 3. 查找 User32.TranslateMessage API 4. 右击/FindReferences(查找参考) 5. 下条件断点 [SHIFT+F4] 6. 条件框:MSG==WM_COMMAND 7. 记录函数参数: 条件满足时 如果你不能找到User32.TranslateMessage API,象上面那样做。 以下命令适用于 OllyDbg 的命令行插件 Cmdline.dll(显示于程序的插件菜单中) 聆风听雨整理 =============================================================== 命令行插件支持的命令 CALC 判断表达式 WATCH 添加监视表达式 AT 在指定地址进行反汇编 FOLLOW 跟随命令 ORIG 反汇编于 EIP DUMP 在指定地址进行转存 DA 转存为反汇编代码 DB 使用十六进制字节格式转存 DC 使用 ASCII 格式转存 DD 转存在堆栈格式 DU 转存在 UNICODE 格式 DW 使用十六进制字词格式转存 STK 前往堆栈中的地址 AS (AS + 地址 + 字符串) 在指定地址进行汇编 BP 进行条件中断(有条件的断点) BPX 中断在全部调用 (Call) BPD 清除全部调用中的断点 BC 清除断点 MR 内存断点于访问时 MW 内存断点于写入时 MD 清除内存断点 HR 访问时进行硬件中断 HW 写入时进行硬件中断 HE 执行时进行硬件中断 HD 清除硬件断点 STOP 停止运行程序调试 PAUSE 暂停执行程序调试 RUN 运行程序进行调试 GE 运行和通过例外 SI 单步进入 Call 中 SO 步过 Call TI 跟踪进入直到地址 TO 跟踪步过直到地址 TC 跟踪进入直到满足条件 TOC 跟踪步过直到满足条件 TR 运行直到返回 TU 运行直到用户代码 LOG 查看记录窗口 MOD 查看模块窗口 MEM 查看内存窗口 CPU 查看 CPU 窗口 CS 查看 Call 堆栈 BRK 查看断点窗口 OPT 打开选项设置窗口 EXIT 退出 OllyDbg QUIT 退出 OllyDbg OPEN 打开一个可执行文件 CLOSE 关闭可执行文件 RST 重新运行当前程序 HELP 查看 API 函数的帮助 OllyDbg应用方法大全--请补充! 所有文章均为散落在DFCG论坛各处或其他网络文集的经典。 雪很冷搜集整理于学习笔记或与朋友讨论之中 Ollydbg 中断方法 Quote: Originally posted by dong at 2004-6-1 10:29 PM: 我问个问题 在od中怎么下断点呢?? 现在有的程序一点注册就没反映了 这样的怎么下断点呢?? 能介绍下什么情况下什么断点吗? 在转存中下硬件访问->Word\"断点,下断之后,怎么取消! 93944(老菜鸟) 11:09:59 alt+D 按H 然后删除 这个没有万能的方法,只能视具体情况而定,就我的经验而言: 第一步,反汇编找有用信息,有时候虽然点击注册按钮后,没有任何反映,但软件也许包含了可用的信息,比如“未注册”,“已注册”等等之类的,都可用做断点的。 第二步,如果反汇编也找不到有用信息,如果用OD可以下HMEMECPY断点,在每个调用的函数上下断,虽然这个法子太笨,但我试过,几乎有70%以上的机 会可找到断点,找到断点后再慢慢跟吧!这只是个人的看法,关键只要找到断点,有什么办法都无所谓。 在命令行下bpx hmemcpy断点,然后回车,在每个调用的函数上下断。 有的程序甚至无法用API中断,可以在OD载入程序后上下翻动反汇编窗口查看字符串参考下断,在反汇编窗口里直接找到的,右键查找那里找不到 转发Ollydbg 中断方法浅探-各种断点常识知识 Ollydbg 中断方法浅探 ――国庆节小礼 Ollydbg是一个新的32位的汇编层调试软件。适应于windows98、me、2000、xp和2003操作系统。由于他具有图形窗口界面,所以操作方便、直观,是cracker的好工具。 由于Ollydbg没有了TRW2000的万能断点,所以许多的新手感觉到用Ollydbg断点不好找。现在我来的说说Ollydbg下中断的几种方法。本人是个菜鸟,水平有限,可能不能完整的写出来,也可能存在错误。请大家指正。 我所表述的是Ollydbg v1.09d中文版,其他版本和英文版下自己参考。 第一 寻常断点 Ollydbg中一般下中断的方法,就是在程序的地址处用鼠标选择这一行。然后按F2键,这时被选择的那一行的地址会变成别的颜色,就表示这个地址处下了中断。然后运行程序时只有到这个地址处就会被Ollydbg中断。 这个方法用的比较多,所以把他称作寻常断点。 如果有命令行插件,就可以在命令窗口中输入BPX xxxxxxxx 下断点。 优点:只要自己怀疑是重要的代码处都可以下这种下断点,不受条件的,所以方便实用。 缺点:如果不知道代码功能下断点具有盲目性。 第二 API断点 Ollydbg中一般下API中断的方法,有二种。 1. 在代码窗口中点鼠标右键,出现功能菜单。在[搜索]选择项下有〔当前模块的名称〕和〔全部模块的名称〕俩项,选择其中的一项就打开了程序调用API的窗口,在这个窗口中选择你要跟踪的API函数名。双击这个函数就能到程序的调用地址处。然后用F2下中断。也可以在API窗口中选择需要跟踪的函数点鼠标右键出现功能菜单,选择〔在每个参考设置断点〕。同样下了断点。 快捷方式:Ctrl+N 2. 在命令行窗口中输入BPX API函数名或者BP API函数名 后回车。这时出现了所有调用这个函数的地址的窗口,在这个窗口中可以看到调用这个API函数的地址已改变了颜色。说明下好了断点。 说明一下:BPX一般中断在程序调用API的地址处。BP会中断在API的写入地址处。二这有所不同,根据需要选择。 优点:这种方法下的断点是针对每一个API函数的,所以具有明确的目的。 缺点:关键的API函数不容易找到。所以有时下的断点没有作用。 第三 内存断点(跟踪关键数据的断点) Ollydbg中的内存断点相当于TRW中的bpm 断点。 下断点的方法是:在程序运行中断时选择界面中的转存窗口,用光标选择内存中的一段关键数据(颜色会改变),然后右击鼠标出现功能菜单。选择〔断点〕项,其中有二个选择〔内存访问〕和〔内存写入〕。 〔内存访问〕断点是程序运行时要调用被选择的内存数据时就会被Ollydbg中断,根据这个特点在破解跟踪时只要在关键数据内存中下中断就可以知道程序在什么地方和什么时候用到了跟踪的数据。对于一些复杂算法和流程变态的算法跟踪有很大的帮助。从破解上讲,一个注册码的生成一定是由一些关键数据或者原始数据计算来的。所以在内存中一定要用到这些关键数据。那么〔内存访问〕断点就是最好的中断方法。 〔内存写入〕断点是程序运行时向被选择的内存地址写入数据时就会被Ollydbg中断。根据这个特点在破解时可以跟踪一个关键数据是什么时候生成的,生成的代码段在那个地方。所以一个关键的数据如果不知道他的由来就可以用〔内存访问〕断点查找计算的核心。 内存中断的下断点还有另外的一种方法:程序运行时如果知道关键的数据,比如我们输入的试验码、程序生成的序列号等。这时在内存中一定存在这些数据。用Alt+M打开内存窗口,在这个窗口中搜索知道的关键数据。用光标选择这些数据同样下内存中断,这种方法更容易找的关键的数据。 优点:断点是直接面向关键数据的,所以比较容易到核心部分。 缺点:内存断点重新运行后会消失,干扰比较多。 第四 硬件断点(跟踪关键标志的断点) 硬件断点是Olldbg所特有的断点,他不会因为重新运行就销毁,只要不删除。跟踪这个程序时就有效。但他在98系统下会不起作用。 硬件断点是根据关键标志回逆到关键代码的好方法。下中断的方法和内存断点的方法相同,有三个方式〔硬件访问〕、〔硬件写入〕、〔硬件执行〕。一般用前2个。他也同样有内存断点的特性,所以可以用内存断点的地方也可以用硬件断点。这里介绍利用他来跟踪注册标志的使用方法,一般软件的注册都用到了标志比较。即在内存地址中有一个标志,在判断是不是注册时比较标志的值。不同的值表示不同的注册状态。这个标志的地址一般比较固定。根据这个特点可以下硬件断点来跟踪标志位是什么地方被标志的。 方法:在转存窗口中选择到标志存放的内存地址处,然后选择标志值。下〔硬件写入〕中断(根据标志的字节下不同的长度)。重新运行程序你会发现Ollydbg会不断的中断在这个标志的内存地址处。在功能菜单的〔调试〕选项下选择〔硬件断点〕就打开了硬件断点的窗口,在这个窗口中选择〔跟踪〕,这时转存窗口就会来到被下中断的内存地址处。运行程序跟踪内存地址中的值就会知道被赋标志的代码,跟踪到计算的核心。〔硬件访问〕的使用可以知道程序在运行时多少地方用到了这个注册标志。对于破解复杂效验的程序十分的有效。 直接在命令栏里下bh ****硬件断点 以上只是我的总结,本想每个方法用一段例子,无奈时间有限,请大家原谅了。 当然,还是许多的下中断的方法,本人水平有限,不能一一尽述。只当抛砖引玉,请大侠们赐教。 Fxyang 属于中国破解组织[OCN][BCG][FCG] 2003-10-1 欢迎!我高兴地为你推出命令行插件的初始版本,功能很有限但非常适用。它的源代码是自由的,因此你可以添加任意的命令和修改现存的功能。插件所使用的 OllyDbg 新函数在PDK 1.08中有详细的描述。 注意该插件不能工作在1.08及以前版本的 OllyDbg中。 命令行插件的快捷组合键:Alt+F1。目前,它支持如下的命令: 表达式 CALC 表达式 计算表达式的值 ? 表达式 同上 表达式 (第一个字符不能是字母) 同上 WATCH 表达式 添加监视 W 表达式 同上 反汇编器 AT 表达式 在反汇编中跟随 FOLLOW 表达式 同上 ORIG 前往实际的 EIP * 同上 转存和堆栈 D 表达式 在转存中跟随 DUMP 表达式 同上 DA [表达式] 转存为汇编格式 DB [表达式] 转存为十六进制(hex)字节格式 DC [表达式] 作为ASCII 文本转存 DD [表达式] 作为地址(堆栈格式)转存 DU [表达式] 作为 UNICODE 文本转存 DW [表达式] 转存为十六进制(hex)字格式 STK 表达式 在堆栈中跟随 汇编 A 表达式 [,命令] 在地址处汇编 标号和注释 L 表达式, 标号 为地址指派符号标号 C 表达式, 注释 在地址处作注释 断点命令 BP 表达式 [,条件] 在地址处设置 INT3 断点 BPX 标号 在当前模块内部的每个调用外部'标号'处设置断点 BC 表达式 删除地址处的断点 MR 表达式1 [,表达式2] 设置访问范围的内存断点 MW 表达式1 [,表达式2] 设置写入范围的内存断点 MD 移除内存断点 HR 表达式 在访问地址处设置一个字节的硬件断点 HW 表达式 在写入地址处设置一个字节的的硬件断点 HE 表达式 在执行地址处设置硬件断点 HD [表达式] 移除地址处的硬件断点 跟踪命令 STOP 暂停执行 PAUSE 同上 RUN 运行程序 G [表达式] 运行到地址处 GE [表达式] 跳过意外的句柄并运行到地址处 S 单步进入 SI 同上 SO 单步跳过 T [表达式] 跟踪进入到地址处 TI [表达式] 同上 TO [表达式] 跟踪跳过到地址处 TC 条件 跟踪进入到条件处 TOC 条件 跟踪跳过到条件处 TR 执行到返回 TU 执行到用户代码 OllyDbg 窗口 LOG 查看日志窗口 MOD 查看可执行模块 MEM 查看内存窗口 CPU 查看 CPU 窗口 CS 查看调用堆栈 BRK 查看断点窗口 OPT 编辑选项 杂项命令 EXIT 关闭 OllyDbg QUIT 同上 OPEN [文件名] 打开待调试的可执行文件 CLOSE 关闭调试的程序 RST 重新载入当前程序 HELP 显示本帮助 HELP OllyDbg 显示 OllyDbg 帮助 HELP API函数帮助完整文件名 显示 API 函数帮助 命令不区分大小写, 中括号中的参数是可选的。表达式可以包含常量, 寄存器和内存参考并支持所有标准的算术和逻辑操作符。默认情况下,所有常量都是十六进制的数。要标记为十进制的常量,紧接着使用十进制标明。例如: ?2+2 ?计算该表达式的值; ?AT [EAX+10] ?在地址EAX+0x10处开始的双字长度内存的内容反汇编; ?BP KERNEL32.GetProcAddress ?设置 API 函数断点。注意:你仅可以在基于 NT 系统的系统 DLL 上设置断点; ?BPX GetProcAddress ?在当前所选模块中的每个调用外部函数 GetProcAddress 处设置断点; ?BP 412010,EAX==WM_CLOSE - 在 0x412010 处设置条件断点。当 EAX 的值等于WM_CLOSE 时程序暂停。 你可以在 OllyDbg 帮助中找到 OllyDbg 支持的完整的表达式描述。 译者注:由于本人的“E”文水平有限,加之对该插件和与之相关的ollydbg 软件以及其他知识的理解深度不足,译文难免在很多地方产生歧义甚至在语义上根本不通顺,鉴此,欢迎各位专业人士积极修正。汉化: 网络浪子工作室 如何添加新命令: 要添加新命令,首先你必须在数组 cmdlist[] 里注册它。数组的元素是结构类型的 t_command. 第一个元素是大写字母的命令,第二个元素描述它的操作数。当前版本的插件只支持三种类型的操作数: A ?在 address 中使用值的地址表达式 address. 插件检查为它已分配内存的指针。 a ?等同于 A 但可选。如果未指定表达式,address 被置为0。 V ?在value 中任意类型的表达式。如果你期望整数表达式,检查 value.dtype 是 DEC_DWORD 并使用 value.u 的内容。 v ?等同于 V 但可选。如果未指定表达式,value.dtype 是 DEC_UNKNOWN 并 value.u 为 0。 S - 在 string 中的 ASCII 串,可能为空。 第三个元素是将被跳过命令过程的常量,第四个是执行命令的过程地址: typedef int t_exefunc(char *answer,ulong parm); 如果可识别命令的所有操作数被正确解析和评估,插件调用该过程。首先是变元,answer,是长256个字节的串指针。命令被执行后它的内容会被显示在命令行窗口中。第二个变元是从 cmdlsit[] 取出的参数。如果函数的返回值为 0,说明命令正确执行并将其添加到历史列表中。 ollydbg1.10汉化版有些地方意思翻译得不准确 例如“调试选项”中的\"sfx\"中的“停止在自释放解释器的入口”这句话的翻译根本就是错的。原文是Stop at entry of self-extractor,原文意思为“OllyDbg doesn't attempt to trace real entry.”就是“Ollydbg不试图跟踪真实入口”。还有一些类似的翻译也是错的。容易引起误解,建议大家还是用英文原版,不懂的看帮助文件。 请教:怎么在OLLYDBG中保存当前正在调试的程序? 在代码区修改程序后,点右键-》复制到可执行文件-》选择部分,在弹出的窗口里点右键-》保存文件。起个文件名吧。 OllyDbg 常用快捷热键 聆风听雨整理 ============================================================= == 打开一个新的可执行程序 (F3) 重新运行当前调试的程序 (Ctrl+F2) 当前调试的程序 (Alt+F2) 运行选定的程序进行调试 (F9) 暂时停止被调试程序的执行 (F12) 单步进入被调试程序的 Call 中 (F7) 步过被调试程序的 Call (F8) 跟入被调试程序的 Call 中 (Ctrl+F11) 跟踪时跳过被调试程序的 Call (Ctrl+F12) 执行直到返回 (Ctrl+F9) 显示记录窗口 (Alt+L) 显示模块窗口 (Alt+E) 显示内存窗口 (Alt+M) 显示 CPU 窗口 (Alt+C) 显示补丁窗口 (Ctrl+P) 显示呼叫堆栈 (Alt+K) 显示断点窗口 (Alt+B) 打开调试选项窗口 (Alt+O) 我想知道在OD中如何下地址断点 比如bpx 5022e2 是不是在命令行中?有其他办法没? 命令行在98下不能用 ctrl+g输入地址,F2下断 请问用ollydbg如何跟踪被跟踪进程的子进程 我在跟踪一个程序的时候,它用CreatProgressA产生了一个子进程,然后关闭父进程,请问我如何在子进程的入口处下断?请高手指教! 指令为: 004476 50 PUSH EAX 004477 6A 00 PUSH 0 004479 E8 C218FBFF CALL kernel32.CreateProcessA 004479处堆栈内容如下: 0012FD40 00000000 |ModuleFileName = NULL 0012FD44 00956B94 |CommandLine = \"C:\\QXJDGL\\QXJDGL.DLL 2\" 0012FD48 00000000 |pProcessSecurity = NULL 0012FD4C 00000000 |pThreadSecurity = NULL 0012FD50 00000000 |InheritHandles = FALSE 0012FD 00000020 |CreationFlags = NORMAL_PRIORITY_CLASS 0012FD58 00000000 |pEnvironment = NULL 0012FD5C 00000000 |CurrentDir = NULL 0012FD60 0012FD84 |pStartupInfo = 0012FD84 0012FD 0012FD74 \\pProcessInfo = 0012FD74 飞叶流枫回答: C:\\QXJDGL\\QXJDGL.DLL 2,这个程序是一个EXE程序,你可以改入口点为INT 3,也就是CCh,将OD设为最终异常处理程序。当程序启动的时候会产生一个INT 3非法操作,你点调试就可以中断在QXJDGL.DLL中了。 用修改版OD脱DLL壳的问题: 请教脱DLL壳时如何在载入DLL后退出,即卸载laddll 因为我看到书上说到的DLL脱壳全部是用TRW,而我却不知道如何用OD来具体操作 脱DLL,研究了几天无果。 和脱EXE绝对不一样。 DLL调用时两次用到入口点的。载入DLL和卸掉DLL时各一次 根据看雪破解2要求,一般在第2次解压调用时脱壳。 可是教材完全是用TRW,我就是不会用OD操作。 如果和EXE操作步骤一样就好办了 载入DLL 停在 10001000 /$ 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] 10001004 |. A3 5A0010 MOV DWORD PTR DS:[10009A58],EAX 10001009 |. B8 01000000 MOV EAX,1 1000100E \\. C2 0C00 RETN 0C 10001011 90 NOP 10001012 90 NOP 10001013 90 NOP 点菜单 查看 执行模块 右键相击对应模块 点跟随入口 可以得到入口程序 1000E001 > 60 PUSHAD 1000E002 E8 03000000 CALL CAPTUREH.1000E00A 1000E007 - E9 EB045D45 JMP 555DE4F7 1000E00C 55 PUSH EBP 1000E00D C3 RETN 1000E00E E8 01000000 CALL CAPTUREH.1000E014 1000E013 EB 5D JMP SHORT CAPTUREH.1000E072 1000E015 BB EDFFFFFF MOV EBX,-13 1000E01A 03DD ADD EBX,EBP 1000E01C 81EB 00E00000 SUB EBX,0E000 1000E022 83BD 22040000 0>CMP DWORD PTR SS:[EBP+422],0 1000E029 9D 22040000 MOV DWORD PTR SS:[EBP+422],EBX 1000E02F 0F85 65030000 JNZ CAPTUREH.1000E39A 1000E035 8D85 2E040000 LEA EAX,DWORD PTR SS:[EBP+42E] 但估计这是第一次解压DLL程序,DLL和EXE不同,无法跟踪。 教材中提到,卸载DLL时第2次调用解压。达到入口点 可能可以跟踪,但我不知道用OD如何卸掉DLL 兄弟是什么系统。莫非又是98在作怪 用的也是win98系统呀。对了,你用的OD是什么版本的,我的是10.0C汉化版 用原版OD后一切问题解决: 很简单,脱Dll的壳和EXE的方法一样,比如一个dll用UPX加的壳,你在载入的时候他会提示载入laddll,选是,然后选不分析,接下来就和脱EXE一样了,只要注意一下地址就行了,如EXE的虚拟地址是00400000,而Dll的地址是01000000的。但在修正入口的时候还是和EXE一样。如Dll入口地址是01001000的话,在修正入口点的时候应该是00001000才对。 你放上的附件是ASPACK2.12加的壳,脱壳后用FI查是C++编的,你先用OD载入这个dll,OD会提示用载入laddll,选是,然后选不继续分析,中断在壳的入口点。你先按F9运行程序,这时OD又会中断,在左下角提示dll初始化完成,你再按一下F9运行。这时Laddll就会启运一个程序窗口,你再关闭这个窗口,这个程序窗口就会卸载这个Dll了,这时OD又会中断在dll的入口,这时你就可以像脱EXE程序一样了。最后,谢谢你的程序(Dll),使我复习了一下脱Dll的方法并脱壳成功,只是不知能不能运行,现附上我脱的Dll: 我明白了,你用的是修改后的OD,现在你用没有修改过的OD试一试就不会有这个问题了。忘了说,我一般是用没有修改过的OD的。只是有时用一下。刚才我用修改过的OD载入也出现和你一样的问题,这个可能是二哥修改过的OD的Bug吧? 以上是战神和雪很冷的脱DLL壳讨论稿 转OllyDbg实用技巧六则 标题: OllyDbg实用技巧六则 作者: dOSKEY lEE 关键词: OllyDbg、OD、技巧 1、让跳转路径显示出来 打开Options\\Debugging Option。弹出Debugging Option对话框,选择CPU页,选定“Show direction to jumps”、“Show jump path”和“Show grayed path if jump is not taken”。如此以来在 Disassembler窗口就会显示跳转的路径了。 2、让OD显示MFC42.DLL中的函数 如果程序是用MFC进行的动态编译,那么在OD中将只能显示MFC42.DLL中的函数为: 00410E40 |. E8 43000000 CALL “Add”,在弹出的打开文件对话框中选择“MFC42.LIB”并打开,重新载入MFC程序,你就可以看见函数名称变为: 00410E40 |. E8 43000000 CALL IDA中分析出了来的东西一样了!呵呵,以后不用等待IDA的“细嚼慢咽”也可以轻松搞定MFC程序了。其他的DLL类似,如果有序号,可以在VC的LIB目录中找到相关的.LIB文件,加到OD中便可。如果你没有“MFC42.DLL”,你可以的到看学论坛的下载区找,我已经上传到那里了。 3、让OD轻松躲过“ANTI-DEBUG” 很多“ANTI-DEBUG”的程序都是在程序开始时来检查是否安装调试器的。用这种特性我们可以轻松的用OD的“Attach”绕过检查部分。如“X语言”,如果你哟内TRW2K/S-ICE/OD 直接加载它的话,程序回警告你安装了调试器并结束。但是我们在“X语言”开启后再运行OD,并用“Attach”系上它就就可以了,轻松通过检查。而且在OD系上它后仍然可以用CTRL+A进行分析。如此一来,快哉!:) 4、轻松对付调用“MessageBoxA”以及类似的模态对话框的程序 很多人都认为OD不好拦截“MessageBoxA”这类API函数。其实我们有个很简单的办法将API拦截下来,并且快速找到比较地点/主算法地点。首先用OD加载目标程序,如果不能加载,用上面的方法“Attach”目标程序。然后,F9运行目标程序,并且有意让目标程序显示“ MessageBox”,然后切换到OD中,F12暂停,如 0041201F |> 53 PUSH EBX ; /Style 00412020 |. 57 PUSH EDI ; |Title 00412021 |. FF75 08 PUSH [ARG.1] ; |Text 00412024 |. FF75 F4 PUSH [LOCAL.3] ; |hOwner 00412027 |. FF15 A8534100 CALL DWORD PTR DS:[4153A8] ; \\MessageBoxA 0041202D |. 85F6 TEST ESI, ESI ; 停在此处 0041202F |. 8BF8 MOV EDI, EAX 00412031 |. 74 05 JE SHORT 1551-CRA.00412038 F8单步一下,切换到“MessageBox”中,确认,被OD中断。我们可以看见上面的代码41201F处有一个“〉”,说明可以从某段代码跳转到此处,我们选择41201F这一行,在“Information”栏看见一句“JUMP FROM 412003”,右键单击,选择“GO TO JUMP FROM 412003”。回到412003,一般都是条件跳转,上面的内容就是比较的地方啦。:) 5、使用OD的TRACK功能 OD拥有强大的TRACK功能,在分析算法时十分有用。首先我们要设定OD的TRACK缓冲区大小,选择Option\\Debugging Option,在弹出的对话框中选择TRACK页,“Size of run track buffer(byte/record)”,缓冲区大小,当然约大约好。其他的设置在我以前的OLLYDBG.INI中都已经设置好了。然后,开启目标程序,在DEBUG中选择“Open or clear run track”。然后我们就可以用CTRL+F11或CTRL+F12开启“Track into”和“Track over”了。当我们暂停程序的时候,可以用小键盘上的“+”,“-”,“*”来控制TRACK功能了。 “Track into”和运行类似,但是记录所有指令以及寄存器变化。并且会自动进入所有的CALL中。 “Track over”和“Track into”类似,但是不进入CALL “+”用来显示TRACK缓冲区中的下一条指令 “-”用来显示TRACK缓冲区中的上一条指令 “*”用来发返回当前指令 6、不是技巧的技巧 当你遇到花指令的时候一定会很头痛。但是如果你用OD进行分析的时候就会轻松得多。OD会自动标识出无效指令,即花指令。如果OD没有正确识别,你还可以用CTRL+↑/↓来单个 字节的移动。可以很有效的识别出花指令的所在。 后记 本人脑袋不太好使,一时记不起所有内容,以后想起来再贴。转贴时请保持本文的完整。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/VxD1/archive/2008/04/01/2235148.aspx 一,什么是 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//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]并且对其位置进行定向。 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。在第一种情况下,它对指定范围内的每条指令上设置断点(比如在全睝@芍葱写 胫校 5钡酱锷瓒系闹噶詈螅琌llyDbg 清除断点并且把该指令标记为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寄存器或者是位内存区域。为了方便处理,内存操作数也被解码为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多种高效的启发方法(最简单的方法,比如“直接访问前K内存是不允许的,像在MOV [0],EAX中”)来探测他们 有时,分析器在您感兴趣的地方分析错误。有两种解决方法:或者从选中的部分移除分析(快捷键退格键),这样 OllyDbg 将使用默认的解码(反汇编)方式;或者设置 解码提示[decoding hints]并重新分析。注意:在某些情况下,当分析器认为您的提示是不合适的,或者有冲突,则可能忽略您的设置。 探测程序的函数过程也很简单。在分析器眼中看来,程序只是一个连绵不断的代码,从一个入口开始,可能达到(至少从理论上)所有的命令(除了NOP以及类似的用于填充间隙的命令)。您可能指定三个识别级别。严格的函数过程要求有准确的一个入口,并且至少有一个返回。在启发级别下,分析器只要求过程有一个入口。而如果您选择模糊模式,差不多连贯的代码都会被识别为单独的过程。现代编译器进行全局代码优化,有可能把一个过程分成几个部份。在这种情况下,模糊模式非常有用。但是也会误识别的机率也就更高。 同样地,循环是一个封闭的连续的命令序列,并有一个到开始处的跳转作为一个入口,还有若干个出口。循环与高级操作命令 do, while 和 for 相对应。OllyDbg 能够识别任何复杂的嵌套循环。他们会在反汇编栏[Disassembly]中用长而粗括号标记。如果入口不是循环的第一个命令,OllyDbg会用一个小三角进行标记。 为了实现一个转换[switch], 许多编译器,读取转换变量[switch variable]到寄存器中, 然后减它,像如下的代码序列: MOV EDX, 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]。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务