这门课解决什么问题、适合什么基础

搞安卓逆向时,反编译出来的不是 Java 源码,而是一堆带点符和寄存器编号的 Smali 文本。很多人能跑通反编译工具,看到这些文本却两眼一抹黑,找不到入口方法,看不懂参数传递,更不敢改逻辑。这门课专门补这块短板,把 Dalvik 字节码和 Smali 语法拆开讲清楚,让你能像读普通代码一样读懂反编译产物,为后续插桩、去广告、协议分析或漏洞挖掘打基础。它要求你已经熟悉 Java 基本语法和安卓开发常识,至少写过简单的 Activity 并理解生命周期;不要求你懂汇编,但得能接受寄存器、跳转、栈帧这些底层概念。如果连 Java 里基本数据类型和方法签名都说不清,先补这部分再看,别硬啃字节码。

建议先看哪几块、资料怎么配合练习

别按顺序从头到尾刷,先抓语法骨架。第一节讲寄存器的两种表示法,这是后续每条指令的基础,必须吃透 v 寄存器和 p 寄存器的区别;第二节讲 Dalvik 字节码类型,搞清每种类型对应的简称;第三、四节讲方法和成员变量的表示法,这两块直接决定你能不能在反编译产物里找到目标逻辑。看完这四节,就去看第五节的数据操作、返回、定义指令,以及第八节的跳转指令,这两节是阅读控制流的关键。数组操作、数据运算、数据转换这三节可以当查表手册,遇到具体指令再回看。锁指令和异常指令篇幅短,但别跳过,很多加固方案会在这两类指令上做手脚。练习时不要只盯着视频,资料包里的代码片段要拿来对照阅读:自己写一个极简的 Java 方法,用反编译工具转成 Smali,再逐行对照课程讲的指令,看寄存器怎么分配、跳转怎么实现。遇到看不懂的指令,先回查课程对应章节,而不是直接丢给工具自动转回 Java,否则逆向能力永远练不出来。

学完能独立做什么、看完应能回答的问题

学完后你应该能独立完成这几件事:拿到一个未加固的安装包,反编译后定位到关键业务逻辑所在的方法;读懂该方法里每条 Smali 指令的含义,包括参数怎么传、返回值怎么处理、循环和条件分支怎么走;根据指令定位出可以修改的点,比如绕过某个校验返回值或修改某个常量。检验学习效果,试着回答几个具体问题:Dalvik 字节码里 J 类型对应什么数据结构,为什么需要单独表示?一个有两个参数的实例方法,反编译后 p0、p1、p2 分别指向什么,局部变量会占用哪些寄存器?条件跳转和无条件跳转的指令在语法上有什么区别,如何根据跳转目标地址判断分支结构?数组操作指令里创建数组和填充数组分别对应哪几条指令,多维数组的访问又是怎样展开的?如果这些问题都能答清楚,说明你具备了阅读 Smali 的基本能力,可以往插桩和动态调试继续走了。

课程目录

1 寄存器的两种表示法 (06:22)
2 Dalvik字节码类型 (08:06)
3 Smali方法的表示法 (13:01)
4 Smali成员变量的表示法 (09:39)
5 数据操作-返回-定义指令 (08:30)
6 锁指令和异常指令 (02:50)
7 数组操作指令 (08:27)
8 跳转指令 (15:35)
9 数据运算指令 (04:03)
10 数据转换指令 (06:32)