Smali基本语法

.field private isFlag:z  定义变量

.method  方法

.parameter  方法参数

.prologue  方法开始

.line 12  此方法位于第12行

invoke-super  调用父函数

const/high16  v0, 0x7fo3  把0x7fo3赋值给v0

invoke-direct  调用函数

return-void  函数返回void

.end method  函数结束

new-instance  创建实例

iput-object  对象赋值

iget-object  调用对象

invoke-static  调用静态函数

条件跳转分支:

"if-eq vA, vB, :cond_**"   如果vA等于vB则跳转到:cond_** "if-ne vA, vB, :cond_**"   如果vA不等于vB则跳转到:cond_** "if-lt vA, vB, :cond_**"    如果vA小于vB则跳转到:cond_** "if-ge vA, vB, :cond_**"   如果vA大于等于vB则跳转到:cond_** "if-gt vA, vB, :cond_**"   如果vA大于vB则跳转到:cond_** "if-le vA, vB, :cond_**"    如果vA小于等于vB则跳转到:cond_** "if-eqz vA, :cond_**"   如果vA等于0则跳转到:cond_** "if-nez vA, :cond_**"   如果vA不等于0则跳转到:cond_** "if-ltz vA, :cond_**"    如果vA小于0则跳转到:cond_** "if-gez vA, :cond_**"   如果vA大于等于0则跳转到:cond_** "if-gtz vA, :cond_**"   如果vA大于0则跳转到:cond_** "if-lez vA, :cond_**"    如果vA小于等于0则跳转到:cond_**

=============================================

if函数的java代码:

private boolean ifSense(){
        boolean tempFlag = ((3-2)==1)? true : false;
        if (tempFlag) {
            return true;
        }else{
            return false;
        }
    }

if函数分析:

.method private ifSense()Z
    .locals 2

    .prologue
    .line 22
    const/4 v0, 0x1     // v0赋值为1

    .line 24
    .local v0, tempFlag:Z
    if-eqz v0, :cond_0            // 判断v0是否等于0, 不符合条件向下走, 符合条件执行cond_0分支

    .line 25
    const/4 v1, 0x1            // 符合条件分支

    .line 27
    :goto_0
    return v1

    :cond_0
    const/4 v1, 0x0            // cond_0分支

    goto :goto_0
.end method

###文字描述:如果符合if分支则程序往下走,最终return ; 而如果条件不符合则会走到 :cond_0分支 , 最终执行 goto :goto_0走回 :goto_0返回

======================================================

for函数java代码:

private void forSense(){
    listStr = new ArrayList<String>(COUNT);
    for (int i = 0; i < COUNT; i++) {
        listStr.add("现在轮到我上场乐");
    }
}

for函数分析:

.line 40
    const/4 v0, 0x0

    .local v0, i:I
    :goto_0
    if-lt v0, v3, :cond_0            //  if-lt判断数值v0小于v3 ,    如不符合往下走, 符合执行分支 :cond_0

    .line 43
    return-void

    .line 41
    :cond_0                // 标签
    iget-object v1, p0, Lcom/example/smalidemo/MainActivity;->listStr:Ljava/util/List;                // 引用对象

    const-string v2, "\u73b0\u5728\u8f6e\u5230\u6211\u4e0a\u573a\u4e50"

    invoke-interface {v1, v2}, Ljava/util/List;->add(Ljava/lang/Object;)Z        // List是接口, 所以执行接口方法add

    .line 40
    add-int/lit8 v0, v0, 0x1    // 将第二个v0寄存器中的值,加上0x1的值放入第一个寄存器中, 实现自增长

    goto :goto_0                // 回去:goto_0标签

###文字描述:设定一个标签goto_0, 判断v0小于v3, 符合执行分支:cond_0 ,然后又跑回:goto_0做继续判断

=========================================================

时间: 2024-11-05 15:53:38

Smali基本语法的相关文章

smali 语言语法

Androidkiller 可以反编译Android的apk,生成一种.smali代码,下面是网上找的一篇关于smali的语法介绍: 文章来源:http://www.brogrammer.cn/android/smali/ 1.smali apk文件通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件.smali语言是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的.基于寄存器的意思

Smali文件语法解析

大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版本):Where's My Water.zip\ asset\                        <资源目录1:asset和res都是资源目录但有所区别,见下面说明> lib\                             <so库存放位置,一般由NDK编译得到,常见于

Smali代码语法

Smali是什么? 简介 Smali支持注解.调试信息.行数信息等基本Java的基本特性,可以说是很接近Java编译在JVM上的中间语言了,一般用来做Android程序的逆向工程 由于Smali是用于Dalvik和Art(Android虚拟机)的反汇编程序实现 APK文件>dex文件>smali文件>修改代码 所以smali语言是Dalvik的反汇编语言 B---byteC---charD---doubleF---floatI---intJ---longS---shortV---void

Smali中语法

类型 v   void  只能用于返回值类型 Z   boolean B   byte S   short C   char I    int J    long         2个寄存器 F   float D   double  2个寄存器 对象类型:Lpackage/name/ObjectName;  相当于java中的package.name.ObjectName;解释如下: L:表示这是一个对象类型 package/name:该对象所在的包 ::表示对象名称的结束 数组的表示形式:

安卓破解软件需懂的Smali语法

Smali中语法: 类型 v   void  只能用于返回值类型 Z   boolean B   byte S   short C   char I    int J    long 2个寄存器 F   float D   double  2个寄存器 对象类型:Lpackage/name/ObjectName;  相当于java中的package.name.ObjectName;解释如下: L:表示这是一个对象类型 package/name:该对象所在的包 ::表示对象名称的结束 数组的表示形式

smali语法小结

smali语言是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的.基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行.Link Smali-数据类型 Davlik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个寄存器表示.Dalvik字节码有两种类型:原始类型:引用类型(包括对象和数组)@link. M1.基本数据类型 V void Z boolean B by

Smali语法

看阿里巴巴的<深入探索Android热修复>,里面的代码看不懂,一查才知道是Smali语法,百度了语法,转载如下 转载自smali 语言语法 1.smali apk文件通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件.smali语言是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的.基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行. 2.基本数据类型 B-by

android smali代码注入 实战一

有同学在通服里面干活,最近一直忙着4g基站搭建的干活,测试设备(android)测量移动网络数据,没有自动保存记录的功能,只能手动记录各种测试参数,不知道测试软件供应商是怎样想的,竟然不提供的这样的功能! 要我帮忙把测试数据自动导入excel表格中,我硬着头皮去尝试下.网上有smali的语法和注入的介绍,但参考价值不大,分享下自己的smali注入的过程和心得(这里smali语法就不讲了). 案例 1.需求 需要提取数据界面如下: 提取数据字段信息: 地点address 小区识别码 cellId,

Smali语言学习了

   最近一周在研究rom移植,所以就对Smali语言学习了一下,Smali语言其实就是Davlik的寄存器语言:Smali语言就是android的应用程序.apk通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件,文件的展示语言. 如图,下面是HelloWorldApp通过apktool反编译出来的目录: Smali文件夹里面的目录, 先打开一个主类HelloWorldAppActivity.smali文件,先来浏览一下里面的语言,在来说说smali的语法