smali语法学习
smali语法
感谢正己大佬开源:安卓逆向这档事
smali介绍和相关含义
-
什么是JVM、Dalvik、ART
JVM是JAVA虚拟机,运行JAVA字节码程序;Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable);Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异. -
什么是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,学习正则的必要又增加了.

浙公网安备 33010602011771号