千家信息网

Android逆向中smali复杂类实例分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"Android逆向中smali复杂类实例分析"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Android逆向中smali复杂类实例分析"文章
千家信息网最后更新 2026年11月01日Android逆向中smali复杂类实例分析

这篇文章主要介绍"Android逆向中smali复杂类实例分析"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Android逆向中smali复杂类实例分析"文章能帮助大家解决问题。

1.java复杂类

如果有什么地方不懂,请看:JAVA总纲 或者构造方法

这里贴代码,很简单没有难度。

2.smali代码

我们要把java代码转为smali代码,可以参考java转smali


我们还是分模块来看。

2.1 第一个模块--信息模块



这个模块就是基本信息,说明了类名等,知道就好对分析帮助不大。

2.2 第二个模块--构造方法


我们来一句一句解析,如果有之前解析重复的地方就不再重复了。但是会提供链接。

.method public constructor (Ljava/lang/String;I)V

这一句话分为

.methodpublicconstructor(Ljava/lang/String;I)v
2.2.1 .method

意思就是方法

2.2.2 public

修饰方法,公共属性

2.2.3 constructor

构造器 这里就是说这个方法是一个构造方法

2.2.4

Java在编译之后会在字节码文件中生成方法,称之为实例构造器,该实例构造器会将语句块,变量初始化,调用父类的构造器等操作收敛到方法中,收敛顺序(这里只讨论非静态变量和语句块)为:

  1. 父类变量初始化

  2. 父类语句块

  3. 父类构造函数

  4. 子类变量初始化

  5. 子类语句块

  6. 子类构造函数

所谓收敛到方法中的意思就是,将这些操作放入到中去执行

2.2.5 (Ljava/lang/String;I)

括号里的内容首先是 Ljava/lang/String,这里就是说第一个参数为String类型。
; 后面有一个I就是说同样属于 Ljava/lang这里的有一个int型参数。

2.2.6 v

最后面有一个v的含义就是void。也就是没有返回值类型。


我们来看第二句的意思。

.registers 6

寄存器 6个。这里的寄存器就是从v0-v5开始。这个很好理解。


第三句话。

.prologue

开场,意思是程序的开始。


第四句话。

.line 10

第10行代码的意思。


第五句话是:

invoke-direct {p0}, Ljava/lang/Object;->()V

首先先分解这句话。

invoke-direct{p0}Ljava/lang/Object;->()V
invoke-direct

就是方法调用的意思。

{p0}

p0就是说第一个参数。但是这里并没有第一个参数,这里默认就是this,我们自己传进去的参数从p1开始计数。

Ljava/lang/Object;->

调用方法

()里没有内容就是说没有参数。v相当于void,这里不再重复。


第六句话是

iput-object p1, p0, LPerson;->name:Ljava/lang/String;

分解一下

iput-object p1,p0LPerson;->name:Ljava/lang/String;

iput-object p1,p0的含义就是把p1的内容给p0。

LPerson;->name:Ljava/lang/String;

这句话的含义就是说把Person类里的一个名为name,类型为String的属性拿过来,这些是为了修饰p0。其实也就是this.name.


第七句话

iput p2, p0, LPerson;->age:I

这里也分解为两个部分。

iput p2, p0LPerson;->age:I

iput p2, p0,这里就是把p2的值给p0

LPerson;->age:I

说明了age这个数据类型是int。

这里可能会发现调用两个属性不一样,这里就是因为String并不是一个基本数据类型。所以使用了iput-object,如果是基本数据类型为iput。


第八句话

 sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

分解

 sget-object v0 Ljava/lang/System;->out: Ljava/io/PrintStream;

sget-object v0 就是获取到后见面的东西给v0。

Ljava/io/PrintStream;这个的含义就是说由这个类里的一个Ljava/lang/System;->out:这个方法。


第九句话

new-instance v1, Ljava/lang/StringBuilder;

新建一个StringBuilder的类给v1。


第十句话

