零基础入门:预备知识
本笔记整理自我所学习的课程。
一、课程体系与目标
- 教学理念:以“逆向思维”驱动“正向知识”学习。
- 初级班三大实战项目:
- 反汇编引擎:将二进制机器码转换为汇编代码,是逆向工具的核心模块。
- PE解析器:解析Windows可执行文件的结构,从整体上理解程序的构成。
- 二选一项目:游戏数据逆向分析 / 编写一个加密壳(软件保护工具)。
- 毕业课题:开发一个包含登录界面、进程注入、网络验证等功能的商业软件模板,综合运用所学。
二、核心预备知识:程序是如何储存的?
计算机中任何数据(程序、图片、视频等)最终都以二进制(0和1) 的形式存储。我们使用十六进制编辑器查看,只是为了更简洁地展示这些二进制数据。

左边是地址编号,右边是注释,中间是十六进制,任何文件存入计算机中都是以二进制存在的。
1. 进制基础
理解进制是分析数据的前提。
| 进制名称 | 基本符号 | 进位规则 | 备注 |
|---|---|---|---|
| 十进制 | 0-9 | 逢十进一 | 人类最熟悉 |
| 二进制 | 0, 1 | 逢二进一 | 计算机的母语 |
| 十六进制 | 0-9, A-F | 逢十六进一 | 二进制的一种便捷表示法 |
核心转换关系:
- 任何一种进制都是完美的是没有必要转换的,转换仅仅是为了方便人类理解。关键是要理解进制背后的计数原理,而非机械记忆转换结果,辅助理解请参考时间hh:mm:ss
- 1位十六进制数恰好对应4位二进制数。
- 我们之所以会想要转换是因为我们已经习惯了十进制,如果现在让你去运算M+X+Z=?你也是不会知道等于68的
//不同进制0-15
1 | 十进制 0 1 2 3 |
1 |
|
2. 数据存储格式
- 为什么是两个十六进制一组?
为什么我们用的这些软件都是一般都是将两个十六进制放在一起分割一下,却不是1个或者3个这样分割- 位 (bit):一个二进制位(0或1)。
- 字节 (Byte):8个位组成1个字节,是计算机存储管理的最小单元。
- 因为
1位十六进制 = 4位二进制,所以2位十六进制正好表示8位,即
1个字节。因此编辑器用两个十六进制数为一组来显示数据,直观地反映了字节的边界。
- 其他单位:
- 字 (Word):2字节,16位。
- 双字 (Dword):4字节,32位。
3. 思考题:理解数据的宽度
在计算器中,已知:八进制3-2=1,八进制 2 - 3
的结果是多少?(提示:答案不是-1,这引出了数据宽度和计算机如何存储数字这两个关键概念。)

三、如何从整体上认识程序?—— PE文件结构
分析一个程序,首先要回答三个问题:
- 程序从哪里开始执行?(入口点)
- 代码存在哪里?(代码基址)
- 数据存在哪里?(数据基址)
这些信息都记录在Windows可执行文件(.exe, .dll, .sys)的PE文件结构中。
- 仅限于windows
概念:windows上运行的任何可执行程序都应该遵循的结构,PE结构适用于windows任何可执行程序
1.什么是数据,什么是代码
不精确但有助于理解的例子:1+2
- 数据:程序处理的“原材料”,如
1+2中的1和2。 - 代码:指示CPU执行操作的指令,如
1+2中的+号。 - PE结构的作用,就是在一堆相同的“0和1”中,清晰地标识出哪些是代码、哪些是数据,以及它们各自的位置。

2. 手动解析PE结构(简要步骤)
以标题二中的程序图为例

- 目的:在十六进制数据中,按图索骥,找到程序入口点和基址。
- 原理:PE结构规定了一个“数据地图”,在文件的特定偏移处,存放着指向关键信息的地址。
- 从DOS头找到PE签名32位程序起始位置DWORD(偏移
0x3C
处)。0x3ch=60,windows是小端序(低位在前,高位在后),所以是00000110 - 根据PE签名后的结构,查表“入口点地址”和“代码/数据基址”所在的字段,得到(+0x18h=24 +0x10h=16)=40
,入口点0000CB90;代码段+0x14h 00001000,数据段+0x18h 00010000,仅PE32有数据段。 - 关键点:Windows系统内存取数据时采用小端序(低位在前,高位在后),读取多字节数值时需反向拼接。
当然这只是最最最简单的地方,而且实际程序更不会这么简单,所以只是一个参考
因此我们需要编写一个PE解析器工具,可以自动完成上述查找过程,帮助我们快速概览程序结构,是逆向分析的基础工具。
3. PE结构的应用:软件加壳
- 原理:打乱、加密原有的PE结构,让分析者无法轻易看懂。
- 应用:例如,在现有程序中插入一段自己的代码(弹出个对话框、执行特定操作),这需要对PE结构有极精确的理解,错一个字节都会导致程序崩溃。
四、从细节处分析代码:硬编码与反汇编
找到代码区后,如何理解一串二进制指令的含义?
- 硬编码:代表特定指令的固定二进制数值,如
55代表push ebp。 - 反汇编:将“硬编码”翻译成人类可读的汇编语言的过程。
- 反汇编引擎:这就是我们要做的项目,是一个将二进制自动转为汇编代码的核心模块。
五、逆向分析的完整路径
二进制数据 ➔ 反汇编 ➔ 汇编代码 ➔ 深入分析 ➔ C语言逻辑
这个过程就像把粉碎的纸屑先拼回完整的句子(汇编),再理解句子(汇编)表达的文章大意(C语言逻辑)。
六、总结与建议
- 基础最重要:进制转换、PE结构、硬编码是逆向上的基本功,根基不牢后续会寸步难行。
- 实践出真知:不要死记硬背PE结构,学会“查文档”和“用工具”。主动编写PE解析器等工具是最好的学习方式。
- 正向是逆向上限的天花板:优秀的逆向工程师必须有扎实的正向开发能力(如C语言),否则分析深度将严重受限。
- 自制工具的优势:学习编写自己的调试和分析工具(如反汇编引擎),可以有效规避游戏方对市面上流行分析工具的针对性检测。
零基础入门:预备知识