返回列表 发新帖

【实用教程】smali中常用的几种操作

  [复制链接]

6

主题

794

回帖

4026

积分

大学生

Rank: 5Rank: 5

金币
3847
好评
14
信誉
120

考神MT论坛新人MT论坛帅哥MT论坛活跃会员

发表于 2025-3-1 10:10:10 来自手机  | 显示全部楼层 | 阅读模式  来自 山东
举例赋值,返回,判断,调用,字段访问,正则这六种。

1. 赋值操作
赋值操作根据数据类型和大小选择不同指令:
(1) 数值赋值
小整数(4位/8位):

  const/4 v0, 0x1      // v0 = 1(4位有符号数,范围:-8 ~ 7)

  const/16 v1, 0x100   // v1 = 256(16位有符号数,范围:-32768 ~ 32767)
  
大整数(32位):

  const v2, 0x12345    // v2 = 74565(32位有符号数)

  const/high16 v3, 0x1  // v3 = 65536(高16位赋值,用于大数值初始化)

(2) 长整型赋值(64位)

  const-wide/16 v6, 0x100L  // 赋值256(十进制),v6和v7共同存储64位值。

解释—在Dalvik字节码中,宽指令(wide指令,如 const-wide )会占用两个连续的寄存器(例如 v6 和 v7 )。


(3) 字符串赋值

  const-string v5, "Hello"  // v5 = "Hello"

(4) 对象赋值
  
  const-class v6, Ljava/lang/String;  // v6 = String.class

------

2. 返回操作
返回操作根据返回值类型选择不同指令:

(1) 返回空
  return-void  // 无返回值

(2) 返回整数
  return v0  // 返回 v0 中的整数值

(3) 返回长整型
  return-wide v1  // 返回 v1 和 v2 中的长整型值

(4) 返回对象
  return-object v3  // 返回 v3 中的对象引用

------

3. 判断操作
判断操作通过条件跳转指令实现:
(1) 相等/不等判断
  
  if-eq v0, v1, :cond  // 如果 v0 == v1,跳转到 :cond
  if-ne v0, v1, :cond  // 如果 v0 != v1,跳转到 :cond

(2) 大小判断
  
  if-lt v0, v1, :cond  // 如果 v0 < v1,跳转到 :cond
  if-ge v0, v1, :cond  // 如果 v0 >= v1,跳转到 :cond

(3) 零值判断
  
  if-eqz v0, :cond  // 如果 v0 == 0,跳转到 :cond
  if-nez v0, :cond  // 如果 v0 != 0,跳转到 :cond

------

类型  描述符  备注
int       I    32位整数
long     J   64位长整数
float     F   32位单精度浮点数
double   D   64位双精度浮点数
boolean  Z   布尔值(true/false)
byte      B   8位字节
short     S   16位短整数
char      C   16位Unicode字符
void      V   无返回值



------

4. 调用操作
调用操作通过invoke系列指令实现,具体分为以下几种:

1. 调用实例方法
invoke-virtual: 调用普通实例方法(非私有、非静态)。
  
  invoke-virtual {<目标寄存器>, <参数寄存器>}, <类名>-><方法名>(<参数类型>)<返回类型>
  示例:
  
  invoke-virtual {v0, v1}, Lcom/example/MyClass;->myMethod(I)V
  解释:调用 v0 寄存器中的对象(Lcom/example/MyClass 实例)的 myMethod 方法,传入 v1 寄存器中的整数参数,返回类型为 V(void)。

invoke-direct: 调用私有方法或构造函数。
  
  invoke-direct {<目标寄存器>}, <类名>-><方法名>(<参数类型>)<返回类型>
  示例:
  
  invoke-direct {v0}, Lcom/example/MyClass;-><init>()V
  解释:调用 v0 寄存器中的对象(Lcom/example/MyClass 实例)的构造函数 <init>,无参数,返回类型为 V(void)。

2. 调用静态方法
invoke-static: 调用静态方法。
  
  invoke-static {<参数寄存器>}, <类名>-><方法名>(<参数类型>)<返回类型>
  示例:
  
  invoke-static {}, Lcom/example/MyClass;->staticMethod()V
  解释:调用 Lcom/example/MyClass 类的静态方法 staticMethod,无参数,返回类型为 V(void)。