invoke-direct {v1}, Ljava/lang/StringBuilder;->()V

和之前的类似,从构造方法里调用v1。


第十一句话

const-string v2, "name:"

const-string 常量字符串。 v2,内容是name:


第十二句话

 invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

分解一下就是

invoke-virtual {v1, v2}Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

invoke-virtual {v1, v2} 调用虚方法,
->append(Ljava/lang/String;)Ljava/lang/StringBuilder;调用一个名为append的,参数为String类型,返回值为StringBuilder类型。


第十三句话

move-result-object v1

就是把上一句的结果给v1寄存器。

之后的内容就是相似的了。

有兴趣可以自己继续向下分析。

2.3 方法模块

这个模块在之前的一篇文章里已经说过了,这里就不再啰嗦了。

2.4 练习

这个练习我们就自己添加一个构造方法。

.method public constructor ()V    .registers 1    invoke-direct {p0}, Ljava/lang/Object;->()V    return-void.end method

这个是我们自己写的一个构造方法。无参无返回值。

编译成jar文件进行查看。



0x02 smali类相互调用

1. java代码

在0x01的前提上我们再写一个调用demo。

public class Demo{    public static void main(String[]args)    {        Person p=new Person("zhuzhu",14);    }}

代码很简单。

2.smali代码

这里我们要使用

javac -source 1.6 -target 1.6 *.java

编译所有.java文件

然后使用

dx --dex --output=demo.dex *.class

把所有的.class文件编译成dex文件。



我们来主要看看main函数。

.method public static main([Ljava/lang/String;)V    .registers 4    .prologue    .line 4    new-instance v0, LPerson;    const-string v1, "zhuzhu"    const/16 v2, 0xe    invoke-direct {v0, v1, v2}, LPerson;->(Ljava/lang/String;I)V    .line 5    return-void.end method
new-instance v0, LPerson;

新建一个类,v0

const-string v1, "zhuzhu"

然后定义一个常量 v1。

const/16 v2, 0xe

定义一个16位的常量

invoke-direct {v0, v1, v2}, LPerson;->(Ljava/lang/String;I)V

调用Person类的构造方法,然后把v0,v1,v2当做参数传进去。

其实类之前的交互调用其实并不难。

3.总结

我们调用其他类的时候。

1.new-instance 实例化一个对象
2.invoke-direct 调用构造方法

0x03 小练习(甜点)

首先来看看我们写的程序。

然后是手写的smali代码。

.class public LPd;.super Ljava/lang/Object;.source "Pd.java"# direct methods.method public constructor ()V    .registers 1    .prologue    invoke-direct {p0}, Ljava/lang/Object;->()V    return-void.end method.method public static main([Ljava/lang/String;)V    .registers 4    .prologue    new-instance v0,LPerson;    invoke-direct {v0}, LPerson;->()V    return-void.end method

关于"Android逆向中smali复杂类实例分析"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

就是 方法 代码 参数 类型 就是说 模块 实例 内容 意思 分析 文件 复杂 变量 含义 语句 构造器 编译 实例分析 函数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 喔噻互联网科技有限公司 山东特亿宝互联网科技有限公司 蓝思科技飞鸽互联网 北京互联网科技公司 科技互联网创业计划书 滨湖区互联网智能科技产品供应 剑昆互联网络科技有限公司临桂 互联网时代科技改变生活 互联网公司科技股 智腾互联网科技有限公司 和信科技工业互联网 如何创新互联网科技 工业互联网等科技实现智能化赋能 伊宁互联网科技做什么的 智帮互联网科技公司最近动向 浙南科技城互联网大厦招聘 互联网公司属于科技吗 第三届互联网大会安防黑科技 株洲百竞科技的互联网营销顾问 互联网科技卖菜 互联网科技公司怎么样 有马互联网科技 奇酷互联网络科技 现代科技和互联网有关系吗 996高科技互联网公司 易企秀互联网科技是做什么的 互联网科技包装股 现代互联网科技公司 知域互联网科技有限公司官网
0