Android 反编译器设计与实现指南
1. 反编译器概述
反编译器本质上是一种将字节码转换为源代码的交叉编译器。虽然编写反编译器与编写编译器或交叉编译器有相似之处,都是进行数据格式的转换,但二者方向相反。在标准编译器中,源代码被转换为令牌,经过解析和分析最终生成二进制可执行文件;而反编译则是将中间符号转换回源代码。
由于 Android 的 classes.dex 文件是二进制格式,可快速将其转换为字节码,进而将字节码视为一种新的语言,反编译器就成为了将字节码转换为 Java 的交叉编译器。此外,还有许多其他的源代码转换器,如从 COBOL 到 C,或从 Java 到 Ada 或 C 等,这些都为反编译器的设计提供了思路。
需要注意的是,操作码(opcode)是单个指令,如 sget - object,可能后跟数据值或操作数;操作码和操作数一起通常被称为字节码。
2. 问题定义
要解决的核心问题是如何将 classes.dex 文件转换为一系列对应的 Java 源代码文件。例如,以下是一段反汇编后的 classes.dex 文件的字节码示例:
const/4 v0,0
const/16 v1,128
if-ge v0,v1,28
sget-object v1, field[2]
new-instance v2, type[6]
invoke-direct method[4], {v2}
const-string v3, string[20]
invoke-virtual method[7], {v2, v3}
move-result-object v2
invoke-virtual