smali语法学习

smali语法

感谢正己大佬开源:安卓逆向这档事

smali介绍和相关含义

  1. 什么是JVM、Dalvik、ART
    JVM是JAVA虚拟机,运行JAVA字节码程序;Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable);Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异.

  2. 什么是smali

    自然,Dalvik 字节码晦涩难懂,研究人员们给出了 Dalvik 字节码的一种助记方式:smali 语法。通过一些工具(如apktool),我们可以把已有的 dex 文件转化为若干个 smali 文件(一般而言,一个 smali 文件对应着一个类),然后进行阅读。对于不同的工具来说,其转换后的 smali 代码一般都不一样,毕竟这个语法不是官方的标准。这里我们介绍比较通用的语法。值得注意的是,在 smali 语法中,使用的都是寄存器,但是其在解释执行的时候,很多都会映射到栈中。

    smali结构:Smali - CTF Wiki

    smali初步认识:https://www.52pojie.cn/thread-1701353-1-1.html#44383431_2.smali及其语法

【Android逆向】16分钟动画讲解java以及对应的smali代码_哔哩哔哩_bilibili

挑战5的smali后续

为了保证知识的连贯性,就把大佬在第六期视频的smali知识放在这里了

Int赋值

const/4 最大只允许存放4个二进制位(4bit),
const/16 最大值允许存放16个二进制位(16bit), 第一位(即最高位)默认为符号位。单位换算 1byte=8bit

(看来我没理解得太错)

举例说明下寄存器的取值范围:

# 以下数据定义高位默认为符号位
const/4 v0,0x2 # 最大只允许存放半字节数据 取值范围为 -8 and 7
const/16 v0 , 0xABCD # 定义一个寄存器变量,最大只允许存放16位数据 比如short类型数据 取值范围为-32768~32767
const v0 , 0xA# 定义一个寄存器, 最大只允许存放32位数据,比如int类型数据 将数字10赋值给v0 取值范围-2147483647~2147483647
const/high16 #定义一个寄存器, 最大只允许存放高16位数值 比如0xFFFF0000末四位补0 存入高四位0XFFFF

Long赋值

const-wide vx, lit32 表示将一个 32 位的常量存储到 vx 与 vx+1 两个寄存器中 —— 即一个 long 类型的数据

.method public final vipEndTime()J  
    .registers 3  
    const-wide v0, 0x1854460ef29L  
    return-wide v0  
.end method

会员到期时间就是2022年12月24日。那么1854460ef29L 怎么来的呢?也就是(2022年12月24日-1970年1月1日)×365天×24小时×60分钟×60秒×1000毫秒,转换成16进制就大概是那个数了

在线时间戳转换

正则

mt管理器可以使用正则替换smali,学习正则的必要又增加了.

posted @ 2025-04-16 16:55  T0fV404  阅读(105)  评论(0)    收藏  举报