—— 张森

21
—— 张张

description

小谈反汇编. —— 张森. ■ 反汇编用处. ■ 如何反汇编. ■ 硬件知识. ■ 反汇编知识. ■ 指令压缩. ■ 反汇编: 把目标代码转为汇编代码的过程,常用于软件破解、外挂技术、病毒分析、逆向工程、软件汉化等领域。学习和理解反汇编语言对软件调试、漏洞分析、 OS 的内核原理及理解高级语言代码都有相当大的帮助,在此过程中我们可以领悟到软件作者的编程思想。. ■ Samba : 一个允许非 Windows 系统与 Windows 系统共享文件的开源项目。 ■ Wine : 对 Windows API 做了同样的工作。 - PowerPoint PPT Presentation

Transcript of —— 张森

Page 1: —— 张森

—— 张森

Page 2: —— 张森

■ 反汇编用处

■ 如何反汇编

■ 硬件知识

■ 反汇编知识■ 指令压缩

Page 3: —— 张森

LOGO 位置

■ 反汇编:把目标代码转为汇编代码的过程,常用于软件破解、外挂技术、病毒分析、逆向工程、软件汉化等领域。学习和理解反汇编语言对软件调试、漏洞分析、 OS 的内核原理及理解高级语言代码都有相当大的帮助,在此过程中我们可以领悟到软件作者的编程思想。

■ Samba :一个允许非 Windows 系统与 Windows 系统共享文件的开源项目。■ Wine :对 Windows API 做了同样的工作。■ OpenOffice.org :对 Microsoft Office 文件格式作逆向工程。■ ReactOS :竭力在 ABI 及 API 上,兼容 NT 系 Windows系统。以便让为 Windows 所编写的软件和驱动程序可以在其上运行。■ WindowsSCOPE :用来监测及分析 Windows 系统内存的实况内容。

Page 4: —— 张森

LOGO 位置

■ 由于大多数近代体系结构区分开代码和数据,因此你可能倾向于认为该阶段工作无足轻重。事实并非如此,因为体系结构可以强迫数据段不包含代码,但不保证代码段不包含数据。当然,由于代码段是写保护的,所以代码段中的数据只能是常数。虽然如此,在代码段中可以有数据,或者只是无用信息。

参考: http://www.pediy.com/kssd/pediy08/pediy8-794.htm

Page 5: —— 张森

LOGO 位置

1 :反汇编的通常方法,即所谓线性扫描方法。2 :递归下降,克服了某些缺点( Schwarz 和

Debray , 第 9 届关于逆向工程的工作会议, 2002 年)。

参考: http://www.docin.com/p-97854086.html参考: http://www.pediy.com/kssd/pediy08/pediy8-794.htm

下面分别说下两种优点与缺点

Page 6: —— 张森

LOGO 位置

■ IA-32 下寄存器,当然常用的没这么多

Page 7: —— 张森

LOGO 位置

Page 8: —— 张森

LOGO 位置

■ 许多指令默认指定具体寄存器 , 例如字符串指令默认使用 ECX,ESI,EDI; 用段内存模型 , 一些指令假设指针和特殊段相关 , 例如 : 一些指令假设 EBX 内存位置指针与 DS段关联 . ■ESP 不能被当作索引寄存器 ESP,EBP 当基址时候 ,SS 作为默认段 ; 其他时候 DS 作为默认段■EIP 不能被软件修改 , 被隐式转移指令控制 ( 比如 JMP,JCC,CALL,RET), 中断和异常 . 唯一读 EIP 的方法是执行一个 CALL, 读桟里返回值 .EIP 被 RET 或者 IER间接修改

Page 9: —— 张森

LOGO 位置

Page 10: —— 张森

LOGO 位置

■ ESP 不能被当作索引寄存器■ LEA

Page 11: —— 张森

LOGO 位置

■Prefixes 锁定 \ 重复 \ 段改写 \跳转条件 \操作数大小 \地址大小 ■MODR/W 说明 32 可能值 :8 个寄存器和 24 个寻址模式 , 指定寄存器或者 3 字节以上指令信息■SIB 基址变址和比例变址需要■Dislacement 说明偏移大小■Immediate 说明立即数大小

Page 12: —— 张森

LOGO 位置

■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值

Page 13: —— 张森

LOGO 位置

■调用约定当参数个数多于一个时,按照什么顺序把参数压入堆栈。函数调用后,由谁

来把堆栈恢复。在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有:

■奇怪的 mov edi,edi 不采用 NOP 因为指令周期

Page 14: —— 张森

LOGO 位置

■ 我们来看一个示例

 

Page 15: —— 张森

LOGO 位置

■返回值 主要有如下形式:1) 通过寄存器返回函数值;2) 通过参数按引用方式返回函数值;3) 通过全局变量返回函数值;4) 通过处理器标志返回函数值;

■ 一般用 EAX,EAX 不够放 EDX 。 如果返回一个含有几百个字节的结构或者对象,编译器会在不告诉程序的情况下,给函数传递一个隐式参数,这个指针指向保存的返回结果。

Page 16: —— 张森

LOGO 位置

■PE文件格式文件偏移地址( File Offset )PE 文件在磁盘上储存时,各数据的地址。用十六进制工具显示的地址就是文件偏移地址。 虚拟地址( Virtual Address , VA )由于 Windows 程序是运行在 386 保护模式下,在保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址。 基地址( ImageBase )文件执行时将被映像到指定内存地址中,这个初始内存地址称为基址。 相对虚拟地址( Relative Virual Address , RVA )相对虚拟地址表示此段代码在内存中相对于基地址的偏移。 RVA = VA - ImageBase

Page 17: —— 张森

LOGO 位置

■RVA = FO - 段 FO + 段 RVA

 

Page 18: —— 张森

LOGO 位置

■Ollydbg:OLLYDBG 是一个新的动态追踪工具,将 IDA 与 SoftICE 结合起来的思想, Ring 3 级调试器,非常容易上手,己代替 SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目前最强大的调试工具。

■IDA Pro:DA Pro 是 DataRescue 开发的专业反汇编工具 , 它是一款专业的反汇编工具,己成为 Reverse engineerer 的必备工具。

Page 19: —— 张森

LOGO 位置

■ F2: 软断点F4,F8: 硬断点F7:TF=1

■软件断点 CC(int3): 当程序运行到 int3 的时候就会产生一个异常硬件断点主要通过调试寄存器来设置。内存断点对所设的地址设为不可访问 / 不可写属性,这样当访问 / 写入的时候就会产生异常 .

Page 20: —— 张森

LOGO 位置

■ 基于 JCC CALL 等指令操作数是偏移

■ 下面操作看看

Page 21: —— 张森

感谢!