3. 调用父类方法
invoke-super: 调用父类方法。
  
  invoke-super {<目标寄存器>, <参数寄存器>}, <父类名>-><方法名>(<参数类型>)<返回类型>
  示例:
  
  invoke-super {v0}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
  解释:调用 v0 寄存器中的对象(Activity 实例)的父类 Activity 的 onCreate 方法,传入 Bundle 参数,返回类型为 V(void)。

4. 调用接口方法
invoke-interface: 调用接口方法。
  
  invoke-interface {<目标寄存器>, <参数寄存器>}, <接口名>-><方法名>(<参数类型>)<返回类型>
  示例:
  
  invoke-interface {v0}, Lcom/example/MyInterface;->interfaceMethod()V
  解释:调用 v0 寄存器中的对象(MyInterface 实例)的 interfaceMethod 方法,无参数,返回类型为 V(void)。


------5. 字段访问语法
iget: 用于从对象的实例字段中读取值,并将其存储到指定的寄存器中。(从实例字段中读取值)
  
  iget <类型> <目标寄存器>, <对象寄存器>, <字段名>
  解释
  <类型>:字段的类型(如 int、boolean、object 等)。
<目标寄存器>:存储读取结果的寄存器。
<对象寄存器>:包含字段的对象所在的寄存器。
<字段名>:字段的完整路径(如 Lcom/example/MyClass;->myField:I)。

  示例:
  
  iget v0, v1, Lcom/example/MyClass;->myField:I
  解释:从 v1 寄存器中的对象(Lcom/example/MyClass 实例)中获取 myField 字段的值,并将其存储在 v0 寄存器中,字段类型为 I(int)。
  
  根据字段类型的不同,iget 有多个变体:
iget:读取普通字段(如 int、float 等)。
iget-wide:读取 64 位字段(如 long、double)。
iget-object:读取对象字段(如 String、MyClass)。
iget-boolean:读取布尔字段(boolean)。
iget-byte:读取字节字段(byte)。
iget-char:读取字符字段(char)。
iget-short:读取短整型字段(short)。

iput: 设置实例字段的值。(将值写入实例字段)
  
  iput <类型> <源寄存器>, <对象寄存器>, <字段名>
  示例:
  
  iput v0, v1, Lcom/example/MyClass;->myField:I
  解释:将 v0 寄存器中的值存储到 v1 寄存器中的对象(Lcom/example/MyClass 实例)的 myField 字段中,字段类型为 I(int)。

sget: 获取静态字段的值。
  
  sget <类型> <目标寄存器>, <类名>-><字段名>
  示例:
  
  sget v0, Lcom/example/MyClass;->myStaticField:I
  解释:从 Lcom/example/MyClass 类中获取 myStaticField 静态字段的值,并将其存储在 v0 寄存器中,字段类型为 I(int)。

sput: 设置静态字段的值。
  
  sput <类型> <源寄存器>, <类名>-><字段名>
  示例:
  
  sput v0, Lcom/example/MyClass;->myStaticField:I
  解释:将 v0 寄存器中的值存储到 Lcom/example/MyClass 类的 myStaticField 静态字段中,字段类型为 I(int)。

------


6.正则赋值

举例
iget-boolean v0, v1, Lcom/example/MyClass;->vip:Z
  解释:从 v1 寄存器中的对象(Lcom/example/MyClass 实例)中获取 vip 字段的值,并将其存储在 v0 寄存器中,字段类型为布尔。
  
​正则转换后
​iget-boolean (.*), .*, Lcom/example/MyClass;->vip:Z
解释: 还记得iget-boolean <目标寄存器>, <对象寄存器>, <字段名>吗

(.*)  捕获的是目标寄存器(如  v0 ),用于存储字段值。

.*  匹配但不捕获的是对象寄存器(如  v1   ),表示字段所属的实例对象。

​根据判断操作替换相应的值
(如赋值为1)搜索代码正则表达式替换为
​const $1, 0x1

解释: $1  是正则替换中的占位符,动态引用捕获的寄存器名(如  v0 )。

const $1, 0x1  的作用:将目标寄存器直接赋值为  1 ,跳过字段读取逻辑。

