Smali入门手册

本文作为Smali入门教程,详细介绍了Smali的基本概念、数据类型、基础语法,包括表达式、条件语句、循环语句和try-catch语句,并解析了Smali类文件的结构,帮助读者理解Android应用的底层运作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Smali 简介

首先,提到smali就先说下逆向,逆向通常是安全工程师(逆向工程师),系统分析三方APP以及做破解等恶意分子因为某些利益在做(apk二次打包插入广告、破解收费应用、恶意代码植入、剽窃api等)的一种手段。

当然技术是一把双刃剑,在于使用技术的人而不再技术本身。

回归正题,Smali是一种宽松式的Jasmin/dedexer语法,是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行。

Smali,Baksmali分别是冰岛语中编译器,反编译器的叫法。也许你会问为什么是冰岛语呢,因为Dalvik是一个冰岛渔村名字。

二、Smali 语法

1. 数据类型

Davlik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个寄存器表示。
Dalvik字节码有两种类型:基本类型;引用类型(包括对象和数组)。

(1)基本类型

type 解释
V void只能用于返回值类型
Z boolean
B byte
S short
C char
I int
J long(64位)
F float
D double(64位)

(2)引用类型

type 解释
L 对象类型(Lpackage/ObjectName; 相当于java中的package.ObjectName;)
[I 表示一个整形的一维数组,相当于java的int[];
[Ljava/lang/String 表示一个String的对象数组

① 对象类型:

“L“:表示这是一个对象类型
”package/ObjectName“:该对象所在的包与类名,比如Ljava/lang/String =>java.lang.String
”;“:表示对象名称的结束

② 数组的表示形式:

” [I “ :表示一个整形的一维数组,相当于java的int[];
对于多维数组,只要增加”[“ 就行了,[[I => int[][]; 注:每一维最多255个;

③ 对象数组的表示形式:

[Ljava/lang/String 表示一个String的对象数组;

2. 基础语法

2.1 表达式

Java源代码:

    public void smaliExpression(){
   
        //加法运算
        int a = 1;
        double b = 2.5;
        double c = a + b;

        //减法运算
        double d = b - a;

        //乘法运算
        double e = a * b;

        //除法运算
        double f = b / a;

        //异或运算
        int g = 3;
        int h = a ^ g;

        //三目运算
        int i = a > b?a:g;
    }

Smali代码:

.method public smaliExpression()V
    .locals 15

    .line 16
    const/4 v0, 0x1    #1

    .line 17
    .local v0, "a":I
    const-wide/high16 v1, 0x4004000000000000L    # 2.5

    .line 18
    .local v1, "b":D
    int-to-double v3, v0   //将int型的 1 强转为double的 1.0

    add-double/2addr v3, v1  //两个double类型相加

    .line 21
    .local v3, "c":D
    int-to-double v5, v0

    sub-double v5, v1, v5    //减法 V5 = V1-V5

    .line 24
    .local v5, "d":D
    int-to-double v7, v0

    mul-double/2addr v7, v1   //乘法

    .line 27
    .local v7, "e":D
    int-to-double v9, v0

    div-double v9, v1, v9   //除法

    .line 30
    .local v9, "f":D
    const/4 v11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值