老文章档案 · 2003 年

OllyDbg的help-分析模块介绍(翻译)

破解教程 · 技术资料 · 2003-09-16 · 作者:天边浮云 人气: · 出处:赢政天下整理收藏)

说明一下:

本人是菜菜鸟。刚刚接触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,<switch variable>

SUB EDX,100

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会扩大代码区,形式上允许分

析它并跟踪。(出处:赢政天下整理收藏)

相关文章:

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1999-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史