(为什么用正则替换呢?有什么优势呢?答案是灵活和大批量处理,如果有几百个要赋值的难道要手动吗,通过  (.*)  捕获目标寄存器名,并在替换时使用  $1  动态引用,无论原寄存器名是什么,替换语句都能自动适配

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
已有5人评分好评 金币 理由
mykingback + 1 + 1 很给力!
强强yqq + 1 + 1 赞一个!
Cambriolage + 1 很给力!
abc800202 + 1 + 1 很给力!
紫檀 + 1 + 1

查看全部评分 总评分:好评 +4  金币 +5 

回复

使用道具 举报

13

主题

620

回帖

2395

积分

大学生

Rank: 5Rank: 5

金币
1964
好评
1
信誉
100
发表于 2025-3-1 10:19:37 来自手机  | 显示全部楼层  来自 广西
前排,好贴
回复

使用道具 举报

6

主题

794

回帖

4026

积分

大学生

Rank: 5Rank: 5

金币
3847
好评
14
信誉
120

考神MT论坛新人MT论坛帅哥MT论坛活跃会员

发表于 2025-3-1 10:26:51 来自手机  | 显示全部楼层  来自 山东
杰人不荣 发表于 2025-3-1 10:19
前排,好贴

喜提沙发
回复

使用道具 举报

20

主题

2239

回帖

7696

积分

硕士生

小白

Rank: 6Rank: 6

金币
4168
好评
6
信誉
103

MT论坛最佳新人考神

QQ
发表于 2025-3-1 10:27:51 来自手机  | 显示全部楼层  来自 福建
感谢分享
回复

使用道具 举报

39

主题

5419

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4485
好评
18
信誉
108
发表于 2025-3-1 10:45:12 来自手机  | 显示全部楼层  来自 河北
看看隐藏
回复

使用道具 举报

18

主题

4877

回帖

1万

积分

博士生

MW

Rank: 7Rank: 7Rank: 7

金币
2517
好评
2
信誉
100

考神MT论坛新人MT论坛帅哥MT论坛最佳新人

发表于 2025-3-1 10:46:17 来自手机  | 显示全部楼层  来自 新疆
感谢分享,看看隐藏
回复

使用道具 举报

0

主题

1552

回帖

5547

积分

硕士生

Rank: 6Rank: 6

金币
3529
好评
0
信誉
100
发表于 2025-3-1 10:46:49 来自手机  | 显示全部楼层  来自 湖南
感谢分享
回复

使用道具 举报

2

主题

370

回帖

1114

积分

高中生

Rank: 4

金币
698
好评
0
信誉
100

MT论坛帅哥

发表于 2025-3-1 10:50:46 来自手机  | 显示全部楼层  来自 河南
看看隐藏内容
回复

使用道具 举报

1

主题

1362

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4104
好评
7
信誉
100
发表于 2025-3-1 10:52:28 来自手机  | 显示全部楼层  来自 广东
很实用,谢谢分享
回复

使用道具 举报

65

主题

3825

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
2358
好评
12
信誉
100

MT论坛最佳新人考神MT论坛帅哥MT论坛新人MT论坛活跃会员

发表于 2025-3-1 10:53:37 来自手机  | 显示全部楼层  来自 贵州
感谢分享
回复

使用道具 举报

67

主题

7589

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
12032
好评
28
信誉
86

考神MT论坛帅哥MT论坛活跃会员

发表于 2025-3-1 10:56:40 | 显示全部楼层  来自 广西
看看隐藏
回复

使用道具 举报

16

主题

1267

回帖

4831

积分

大学生

Rank: 5Rank: 5

金币
3388
好评
1
信誉
100
发表于 2025-3-1 10:57:01 | 显示全部楼层  来自 重庆
感谢分享。
回复

使用道具 举报

5

主题

2370

回帖

5264

积分

硕士生

Rank: 6Rank: 6

金币
3833
好评
0
信誉
90
发表于 2025-3-1 11:12:02 来自手机  | 显示全部楼层  来自 浙江
感谢
回复

使用道具 举报

26

主题

3671

回帖

7388

积分

硕士生

Rank: 6Rank: 6

金币
268
好评
2
信誉
94

考神MT论坛新人MT论坛帅哥MT论坛最佳新人

发表于 2025-3-1 11:14:26 来自手机  | 显示全部楼层  来自 江西
感谢分享
回复

使用道具 举报

64

主题

8939

回帖

2万

积分

博士后

学渣

Rank: 8Rank: 8

金币
3159
好评
54
信誉
133

MT论坛最佳新人考神MT论坛活跃会员

发表于 2025-3-1 11:22:40 来自手机  | 显示全部楼层  来自 江苏
看看隐藏
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表