210 likes | 313 Views
小谈反汇编. —— 张森. ■ 反汇编用处. ■ 如何反汇编. ■ 硬件知识. ■ 反汇编知识. ■ 指令压缩. ■ 反汇编: 把目标代码转为汇编代码的过程,常用于软件破解、外挂技术、病毒分析、逆向工程、软件汉化等领域。学习和理解反汇编语言对软件调试、漏洞分析、 OS 的内核原理及理解高级语言代码都有相当大的帮助,在此过程中我们可以领悟到软件作者的编程思想。. ■ Samba : 一个允许非 Windows 系统与 Windows 系统共享文件的开源项目。 ■ Wine : 对 Windows API 做了同样的工作。
E N D
小谈反汇编 ——张森
■ 反汇编用处 ■ 如何反汇编 ■ 硬件知识 ■ 反汇编知识 ■ 指令压缩
■ 反汇编:把目标代码转为汇编代码的过程,常用于软件破解、外挂技术、病毒分析、逆向工程、软件汉化等领域。学习和理解反汇编语言对软件调试、漏洞分析、OS的内核原理及理解高级语言代码都有相当大的帮助,在此过程中我们可以领悟到软件作者的编程思想。 ■ Samba:一个允许非Windows系统与Windows系统共享文件的开源项目。 ■ Wine:对Windows API做了同样的工作。 ■ OpenOffice.org:对Microsoft Office文件格式作逆向工程。 ■ ReactOS:竭力在ABI及API上,兼容NT系Windows系统。以便让为Windows所编写的软件和驱动程序可以在其上运行。 ■ WindowsSCOPE:用来监测及分析Windows系统内存的实况内容。
■ 由于大多数近代体系结构区分开代码和数据,因此你可能倾向于认为该阶段工作无足轻重。事实并非如此,因为体系结构可以强迫数据段不包含代码,但不保证代码段不包含数据。当然,由于代码段是写保护的,所以代码段中的数据只能是常数。虽然如此,在代码段中可以有数据,或者只是无用信息。 参考:http://www.pediy.com/kssd/pediy08/pediy8-794.htm
1:反汇编的通常方法,即所谓线性扫描方法。1:反汇编的通常方法,即所谓线性扫描方法。 2:递归下降,克服了某些缺点(Schwarz和Debray,第9届关于逆向工程的工作会议,2002年)。 下面分别说下两种优点与缺点 参考:http://www.pediy.com/kssd/pediy08/pediy8-794.htm 参考:http://www.docin.com/p-97854086.html
■许多指令默认指定具体寄存器,例如字符串指令默认使用ECX,ESI,EDI;用段内存模型,一些指令假设指针和特殊段相关,例如:一些指令假设EBX内存位置指针与DS段关联. ■ESP不能被当作索引寄存器 ESP,EBP当基址时候,SS作为默认段;其他时候DS作为默认段 ■EIP不能被软件修改,被隐式转移指令控制(比如JMP,JCC,CALL,RET),中断和异常.唯一读EIP的方法是执行一个CALL,读桟里返回值.EIP被RET或者IER间接修改
■ ESP不能被当作索引寄存器 ■ LEA
■Prefixes 锁定\重复\段改写\跳转条件\操作数大小\地址大小 ■MODR/W说明32可能值:8个寄存器和24个寻址模式,指定寄存器或者3字节以上指令信息 ■SIB基址变址和比例变址需要 ■Dislacement说明偏移大小 ■Immediate说明立即数大小
■mov word ptr es:[eax + ecx * 8 + 0x11223344], 0x12345678■mov word ptr es:[eax + ecx * 8 + 0x11223344], 0x12345678 目标操作数是 mem,源操作数是 imme.对应的机器编码是:26 66 C7 84 C8 44 33 22 11 78 56 ■解释一下: 26:在指令序列里是:prefix部分,作用是调整内存操作数的段选择子66:在指令序列里是:prefix 部分,作用是调整操作数的缺省大小C7:在指令序列里是:Opcode部分,是mov指令是操作码84:在指令序列里是:ModRM值,定义操作数的方式C8:在指令序列里:SIB值定义内存操作数的方式44 33 22 11:在指令序列里是: displacement值78 56:在指令序列里是:immediate值
■调用约定 当参数个数多于一个时,按照什么顺序把参数压入堆栈。函数调用后,由谁来把堆栈恢复。在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有: ■奇怪的mov edi,edi 不采用NOP 因为指令周期
■返回值 主要有如下形式:1)通过寄存器返回函数值;2)通过参数按引用方式返回函数值;3)通过全局变量返回函数值;4)通过处理器标志返回函数值; ■一般用EAX,EAX不够放EDX。如果返回一个含有几百个字节的结构或者对象,编译器会在不告诉程序的情况下,给函数传递一个隐式参数,这个指针指向保存的返回结果。
■PE文件格式 文件偏移地址(File Offset)PE文件在磁盘上储存时,各数据的地址。用十六进制工具显示的地址就是文件偏移地址。 虚拟地址(Virtual Address,VA)由于Windows程序是运行在386保护模式下,在保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址。 基地址(ImageBase)文件执行时将被映像到指定内存地址中,这个初始内存地址称为基址。 相对虚拟地址(Relative Virual Address,RVA)相对虚拟地址表示此段代码在内存中相对于基地址的偏移。RVA = VA - ImageBase
■Ollydbg: OLLYDBG是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目前最强大的调试工具。 ■IDA Pro: DA Pro是DataRescue开发的专业反汇编工具, 它是一款专业的反汇编工具,己成为Reverse engineerer的必备工具。
■ F2:软断点 F4,F8:硬断点 F7:TF=1 ■ 软件断点CC(int3):当程序运行到int3的时候就会产生一个异常 硬件断点主要通过调试寄存器来设置。 内存断点对所设的地址设为不可访问/不可写属性,这样当访问/写入的时候就会产生异常.
■ 基于JCC CALL等指令操作数是偏移 ■ 下面操作看看