这是如何实现的?我将为你揭开这一神秘面纱。第一遍,OllyDbg反汇编代码段中所有可能的地址,并计算调用的每个目的地址的个数。当然,很多调用是假的,但不可能两个错误的调用都指向了相同的命令,当然如果有三个的话,就更不可能了。因此如果有三个或者更多的调用指向了相同的地址,我可以肯定的说这个地址是某个频繁使用的子程序的入口。从定位的入口出发,我继续跟踪所有的跳转和函数调用,等等。按这种方法,我可能准确定位99.9% 的命令。但是,某些字节并不在这个链条上。我再用20多种高效的启发方法(最简单的方法,比如“直接访问前64K内存是不允许的,像在MOV [0],EAX中”)来探测他们。有时,分析器在你感兴趣的地方分析错误。有两种解决方法:或者从选中的部分移除分析(快捷键退键),这样OllyDbg将使用默认的解码(反汇编)方式;或者设置解码提示[decoding hints]并重新分析。注意:在某些情况下,当分析器认为你的提示是不合适的,或者有冲突,则可能忽略你的设置。
探测程序的函数过程也很简单。在分析器中看来,程序只是一个连绵不断的代码,从一个入口开始,可能达到(至少从理论上)所有的命令(除了NOP以及类的用于填充间隙的命令)。你可能指定三个识别级别。严的函数过程要求有准确的一个入口,并且至少有一个返回。在启发级别下,分析器只要求过程有一个入口。而如果你选择模糊模式,差不多连贯的代码都会被识别为单独的过程。现代编译器进行全局代码优化,有可能把一个过程分成几个部份。在这种情况下,模糊模式非常有用。但是也会误识别的机率也就更高。
同样地,循环是一个封闭的连续的命令序列,并有一个到开始处的跳转作为一个入口,还有若干个出口。循环与高级操作命令 do, while 和 for 相对应。OllyDbg能够识别任何复杂的嵌套循环。他们会在反汇编栏[Disassembly]中用长而粗括号标记。如果入口不是循环的第一个命令,OllyDbg会用一个小三角进行标记。
为了实现一个转换[switch], 许多编译器,读取转换变量[switch variable]到寄存器中,然后减它,像如下的代码序列:
MOV EDX,<switchvariable>
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函数的参数。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-41789-9.html
不然不会说出解决男女失衡解决办法是公用妻子