侧边栏壁纸
  • 累计撰写 25 篇文章
  • 累计创建 11 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

初识 smali

LinJHS
2023-07-01 / 0 评论 / 0 点赞 / 12 阅读 / 0 字 / 正在检测是否收录...

初识 smali

简单记一下,大部分都是大佬的文章摘抄过来的,原文地址在本文文末。

本文主要是方便后续需要查找使用。

什么是 JVM、Dalvik、ART

JVM 是 JAVA 虚拟机,运行 JAVA 字节码程序。

Dalvik 是 Google 专门为 Android 设计的一个虚拟机,Dalvik 有专属的文件执行格式 dex (Dalvik executable)

Art(Android Runtime) 相当于 Dalvik 的升级版,本质与 Dalvik 无异

smali 及其语法

smali 是 Dalvik 的寄存器语言,smali 代码是 dex 反编译而来的。

关键字

名称 注释
.class 类名
.super 父类名,继承的上级类名名称
.source 源名
.field 变量
.method 方法名
.register 寄存器
.end method 方法名的结束
public 公有
protected 半公开,只有同一家人才能用
private 私有,只能自己使用
.parameter 方法参数
.prologue 方法开始
.line xxx 位于第xxx行

数据类型对应

smali类型 java类型 注释
V void 无返回值
Z boolean 布尔值类型,返回0或1
B byte 字节类型,返回字节
S short 短整数类型,返回数字
C char 字符类型,返回字符
I int 整数类型,返回数字
J long (64位 需要2个寄存器存储) 长整数类型,返回数字
F float 单浮点类型,返回数字
D double (64位 需要2个寄存器存储) 双浮点类型,返回数字
string String 文本类型,返回字符串
Lxxx/xxx/xxx object 对象类型,返回对象

常用指令

关键字 注释
const 重写整数属性,真假属性内容,只能是数字类型
const-string 重写字符串内容
const-wide 重写长整数类型,多用于修改到期时间。
return 返回指令
if-eq 全称equal(a=b),比较寄存器ab内容,相同则跳
if-ne 全称not equal(a!=b),ab内容不相同则跳
if-eqz 全称equal zero(a=0),z即是0的标记,a等于0则跳
if-nez 全称not equal zero(a!=0),a不等于0则跳
if-ge 全称greater equal(a>=b),a大于或等于则跳
if-le 全称little equal(a<=b),a小于或等于则跳
goto 强制跳到指定位置
switch 分支跳转,一般会有多个分支线,并根据指令跳转到适当位置
iget 获取寄存器数据

寄存器

在 smali 里的所有操作都必须经过寄存器来进行:本地寄存器用 v 开头数字结尾的符号来表示,如 v0、v1、v2。参数寄存器则使用 p 开头数字结尾的符号来表示,如 p0、p1、p2。特别注意的是,p0 不一定是函数中的第一个参数,在非 static 函数中,p0 代指 this,p1 表示函数的第一个 参数,p2 代表函数中的第二个参数。而在 static 函数中 p0 才对应第一个参数(因为 Java 的 static 方法中没有 this 方法)

修改方式

  1. 修改判断
  2. 强制跳转
    可以用 # 注释掉
  3. 修改寄存器的值

补充

01 去广告页

可以使用 MT 的 Activity 记录,获取 Activity 信息,然后修改

02 去弹窗

同理


参考资料:

  1. [Android 原创] 《安卓逆向这档事》三、初识smali,vip终结者 https://www.52pojie.cn/thread-1701353-1-1.html
0

评论区