反汇编器可以正确解码16位地址。但它假设所有的段都是32位的(段属性使用32位)。这对于PE[Portable Executable]式文件总是正确的。OllyDbg不支持16位的NE[NewExecutables]式。
如果你熟悉MASM或者TASM,那么反汇编的代码对于你没有任何问题。但是,一些特例也是存在的。以下命令的解码与Intel的标准不同:
AAD (ASCII Adjust AX BeforeDivision)—该命令的解码后的一般形式为:AAD imm8
AAM (ASCII Adjust AX AfterMultiply)—该命令(非十进制数)的一般解码形式为:AAM imm8
SLDT (Store Local DescriptorTable register)—操作数总被解码为16位。这个命令的32位形式会在目的操作数的低16位中存储段选择器,并保留高16位不变。
SALC (Sign—extend Carry bit to AL,undocumented)—OllyDbg 支持这个未公开指令。
PINSRW (Insert Word FromInteger Register, Athlon extension to MMX)—在AMD的官方文档中,这个命令的内存形式使用了16位内存操作数;然而寄存器形式需要32位寄存器,但只使用了低16位。为了方便处理,反汇编器解码寄存器为16位形式。而汇编器两种形式都支持。
CVTPS2PI and CVTTPS2PI(Convert Packed Single—Precision Floating to Packed Doubleword, Convert with TruncationPacked Single—PrecisionFloating 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窗口的反汇编面板中按 CtrlA ,或者在可执行模块中选择“分析全部模块[Analyze all modules]”,来使用它。
分析器有很高的启发性。它能区分代码和数据,标记入口和跳转目的地址,识别转换表[switch tables],ASCII 和 UNICODE 串,定位函数过程,循环,高阶转换[high—level switches]并且能解码标准API函数的参数(示例[example])。OllyDbg 的其他部分也广泛的使用了分析后的数据。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-41789-8.html
这有利于我们国土岛屿的收回和国家的发展建设
好可怕
而不是处处以一等人居之