Skip to content

🔢 LiteralTools

smali 语法中所有数值字面量的字符串解析工具,支持十进制、十六进制、八进制和浮点格式。

属性
完整类名org.jf.smali.LiteralTools
源码链接LiteralTools.java
类型工具类(纯静态方法)

🎯 职责

smali 语法中字面量的表示形式非常丰富:

  • 整数:0x1(十六进制)、010(八进制)、10(十进制),可带 - 前缀
  • 字节:末尾 t/T 后缀,如 0x1t
  • 短整数:末尾 s/S 后缀,如 100s
  • 长整数:末尾 l/L 后缀,如 0xFFFFFFFFL
  • 浮点:标准 Java float/double 格式

LiteralTools 提供这些格式的安全解析,越界时抛出 NumberFormatException


🧠 关键实现

parseByte — 带后缀 t 的字节解析

java
public static byte parseByte(String byteLiteral) throws NumberFormatException {
    // 去掉可选的 t/T 后缀
    char[] byteChars;
    if (byteLiteral.toUpperCase().endsWith("T")) {
        byteChars = byteLiteral.substring(0, byteLiteral.length()-1).toCharArray();
    } else {
        byteChars = byteLiteral.toCharArray();
    }

    int position = 0;
    int radix = 10;
    boolean negative = false;
    if (byteChars[position] == '-') {
        position++;
        negative = true;
    }
    if (byteChars[position] == '0') {
        // 0x → 16进制,0 → 8进制
        // ...
    }
    // 解析数值 + 范围检查
}

smali 字面量格式规范

类型示例解析方法
byte0x1t-5tparseByte()
short100s0x1AsparseShort()
int0x1-10010parseInt()
long0xFFFFFFFFL100LparseLong()
float3.14f0x1.8p0fparseFloat()
double3.140x1.8p0parseDouble()

🔗 关系


📌 小结

LiteralTools 是汇编阶段语义值提取的关键工具,由 smaliTreeWalker 在遍历 AST 时调用,将字面量 token 文本转换为 Java 数值,再传入 DexBuilder API。其特点是严格的范围检查(byte 范围 -128~127,short 范围 -32768~32767),解析失败时通过 SemanticException 报告错误位置。

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