四非英专生从零学逆向
本人是某四非英专生曼兑胡,为了证明大专+ai > 92 计算机,我要从零开始学逆向,打ctf,隔壁汽修二班小睦肯定会回心转意的。。。deekseep已经帮我把计划写好了,你们这些生活不如意的黑子,等着我学成了直接进大厂年入百万羡慕死你们!
- 逆向工程中长期学习计划
- 0. 三条结论先行
- 1. 先认清这本书:内容地图与真实含金量
- 2. 你的起点与差距盘点
- 3. 总体路线图
- 4. 分阶段详解
- 阶段 0(第 1 周)环境与心态
- 阶段 1(第 2–5 周,4 周)计算机组成与数据表示
- 阶段 2(第 6–13 周,8 周)汇编语言与调用约定 ★全程最关键的一段
- 阶段 3(第 14–19 周,6 周)Windows 系统与程序运行机制
- 阶段 4(第 20–27 周,8 周)调试器与静态分析实战
- 阶段 5(第 28–35 周,8 周)PE 格式深挖与壳 ★本书最有价值的一段
- 阶段 6(第 36–43 周,8 周)工具原理与自研:把"会用"变成"会造"
- 阶段 7(第 44–55 周,12 周)Android 逆向
- 阶段 8(第 56–63 周,8 周)网络协议逆向 ★本书完全没有,你明确缺的板块
- 阶段 9(第 64 周起)方向深化:选 1–2 个
- 5. 这本书怎么读:章节调度表
- 6. 工具链:新旧对照与本机建议
- 7. 学习方法与工程习惯
- 8. 资源清单
- 9. 法律与伦理边界(必须读完)
- 10. 里程碑自查表
- 附:如果只有 3 个月(应急精简路线)
逆向工程中长期学习计划
依据书目:《逆向分析实战》,冀云、杜琳美著,人民邮电出版社,ISBN 9787115590701,2022 年 9 月第 1 版,全书 372 页。
起点条件:有 C 语言基础;未系统学过计算机组成原理、汇编语言、网络协议。
时间刻度:以"周"为单位,不绑定日历日期,随时可开始。
0. 三条结论先行
- 这本书适合做你的第一本逆向实战书,但不适合直接硬读。 它默认读者会汇编、懂 PE,第 2 章只有 24 页速览,且完全跳过补码、调用约定、栈帧。直接读会在第 2 章开始就"看懂了但不会用"。
- 正确姿势:先花 12 周补"计组 + 汇编 + Windows 系统"的最小必要基础,再按调度表读本书。 全书 372 页里真正需要精读的是第 4、5、7、8、10、11 章,其余当索引或速读。这本书只占整个计划约三分之一。
- 周期估算:每周 8–10 小时,约 18 个月走到"能独立分析一个真实程序 / 一个未加固 APK"的水准;每周 20 小时可压缩到 10–11 个月(缩放规则见 3.2)。
1. 先认清这本书:内容地图与真实含金量
| 章 | 页码 | 页数 | 主题 | 深度 | 处置建议 |
|---|---|---|---|---|---|
| 1 | 10–21 | 12 | 进制转换、数据宽度、字节序、ASCII | 速览(没有补码与负数范围) | 速读 + 做题 |
| 2 | 22–45 | 24 | x86 寄存器、常用指令、寻址方式 | 速览(没有调用约定、栈帧、64 位) | 当索引,配合阶段 2 补课 |
| 3 | 46–70 | 25 | OllyDbg 全功能、7 类断点、插件开发 | 深入,但工具已过时 | 概念精读,操作换 x64dbg 复现 |
| 4 | 71–124 | 54 | PE 格式逐字节详解、导入/导出/重定位表 | 深入 | ★精读 |
| 5 | 125–186 | 62 | 手写 PE、手工压缩、加壳与脱壳 | 深入 + 实战 | ★精读(全书最高价值) |
| 6 | 187–214 | 28 | C32Asm、WinHex、反编译工具 | 工具介绍 | 速读,换 010 Editor / HxD |
| 7 | 215–252 | 38 | IDA 6.5 使用、IDC/IDAPython、C 代码逆向(函数/分支/循环/跳转表) | 入门偏实操 | ★精读(工具换 IDA Free / Ghidra) |
| 8 | 253–276 | 24 | GetProcAddress 自实现、三种断点原理、调试 API、写密码显示器 | 入门引子 | ★精读 + 必做扩展 |
| 9 | 277–302 | 26 | Android 环境、Android Killer、Smali 调试 | 速览(近乎图文手册) | 速读,工具几乎全换 |
| 10 | 303–350 | 48 | DEX 格式逐字段 + 完整解析器代码(约 700–900 行 C++) | 深入 | ★精读 |
| 11 | 351–372 | 22 | Smali 结构、Dalvik 指令分类、字节码转 Smali、反汇编实现 | 半深入(部分代码省略) | ★精读,需补 ART |
1.1 三个必须提前知道的事实
- 工具停留在 2010 年代:OllyDbg 1.10、IDA 6.5、VC6、RadAsm、PEiD、C32Asm、WinHex、Android Killer 1.3.1、JDK 8、
dx、smalidea。方法仍然有效,工具必须替换(对照表见第 6 节)。不要试图把书里的环境原样装起来,那会耗掉你几周。 - 全书是 32 位 Windows:PE32、i386 结构的
CONTEXT、DR0–DR7 硬件断点、VC6 Debug 编译特征。不含 x64、不含 ARM、不含内核。所以一台 Win7 SP1 x86 虚拟机是标配,书里没有强制要求 XP。 - 书中有两处明确错误,照抄会学错:
- 第 1 章"编程判断主机字节序"的两个示例程序,
if/else两个分支打印的都是Small Sequence.,与正文结论相反; - 第 2 章描述出栈时写成"先取出数据再让 ESP 减 4",与同章"堆栈由高地址向低地址增长"自相矛盾(正确是 ESP 先加 4)。
- 第 1 章"编程判断主机字节序"的两个示例程序,
1.2 这本书给不了你的东西(必须外部补)
| 缺口 | 影响 | 补法 |
|---|---|---|
| 补码、有符号数、溢出、类型对齐 | 看不懂任何数据相关逻辑 | 阶段 1 |
| 调用约定与栈帧 | 无法定位参数/局部变量/返回值 | 阶段 2 |
| x64 与 ARM | 现代样本基本是 64 位;Android 核心逻辑在 so | 阶段 2、阶段 7 |
| C++ 逆向(虚表、RTTI、异常、STL) | 遇到 C++ 程序直接卡死 | 阶段 5 之后 |
| PE 的资源表、TLS 表、异常目录、延迟导入、Load Config | 第 4 章明确跳过了资源表,数据目录 16 项只讲了 4 项 | 阶段 5 自己补 |
| PE64 实例与 DIR64 重定位用例 | 第 5.5 节只讲字段定义差异,没有任何 64 位样本 | 阶段 5 自己补 |
| 反调试 / 加壳对抗 / VMP | 真实商业软件过不去 | 阶段 9 |
| 网络协议逆向 | 完全空白 | 阶段 8 |
| ART / OAT / Vdex、Native so、加固 | 书中只到 Dalvik,现网设备早就不适用 | 阶段 7 |
2. 你的起点与差距盘点
2.1 逆向工程师的五层能力模型
| 层 | 要什么 | 你现在的状态 | 补齐阶段 |
|---|---|---|---|
| 机器层 | 补码、位运算、内存布局、指令执行、栈帧、中断与异常 | 无计组基础 | 阶段 1、2 |
| 语言层 | C 能写到"解析二进制结构"的强度;能读汇编 | 有 C 基础 | 阶段 1、2 |
| 系统层 | Win32 API、进程/线程、虚拟内存、模块装载、异常机制 | 基本空白 | 阶段 3 |
| 工具层 | 调试器、反汇编器、十六进制编辑器、行为监控 | 空白 | 阶段 4 |
| 领域层 | PE 与壳、Android/DEX、网络协议、方向专精 | 空白 | 阶段 5–9 |
2.2 C 语言的"合格线"(达不到就先补 2 周)
判据:能独立写出"打开文件 → 按结构体解析头部 → 打印各字段"的程序。
具体应掌握:指针与数组退化、结构体与内存对齐、union、位运算与移位、函数指针与回调、宏与条件编译、文件 IO(fopen/fread 或 Windows 文件映射)、编译与链接过程(cl / gcc 命令行)、会用调试器调试自己的代码。
不够就先做:K&R《C 程序设计语言》第 5、6 章 + 手写一个 BMP 或 PNG 文件头解析器(这一步就是在为第 4 章的 PE 解析热身)。
2.3 关于"没学过网络协议"
不必提前焦虑。协议逆向依赖的是调试与协议分析能力,安排在阶段 8;但 TCP/IP 的基本概念(IP/端口/TCP 三次握手/HTTP 报文)可以在阶段 3 花 8 小时顺带过一遍,成本很低。
3. 总体路线图
3.1 九个阶段
| 阶段 | 周次 | 时长 | 主题 | 对应本书 | 阶段产出(交付物) |
|---|---|---|---|---|---|
| 0 | 第 1 周 | 1 周 | 环境与心态 | — | 可用虚拟机 + x32dbg 能单步 |
| 1 | 第 2–5 周 | 4 周 | 计算机组成与数据表示 | 第 1 章 | 数据类型/补码实验报告 |
| 2 | 第 6–13 周 | 8 周 | 汇编语言与调用约定 | 第 2 章 | 10 份带注释的反汇编 + 栈帧图 |
| 3 | 第 14–19 周 | 6 周 | Windows 系统与程序运行机制 | 第 4 章(预读) | PE 加载流程图 + 手工遍历 PEB |
| 4 | 第 20–27 周 | 8 周 | 调试器与静态分析实战 | 第 3、6、7 章 | 5 个程序的等价 C 还原 + 3 个 CrackMe |
| 5 | 第 28–35 周 | 8 周 | PE 深挖与壳 | 第 4、5 章 | 自写 PE 解析器 + 手写 PE + 脱壳 |
| 6 | 第 36–43 周 | 8 周 | 工具原理与自研 | 第 8 章 | 自己的调试器 + hash 版 GetProcAddress |
| 7 | 第 44–55 周 | 12 周 | Android 逆向 | 第 9、10、11 章 | Python 版 DEX 解析器 + Frida hook |
| 8 | 第 56–63 周 | 8 周 | 网络协议逆向 | 书中无 | 一份自研协议格式文档 + 复现脚本 |
| 9 | 第 64 周起 | 长期 | 方向深化(选 1–2 个) | — | 每 3 个月一个方向项目 + 总结 |
3.2 时间弹性规则
以"每周 8–10 小时"为基准(倍率 1.0):
| 每周可投入 | 倍率 | 走到阶段 8 结束 |
|---|---|---|
| 4–5 小时 | ×2.0 | 约 30 个月 |
| 8–10 小时 | ×1.0 | 约 15 个月 |
| 15–20 小时 | ×0.55 | 约 8–9 个月 |
每周的固定配比(按 10 小时算):读书/看文档 2h + 动手 5h + 写笔记 1.5h + 复盘上周 0.5h + 机动 1h。
动手时间不得低于总时间的 50%,这是唯一不能打折的纪律。
4. 分阶段详解
阶段 0(第 1 周)环境与心态
目标:把"能调试"这件事变得像打开记事本一样顺手。
- 虚拟机:VMware Workstation(你机器上已装)→ 建 Windows 7 SP1 x86 虚拟机(2 核 / 4GB / 60GB),装完立刻做"干净快照";遇到必须在 XP 跑的老工具再建第二个 XP SP3 虚拟机。
- 编译环境:VS2022 已装(你机器上有),确认勾选"使用 C++ 的桌面开发",包含 MSVC x86/x64 工具集与 Windows SDK;老工程兼容不必强求 VS6/VS2010,
cl命令行编译 32 位程序即可。 - 工具(全部用官方渠道下载,见第 6 节):x64dbg(含 x32dbg)、Ghidra、IDA Free、010 Editor 或 HxD、Detect It Easy、CFF Explorer、Process Monitor / Process Explorer、Wireshark、Git、Python 3。
- 心态校准:把"看懂"改成"复现"。每学一个概念,必须在一个自己写的程序上亲眼看到它。
验收:在 Win7 x86 虚拟机里编译一个 32 位 C 程序,用 x32dbg 附加、下断、单步、查看内存;虚拟机有干净快照可随时回滚。
阶段 1(第 2–5 周,4 周)计算机组成与数据表示
目标:能把"计算机怎么存数据、怎么执行指令"讲到能解释自己写的每一行 C。
学什么
- 进制、位运算、补码与有符号/无符号、溢出、类型宽度与内存对齐(★本书第 1 章缺的部分);
- CPU 执行模型:取指—译码—执行、寄存器、PC、栈与函数调用;
- 内存布局:栈 / 堆 / 全局 / 只读数据、地址空间、虚拟内存与分页(概念级即可);
- 中断与异常的基本概念。
资料:《深入理解计算机系统(原书第 3 版)》第 1–3 章(重点)、第 9 章虚拟内存(选读);王爽《汇编语言(第 3 版)》第 1–3 章;本书第 1 章当练习册。
动手产出
- 手算 30 题:进制互换、补码、位运算、有符号/无符号比较陷阱;
- 写 C 程序打印
char/short/int/long long的sizeof、取值范围、0x7FFFFFFF + 1、(unsigned)-1; - 在 x32dbg 里查看同一个变量在内存中的字节,对照书中
db/dw/dd三种宽度。
验收:能解释"为什么 -1 在内存里是 FF FF FF FF"、"为什么有符号溢出是未定义行为"、"为什么栈从高地址向低地址增长"。
坑:不要从第一页啃 CSAPP 全本;不要只刷题不写代码。
阶段 2(第 6–13 周,8 周)汇编语言与调用约定 ★全程最关键的一段
目标:随便给一段反汇编,能说出参数在哪、返回值在哪、局部变量在哪、栈怎么变。
学什么
- 寄存器全表(含 EIP 与 EFLAGS 各标志位的含义)、寻址方式;
- 指令分类:传送 / 算术 / 逻辑 / 移位 / 串操作 / 转移 / 栈操作;
- 函数与栈帧:
push ebp; mov ebp,esp; sub esp,N; ...; leave; ret;参数[ebp+8]、[ebp+0xC],局部变量[ebp-4];本书第 2 章完全没讲,必须自己补; - 调用约定:
cdecl/stdcall/fastcall/thiscall——参数入栈顺序、谁负责平栈;x64 的 RCX/RDX/R8/R9 + 32 字节影子空间 + 16 字节栈对齐; - C 结构在汇编中的样子:数组寻址
[base + index*size]、结构体成员偏移、字符串常量; - 控制流模式:if/else、三目运算符、switch(跳转表
jmp ds:off_XXXX[eax*4])、for/while/do-while。
资料:王爽《汇编语言》(16 位部分快速过,重点看"栈"与"子程序"两章);李忠《x86 汇编语言:从实模式到保护模式》(选读保护模式部分);CSAPP 第 3 章(x86-64 汇编,重点);《Intel 64 and IA-32 Architectures Software Developer's Manual》Vol.1/Vol.2 当字典查;本书第 2 章当索引。
动手产出
- 手写 20 个小汇编程序:最大公约数、字符串反转、数组求和、递归阶乘、结构体传参、函数指针回调;
- 寄存器日记:自写 10 个 C 函数,分别用
-O0和-O2(VS 上是/Od和/O2)编译,逐行注释反汇编,画出栈帧图; - 做完本书第 2 章全部练习,并把讲过但没解释的
PUSH EBP / MOV EBP,ESP补上自己的解释。
验收:给一个不认识的 32 位 exe 的某个函数,10 分钟内标出函数边界、参数个数、局部变量、返回值;能说出 Debug 与 Release 的差别(0xCC 填充、__chkesp、内联、寄存器传参)。
坑:不要背指令表。指令只有在调试器里"看到执行后寄存器和标志位怎么变"才算学会。
阶段 3(第 14–19 周,6 周)Windows 系统与程序运行机制
目标:理解"一个 exe 从双击到跑起来,操作系统到底做了什么"。
学什么:进程与线程、句柄与内核对象;虚拟内存 API(VirtualAlloc/VirtualProtect/VirtualQuery);模块(DLL)与导入导出;PE 装载器流程;TEB / PEB(FS:[0x30])与 Ldr 模块链表;异常与 SEH;调试器与被调试进程的关系;顺带过一遍 TCP/IP 基础概念(IP、端口、TCP 握手、HTTP 报文,8 小时)。
资料:《Windows 核心编程(第 5 版)》选章(进程、线程、虚拟内存、DLL、异常相关章节);《程序员的自我修养——链接、装载与库》;本书第 4 章预读。
动手产出
- 用 C 写"手工加载 DLL 并调用函数":先用
LoadLibrary/GetProcAddress,再自己遍历导出表实现一遍; - 用 Process Monitor 记录一个 exe 从启动到退出的完整加载过程,写出时序笔记;
- 在 x32dbg 中从
FS:[0x30]走到 PEB →Ldr→InLoadOrderModuleList,手工列出所有已加载模块。
验收:白板能画出 exe 加载流程图;能讲清 RVA / VA / FOA 三者的换算关系(这是第 4、5 章的地基,必须烂熟)。
坑:Win32 API 上千个,别背,按需查 Microsoft Learn。
阶段 4(第 20–27 周,8 周)调试器与静态分析实战
目标:静态 + 动态两把刀都能用,能把一个 C 程序逆向回等价源码。
学什么(对应本书第 3、6、7 章)
- 调试器概念:软件断点(
INT3/0xCC)、硬件断点(DR0–DR3,最多 4 个)、内存断点(页保护)、一次性断点、条件断点、消息断点、单步、调用栈、补丁与保存; - 反汇编器:IDA 界面与快捷键(N 重命名、X 交叉引用、G 跳转、C/D/A 转换、F5 反编译)、函数识别、流程图、名称与注释、脚本(IDC / IDAPython);
- 十六进制编辑器:010 Editor 的模板(
.bt)机制——这是第 5 章和 DEX 解析都要用的能力; - C 代码逆向:函数识别(栈帧特征)、调用约定识别、if/else、switch/case(跳转表)、三种循环。
工具迁移:OllyDbg → x64dbg/x32dbg;IDA 6.5 → IDA Free 9.x 或 Ghidra;C32Asm/WinHex → 010 Editor / HxD;IDC → Python 3 + IDAPython / Ghidra 脚本。
动手产出
- 自写 5 个 C 程序(字符串比较、循环、switch、结构体、回调),各编译 Debug/Release 两版,逆向并写出等价 C 代码,与源码逐行比对;
- 写一个脚本(IDAPython 或 Ghidra)自动标注一组函数并生成调用关系;
- 完成 3 个合法的公开 CrackMe(教学用途);
- 把第 7 章的"VC6 Debug 特征"升级成现代编译器指纹表:VC6 / VS2022 × Debug/Release ×
/MT//MD,记录sub esp,XXh、0xCC填充范围、__chkesp、跳转表、内联情况。
验收:拿到一个 200 行以内的 C 程序编译出的 exe,1 小时内还原出主要逻辑。
坑:不要一上手就分析真实商业软件——你会卡在壳、反调试和 C++ 上,严重打击信心。
阶段 5(第 28–35 周,8 周)PE 格式深挖与壳 ★本书最有价值的一段
目标:把 PE 当成自己家的抽屉,闭着眼知道每个字节在哪;能手工压缩、能脱常见的壳。
学什么(对应本书第 4、5 章)
- PE 结构逐字节:DOS 头与
e_lfanew(偏移 0x3C)、NT 头(IMAGE_FILE_HEADER/IMAGE_OPTIONAL_HEADER32)、节表(Name8 字节不以 NULL 结尾、VirtualSizevsSizeOfRawData)、节区对齐(FileAlignment/SectionAlignment); - 三种地址:RVA / VA / FOA 的定义与两套换算公式;
RVA ≠ FOA的两种原因(两个对齐值不同、存在无磁盘数据的节如.data?); - 数据目录:16 项索引的含义(书里重点讲了 0 导出 / 1 导入 / 5 重定位 / 12 IAT),导入表(
OriginalFirstThunkvsFirstThunk→ INT/IAT、IMAGE_THUNK_DATA32最高位判序号还是名称、绑定导入表TimeDateStamp=0xFFFFFFFF)、导出表(三张 Address 数组 +Base+ 序号换算 + 转发函数)、重定位表(SizeOfBlock = 8 + N*2、TypeOffset高 4 位类型 / 低 12 位偏移、IMAGE_REL_BASED_HIGHLOW=3); - 手写 PE(第 5.1 节,14 页):从 64 字节 DOS 头起,按书里的字段取值表(表 5-1~5-4)逐字段填值,规划
.text/.data/.idata三节,产出 4KB 能弹对话框的 EXE; - 手工压缩链(第 5.2 节,全书最精彩的部分):16KB → 改
FileAlignment为 0x200 → 删空洞 → 2KB → 合并节表并修正导入表 RVA、节属性按位或 → 1KB → 结构重叠(数据塞进 DOS 头与节表尾部空隙、字符串共用结尾 0)→ 512 字节; - 壳(第 5.4 节):壳的分类(压缩壳 / 加密壳 / 虚拟指令壳)、简单壳原理(异或 0xCC 加密代码节 + 加节 + 改入口点与节属性 + 写入
PUSHAD/XOR/LOOP/POPAD/JMP EAX自解密头 + 导入表隐藏:转存原导入表,运行时用LoadLibraryA/GetProcAddress填 IAT); - 手动脱壳(第 5.4.3 节):ESP 定律找 OEP、两次内存断点法交叉验证、转储(OllyDump)、修 IAT(ImportREC)、LordPE 修正映像大小、Overlay 附加数据处理;
- PE32+ 与 PE32 的差异(第 5.5 节,只有字段定义,需自己找 64 位样本验证)。
动手产出
- 用 C 或 Python 从零写一个 PE 解析器:打印全部节表、导入表、导出表、重定位表、资源目录,并做 RVA↔FOA 双向换算(书里没有给任何解析代码,只到手算,所以这一步是你自己补的关键闭环);
- 按第 5.1 节用十六进制手写一个最小可运行 PE,并用 LordPE 或 CFF Explorer 验证它能被正确解析、调试器能停在预期入口;
- 完整走一遍 16KB → 512B 的压缩链,每步用十六进制编辑器 + 调试器交叉验证,并记录"调试器什么时候解析失灵、为什么";
- 自己实现一个异或壳(含 IAT 隐藏),再用 ESP 定律把它脱回来:转储 + 修 IAT + 重建 PE;
- 补书里跳过的部分:资源目录、TLS 表、延迟导入、
.NET元数据目录、DIR64 重定位——每补一项就在自己的解析器里加一个输出。
验收:能解释"为什么加壳后不能直接反汇编"、"ESP 定律为什么有效"、"转储后为什么必须修 IAT";能手算任意一个 RVA 对应的 FOA。
坑:这一阶段最容易"看完就忘"。第 4、5 章合计 115 页,有 35 张字段/hex 对照表,必须每个结构都在十六进制编辑器里亲手对一遍字节;另外注意第 5 章的"压缩"不是压缩算法,只是结构重排,想学压缩壳算法得另外找资料。
阶段 6(第 36–43 周,8 周)工具原理与自研:把"会用"变成"会造"
目标:不再依赖别人的工具理解世界。
学什么(对应本书第 8 章)
GetProcAddress的实现路径:导出表查找 → 转发函数处理 → 序号导出 → (书里没有的)PEB 遍历 + 模块名 hash 查找;- 三种断点原理:
INT3(0xCC与STATUS_BREAKPOINT)、硬件断点(DR0–DR3、DR6 状态、DR7 条件)、内存断点(页保护 → 访问异常); - Windows 调试 API 与结构体:
CreateProcess(DEBUG_PROCESS)、WaitForDebugEvent、ContinueDebugEvent、DEBUG_EVENT八类事件、CONTEXT与ContextFlags、ReadProcessMemory/WriteProcessMemory、Get/SetThreadContext; - 综合项目:密码显示器(在第 8.2.3 节的思路上自己实现一遍)。
必补的现代扩展:x64 调试与调用约定在调试器里的差异、单步(TF 标志)、DR6/DR7 位域细节、Frida 入门(跨平台运行时 hook,现代逆向的主力工具)。
动手产出
- 自己实现三代
GetProcAddress:导出表版 → PEB 遍历版 → hash 版(零导入表,shellcode 基石); - 自己的最小调试器:能启动/附加进程、下软断点并命中、单步、读写目标内存、打印
CONTEXT; - 复现书里的密码显示器(先做 32 位,再做 64 位版)。
验收:你的调试器能对任意 32 位进程下断并读出字符串;能解释"为什么硬件断点最多只有 4 个"。
坑:第 8 章的代码是片段,没有完整工程。必须在 VS2022 里自建工程,缺什么补什么——这个过程本身就是学习。
阶段 7(第 44–55 周,12 周)Android 逆向
目标:能把一个没有加固的 APK 拆开、读懂、改掉、跑起来。
学什么(对应本书第 9、10、11 章 + 大量补充)
- Java 与 Android 基础(2 周,不可跳过):类/接口/内部类与匿名内部类(
$1、$2、this$0)、equals语义、Activity 生命周期、四大组件与AndroidManifest.xml、res/layout与 R 类机制、findViewById; - APK 结构与工具链:
classes.dex/resources.arsc/AndroidManifest.xml/META-INF签名;工具用 jadx(DEX→Java)、apktool(反编译/重打包)、JEB(可选)、baksmali/smali、Frida、mitmproxy;书中的 Android Killer 1.3.1 已停更,不要用; - DEX 格式(★第 10 章精读):header 20 个字段、
map_list、string_ids(MUTF-8)、type_ids、proto_ids、field_ids、method_ids、class_defs、DexClassData/DexCode、LEB128 编码; - Smali 与 Dalvik 指令(★第 11 章):Smali 三段式文件结构、类型描述符、
.method寄存器命名(p0/p1/v0/v1)、指令分类与格式 ID(35c/21c/10x…)、字节码到 Smali 的翻译、条件跳转与 Java 语义的对应(if-eqz往往对应equals为真); - 必须补的现代内容:ART 与 OAT/Vdex/CompactDex(书里只讲 Dalvik,Android 5.0 起默认 ART,书中的调试链路在新设备上不通用)、加固与对抗(DEX 抽取、VMP、签名校验、反调试、Root/Frida 检测、SSL Pinning)、Native so 与 ARM/ARM64 汇编入门(核心逻辑常下沉到 so)。
动手产出
- 用 Python 重写 DEX 解析器(比书里的 C++ 版快得多,且能强迫你讲清每个字段),输出与
dexdump -d对齐; - 反编译一个自己写的 APK,改逻辑、重打包、签名、跑通;
- 用 Frida hook 一个自己写的方法,打印参数与返回值;
- 手工翻译第 11.3.2 节的字节码序列(如
1070 0003 0000 000E),与 baksmali 输出逐条比对。
验收:拿到一个未加固的 APK,2 小时内定位关键判断,并给出两种改法(改 Smali / 运行时 hook)。
坑:书中环境(JDK 8 + Android Killer + smalidea + Android Device Monitor)在现在已经基本装不起来(dx 已被 D8/R8 取代、smalidea 长期停更、Android Device Monitor 从 AS 3.0 起被移除)。不要为了复刻书里的界面耗时间。
阶段 8(第 56–63 周,8 周)网络协议逆向 ★本书完全没有,你明确缺的板块
为什么放在后面:协议逆向的真正难点是"把抓到的包"和"程序里的代码"对上,这需要先有调试能力。
学什么
- TCP/IP 与 HTTP/HTTPS 基础(1 周);
- Wireshark 抓包与显示过滤、TLS 解密(
SSLKEYLOGFILE、自签证书中间人)、mitmproxy(2 周); - 协议格式逆向(3 周):字段识别、长度/校验和/序号、TLV 与 Protobuf 与 JSON 与自定义二进制、状态机、粘包与分片;
- 加密与编码识别(1 周):Base64/Hex/MD5/SHA/AES/RSA 的常量、魔数与调用特征;
- 综合(1 周):完整还原一个客户端—服务端协议并用 Python 复现一次通信。
资料:《TCP/IP 详解 卷 1:协议》选章;Wireshark 官方用户指南;mitmproxy 与 Frida 文档;练习对象用你自己写的 C/S 程序(合法、可控、可改)。
动手产出
- 自己写一个 TCP 客户端/服务端,设计自定义二进制协议(含魔数、长度、校验和、时间戳),再只用 Wireshark 把它逆向成一份协议文档;
- 对自己的程序做一次中间人抓包并解密;
- 用 IDA + 调试器定位发包函数,改包并在服务端验证生效。
验收:产出一份你自己逆向出来的协议格式文档,并用脚本完整复现一次通信。
坑:网络逆向的深水区是"加密 + 混淆"。先从明文和自定义二进制协议练起,别一上来就啃 TLS Pinning 的 App。
阶段 9(第 64 周起)方向深化:选 1–2 个
| 方向 | 核心内容 | 入门资料 |
|---|---|---|
| 恶意代码分析 | 静态/动态分析、行为监控、C2 提取、沙箱、报告撰写 | 《恶意代码分析实战》 |
| 漏洞挖掘与利用 | 栈溢出 → GS/ASLR/DEP/CFG → ROP → 堆利用 | 《漏洞战争》;pwn.college(Linux 路线) |
| 软件保护与对抗 | 反调试/反虚拟机、加壳与 VMP、代码虚拟化、加固脱壳 | 《加密与解密(第 4 版)》;《逆向工程核心原理》 |
| 移动安全 | Android/iOS 深度、Native 与内核、风控对抗 | 《Android 软件安全权威指南》;《Android 应用安全防护和逆向分析》 |
| 固件与 IoT | 固件提取、文件系统、MIPS/ARM、串口与调试口 | 《IoT 安全之固件分析》类资料 + 实操 |
| 游戏安全 | Unity/Unreal 逆向、内存修改、反作弊对抗 | 法律风险最高,务必谨慎 |
节奏建议:每 3 个月完成一个方向的小项目 + 一篇总结文章。输出倒逼输入是这一阶段最有效的学习方式。
5. 这本书怎么读:章节调度表
| 章节 | 什么时候读 | 读法 | 工具替换 |
|---|---|---|---|
| 第 1 章 | 阶段 1 第 1 周 | 速读 + 做题;补码自己补 | — |
| 第 2 章 | 阶段 2 全程 | 当索引,不要当教材;每节都在调试器里验证 | MASM/RadAsm → VS2022 + MASM 或 NASM |
| 第 3 章 | 阶段 4 第 1–2 周 | 概念精读(断点分类、单步、补丁),操作换 x64dbg 复现 | OllyDbg → x32dbg/x64dbg |
| 第 4 章 | 阶段 3 末预读 + 阶段 5 精读 | 逐结构对照十六进制;跳过资源表、只讲 4 项数据目录,需自己补全 16 项 | PEiD → Detect It Easy;LordPE → CFF Explorer / PE-bear |
| 第 5 章 | 阶段 5 精读 | 全书最值得投入的 62 页(35 张 hex 对照表 + 4KB→512B 完整压缩链),每步都要动手 | LordPE/Stud_PE → CFF Explorer / PE-bear;ImportREC → Scylla |
| 第 6 章 | 阶段 4 速读 | 只精读 C32Asm/WinHex 与模板机制两节;反编译部分(DeDe/VB/IL DASM)当工具索引略过 | C32Asm/WinHex → 010 Editor / HxD;VBExplorer → dnSpy/ILSpy |
| 第 7 章 | 阶段 4 精读 | IDA 操作 + 7.2 的 C 逆向模板要全部复现 | IDA 6.5 → IDA Free / Ghidra;IDC → IDAPython |
| 第 8 章 | 阶段 6 精读 | 跟做 + 自己补 PEB 遍历与 hash 查找 | RadAsm/VC6 → VS2022 |
| 第 9 章 | 阶段 7 第 1 周 | 速读流程即可,工具全换 | Android Killer → apktool + jadx + Frida |
| 第 10 章 | 阶段 7 第 4–8 周 | 精读;建议用 Python 重写解析器 | VS2015 → 任意编辑器 + Python |
| 第 11 章 | 阶段 7 第 9–11 周 | 精读;省略的代码回读 AOSP 源码 | — |
三遍读书法(针对精读章节)
- 第一遍·速读(每章 1–2 小时):只求知道"这章解决什么问题",把不懂的点标记出来,不要停下来死磕。
- 第二遍·精读 + 跟做(重点章 1–2 周):书里每一段代码、每一个十六进制表格,都要在自己的机器上复现一遍。
- 第三遍·复盘(每章半天):合上书,用自己的话写出这章的知识地图,并讲给别人听(或写成博客)。讲不出来的地方就是没学会的地方。
6. 工具链:新旧对照与本机建议
6.1 对照表
| 用途 | 书中工具 | 现在用什么 | 官方地址 |
|---|---|---|---|
| 用户态调试 | OllyDbg 1.10 | x64dbg / x32dbg;WinDbg | x64dbg.com |
| 静态反汇编 | IDA 6.5 | IDA Free 9.x、Ghidra(免费开源)、Binary Ninja | hex-rays.com/ida-free;ghidra-sre.org |
| 十六进制编辑 | C32Asm、WinHex、UltraEdit | 010 Editor(模板强大)、HxD(免费) | sweetscape.com/010editor;mh-nexus.de |
| PE 查看 | PEiD、LordPE、Stud_PE | Detect It Easy、CFF Explorer、PE-bear、ExeInfoPE | github.com/horsicq/Detect-It-Easy;ntcore.com |
| 转储与修 IAT | OllyDump + ImportREC + LordPE | Scylla(配套 x64dbg);PE-bear 修节表 | github.com/NtQuery/Scylla |
| 资源编辑 | Resource Hacker | Resource Hacker(仍可用)、rcedit |
angusj.com/resourcehacker |
| 增加节区 | ZeroAdd | CFF Explorer / PE-bear / LIEF(脚本化) | lief.re |
| 行为监控 | — | Process Monitor、Process Explorer、API Monitor、System Informer | learn.microsoft.com/sysinternals |
| 汇编环境 | MASM + RadAsm | VS2022 + MASM,或 NASM | — |
| Android 反编译 | Android Killer 1.3.1 | apktool + jadx + JEB(可选) | apktool.org;github.com/skylot/jadx |
| Android 动态 | smalidea + Android Device Monitor | Frida + objection;baksmali/smali | frida.re;github.com/google/smali |
| 抓包 | — | Wireshark、mitmproxy、Fiddler/Charles、Burp Suite | wireshark.org;mitmproxy.org |
| 二进制框架 | — | Capstone(反汇编库)、Unicorn(模拟执行)、angr(符号执行) | capstone-engine.org |
6.2 你机器上的现状(已核查)
- 操作系统:Windows 11(NT 10.0.26100),x64;
- Visual Studio 2022 已安装 → 确认勾选"使用 C++ 的桌面开发"(含 x86/x64 工具集与 Windows SDK);
- VMware Workstation 已安装 → 直接建 Win7 SP1 x86 虚拟机;
- JDK 1.8.0_192 已安装(
C:\Program Files\Java\jdk1.8.0_192)→ 阶段 7 做老版 Smali 工具链够用;装现代 Android Studio 需要另外准备 JDK 17; - Python 3.14、.NET、winget 均已具备。
6.3 两条环境纪律
- 未知样本只在虚拟机里跑,主系统只做开发与阅读;虚拟机保持"干净快照",出问题 3 秒回滚。
- 32 位调试放虚拟机:书里的样本、老工具都是 32 位,Win11 主系统上兼容性与安全性都更差。
7. 学习方法与工程习惯
7.1 每周节奏模板(10 小时版)
| 内容 | 时长 | 说明 |
|---|---|---|
| 读书 / 看文档 | 2h | 只读当周主题,不贪多 |
| 动手复现 | 5h | 硬性下限,可拆成 3 次 × 1.5–2h |
| 写笔记 | 1.5h | 用自己的话 + 截图 + 代码片段 |
| 复盘上周 | 0.5h | 回看笔记,重做做错的题 |
| 机动 | 1h | 处理环境问题、下载资料 |
7.2 逆向日记模板(每个样本一篇)
日期 / 样本名 / 目标(想搞清楚什么)
静态观察:文件类型、位数、编译器、是否加壳、导入表关键 API
动态观察:进程行为、文件/注册表/网络动作、关键调用栈
关键发现:地址 + 汇编 + 我的解释
卡点:卡在哪、试了哪些路、下一步怎么走
结论:一句话总结这个样本学到了什么
7.3 四条硬纪律
- 每行代码都要能给出一句解释——解释不了的,就是没学会。
- 卡住 30 分钟就换路:换交叉引用看、换动静态、换工具、或者先放下做别的题。
- 不做资料松鼠:不囤"以后可能用得上"的书和视频;只留当前阶段要用的。
- 四张速查表跟着你一辈子:结构体速查表、指令速查表、工具快捷键表、坑点清单。每次遇到新的就补一条。
8. 资源清单
按阶段(书)
| 阶段 | 书 |
|---|---|
| 1 | 《深入理解计算机系统(原书第 3 版)》;《编码:隐匿在计算机软硬件背后的语言》 |
| 2 | 王爽《汇编语言(第 3 版)》;李忠《x86 汇编语言:从实模式到保护模式》;《Intel SDM》Vol.1/2 |
| 3 | 《Windows 核心编程(第 5 版)》;《程序员的自我修养——链接、装载与库》 |
| 4 | 《IDA Pro 权威指南(第 2 版)》;本书第 3、6、7 章 |
| 5 | 本书第 4、5 章;《逆向工程核心原理》(李承远) |
| 6 | 本书第 8 章;张银奎《软件调试(第 2 版)》;《加密与解密(第 4 版)》 |
| 7 | 本书第 9–11 章;《Android 软件安全权威指南》;《Android 应用安全防护和逆向分析》 |
| 8 | 《TCP/IP 详解 卷 1》;《Wireshark 数据包分析实战》;mitmproxy / Frida 官方文档 |
| 9 | 《恶意代码分析实战》;《漏洞战争》;按方向选 |
练习靶场与社区
- 自己写样本(最合法、最可控,且能对照源码验证);
- 公开的教学用 CrackMe 与 CTF 逆向题(Reverse / Mobile / Pwn 方向);
- 看雪论坛(kanxue.com):中文逆向社区,资料与讨论质量最高;
- GitHub:工具源码 + 大量带源码的教学样本;
- 注意:任何"破解版软件下载站"里的样本都可能是恶意程序,不要碰。
9. 法律与伦理边界(必须读完)
- 只对自己拥有的软件、自己写的程序、明确授权或公开用于教学的样本做逆向。
- 我国《计算机软件保护条例》有"为了学习和研究软件内含的设计思想和原理"而使用软件的例外条款(具体以现行法条文本为准),但这条例外不覆盖:破解他人软件并传播、制作与销售外挂、绕过技术保护措施、未经授权的渗透测试。
- 相关风险还可能涉及《著作权法》关于技术措施的规定,以及《刑法》第 285、286 条(非法获取计算机信息系统数据、非法控制计算机信息系统、破坏计算机信息系统)。"技术上学得会"不等于"法律上可以做"。
- 实操纪律:
- 练习样本一律放虚拟机,隔离网络;
- 不下载、不传播来路不明的 CrackMe 与"破解补丁";
- 不对任何非自己所有的线上系统做测试;
- 对外分享的笔记与代码,去掉真实样本的敏感信息。
10. 里程碑自查表
| 时点 | 自查项(全部打勾才算过关) |
|---|---|
| 第 5 周末 | 能解释补码与溢出;能在调试器里指出一个变量的字节序;虚拟机快照就绪 |
| 第 13 周末 | 能画出任意 32 位函数的栈帧图;能区分 cdecl/stdcall;能读懂 switch 跳转表 |
| 第 19 周末 | 白板画出 exe 加载流程;RVA/VA/FOA 换算不查资料;手工遍历过 PEB |
| 第 27 周末 | 独立还原 5 个程序的等价 C 代码;3 个 CrackMe 过关;编译器指纹表完成 |
| 第 35 周末 | 自写 PE 解析器可用;手写 PE 能跑;UPX 脱壳 + 修 IAT 成功 |
| 第 43 周末 | 自己的调试器能下断、单步、读内存;hash 版 GetProcAddress 可用 |
| 第 55 周末 | Python 版 DEX 解析器与 dexdump 对齐;未加固 APK 2 小时内拿下;Frida hook 成功 |
| 第 63 周末 | 自研协议格式文档 + Python 复现脚本;中间人解密成功 |
| 第 64 周起 | 选定 1–2 个方向,开始季度项目输出 |
附:如果只有 3 个月(应急精简路线)
时间紧就用这条"最小可行路线",跳过阶段 3、6、8,Android 与网络协议押后:
- 第 1–2 周:补补码与位运算 + x32dbg 基本操作;
- 第 3–6 周:汇编与栈帧(阶段 2 的核心部分,必须做透);
- 第 7–10 周:本书第 3、7 章 + 5 个 C 程序的等价还原;
- 第 11–12 周:本书第 4、5 章的 PE 结构与 RVA/FOA 换算。
能到什么程度:能看懂并分析简单的 32 位 CrackMe,会写 PE 解析器。到不了:脱壳、Android、真实商业软件。

浙公网安备 33010602011771号