Skip to content

🔨 smali — smali 文本汇编器内部原理

smali 是 ZjDroid 内嵌的 smali 文本 → DEX 汇编引擎,同样由 Ben Gruver(JesusFreke)开发,与 baksmali 相互配套。ZjDroid 在 DexFileBuilder 中调用 smali 的汇编逻辑,将修改后的 smali 代码重新打包为 DEX 文件。


📦 包结构

org.jf.smali/
├── main.java                # 命令行前端(含汇编主流程)
├── smaliFlexLexer.java      # JFlex 生成的词法分析器
├── LexerErrorInterface.java # 词法错误接口(ANTLR 桥接)
├── InvalidToken.java        # 错误 token 表示
├── smaliParser.java         # ANTLR 生成的语法分析器(smali 语法)
├── smaliTreeWalker.java     # ANTLR 树遍历器(生成 dexlib2 对象)
├── LiteralTools.java        # 字面量解析工具(byte/short/int/long/float/double)
├── SemanticException.java   # 语义错误异常(附带 token 位置信息)
├── OdexedInstructionException.java # odex 指令错误
├── SmaliMethodParameter.java       # 方法参数表示(含寄存器号)
└── WithRegister.java               # 携带寄存器号的接口

🔄 汇编流水线

ZjDroid 调用点

DexFileBuilder 通过 main.assembleSmaliFile() 方法批量处理修改后的 smali 文件,最终将重组的 DEX 写入磁盘,供后续注入/替换使用。


📋 关键类清单

类名源码链接职责
mainmain.java命令行入口 + 汇编主流程协调
smaliFlexLexersmaliFlexLexer.javaJFlex 生成的 DFA 词法分析器
LexerErrorInterfaceLexerErrorInterface.java词法错误统计接口(ANTLR 桥接)
smaliParsersmaliParser.javaANTLR 生成的 LL(*) 语法分析器
smaliTreeWalkersmaliTreeWalker.javaAST 遍历器,调用 dexlib2 DexBuilder
LiteralToolsLiteralTools.java各类字面量字符串 → 数值解析
SemanticExceptionSemanticException.java语义错误(类型不匹配、越界等)
InvalidTokenInvalidToken.java词法错误的 token 占位
SmaliMethodParameterSmaliMethodParameter.java方法参数(含寄存器号)的 dexlib2 实现
OdexedInstructionExceptionOdexedInstructionException.java不允许重汇编 odex 指令时的错误
WithRegisterWithRegister.java携带寄存器号的标记接口

🏗️ 三阶段编译架构


🔗 相关文档

基于 MIT 协议发布 · 本文档仅用于安全研究与教学目的