编辑: 865397499 | 2019-07-06 |
第一节 概述 接触过逆向分析(脱壳、破解、算法分析等)的都应该知道有调试器这东西,例如: OD(Ollydbg, 动态调试)、 SoftICE(系统级调试器, 据说断代了)、WinDbg、IDA(静态调试) 等等,用它们就可以将程序按反汇编代码进行分析和调试,当然,还能获得整个程序运行时 的各种其他信息,IDA 还能 80%还原 C 源码呢! 我本人也只是一个中学生, 对逆向分析和安全编程等比较感兴趣, 平时见到工具都想自己写 出来,要写完全属于自己的调试器,当然得先写自己的反汇编引擎了! 既然是反汇编引擎,汇编的基础知识肯定是必不可少,不需要精通,基本的指令和语法有了 解就好.
解析机器码,我选用 C 语言来写,大家有这 C 的基础就最好了,当然,要用其他语言来写 也可以,学习思路就好了. 要将一段二进制码反汇编,其实就是将机器码和汇编语言互相转化. 大家学过汇编应该知道,底层语言在不同的 CPU、不同的指令集当中是有一定的差异的, CPU 热门品牌只有 Intel 和AMD,汇编有 Intel 和AT&
T 两种主要格式.在这里我先以 Intel 汇编格式、IA-32 架构为例详细讲. 以后有时间的话,会补充
64 位架构的讲解,提供给大家的 Intel 手册里面 16/32/64 架构的都 有写到 其实要写一个属于自己的反汇编引擎,并不是特别难的一件事,只是要学习许多 CPU 指令 相关的知识,还要有一定的编程基础. 推荐一些有关 CPU 指令的在线资料: 看雪 xiep 兄翻译的《The Svin 的OpCode 程》 http://www.luocong.com/learningopcode/index.htm 《ArtOfDisassembly》 翻译版 http://blog.csdn.net/qingpengchen2011/article/category/948876?viewmode=list 罗聪的《学习 Opcode 教程》 http://www.luocong.com/learningopcode/index.htm 概述 Intel 指令格式 intel 的汇编格式,所以就先从官方手册的介绍概述一下 Intel 指令格式. Intel 汇编格式: 在官方手册中 intel 汇编有着固定的格式: 地址: 汇编指令 操作数 1, 操作数 2, 操作数
3 请设想一下机器码和汇编指令是怎样的对应关系? 每个部分一一对应? No No No.Intel CPU 一贯采用 CISC(复杂指令集).为了节省内存,Intel 指令编码尽可能地利 用每一位空间,再加上兼容性的考虑,使得整个 intel 指令结构比较复杂.远远不是每个部 分直接转换那么简单. What is 指令前缀? 指令前缀虽然不是每条指令必须有的,但是指令一复杂起来,就很有可能会出现指令前缀, 所以在反汇编的时候,最先就是要解析前缀了. 指令前缀是用来帮助说明指令的,例如汇编指令中 rep、repe 指令.作用在一些操作指令之 前. 举个例子: 004010D3 F3:A4 rep movs byte ptr es:[edi], byte ptr ds:[esi] 004010D5 A4 movs byte ptr es:[edi], byte ptr ds:[esi] 这里的 F3 就是指令前缀中的重复前缀(rep)了. 段改写前缀: 再介绍一下段改写前缀,Intel 指令有一种很简单的机制,学过汇编的都知道: bx, si, di 等寄存器寻址默认的寄存器为 ds;
bp,sp 等默认的寄存器为 ss,ip 默认的寄存 器为 cs 等(32 位寄存器一样) 这是因为在指令编码中, 用这种方式可以简化编码, 如果不用默认的段寄存器再说明就 好了,如果不用默认的段寄存器,这个信息就将会记录在指令前缀中 举一例: 004010D3 8B07 mov eax,dword ptr ds:[edi] 004010D5 26:8B07 mov eax,dword ptr es:[edi] 004010D8 8B45
00 mov eax,dword ptr ss:[ebp] 004010DB 64:8B45