`

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做继续判断
复制代码

 

http://www.cnblogs.com/lee0oo0/p/3728271.html

http://blog.csdn.net/lpohvbe/article/details/7981386

分享到:
评论

相关推荐

    smali中文语法详细说明

    本文将详细介绍Smali的基本语法及其各种操作码的使用方式,这对于理解Android应用程序的工作原理、进行逆向工程分析以及代码调试具有重要意义。 #### 二、基本概念 - **寄存器**:在Smali中,所有的变量都存储在...

    smali语法中文.pdf

    本文将对smali语法进行详细的介绍,包括基本语法、数据类型、操作符、控制流语句、函数调用、异常处理等内容。 基本语法 smali语法与Java语法非常相似,但smali语法更加简洁。smali语法主要由以下几部分组成: * ...

    smali基本语法

    首先,Smali语法的基础元素包括字段定义、方法定义、参数、流程控制等。例如: `.field private isFlag:z` 定义了一个名为isFlag的私有布尔型变量。 `.method` 开始一个方法的定义,`.parameter` 用于声明方法参数...

    SMALI语法中文.pdf.zip

    SMALI基本结构** SMALI代码由一系列指令组成,每条指令占一行,由操作码、操作数和注释(可选)组成。例如: ``` .method public constructor ()V .registers 2 invoke-direct {v0}, Ljava/lang/Object;-&gt;()V ...

    smali语法高亮文件

    首先,我们要理解Smali语法的基本结构。Smali语法遵循Dalvik虚拟机的指令集,每个指令通常由操作码(opcode)、操作数(operands)以及可能的注释组成。例如,`move`指令用于将一个寄存器的值移动到另一个寄存器: ...

    Android逆向Smali语法【中文+英文】

    1. **基本结构**:每个Smali文件都代表一个类,以`.class`开头,包含类名、父类名和接口列表。例如,`.class public Lcom/example/MyClass;`定义了一个名为`MyClass`的公共类。 2. **指令**:Smali代码由一系列指令...

    smali学习资料大全

    2. **Smali基本语法(入门).txt** 这是针对初学者的基础教程,涵盖了smali的入门知识,如指令集、类结构、字段和方法定义等。它将帮助你理解如何将Java源代码转换为smali,以及如何读取和解析smali代码,是迈进...

    smali语法.pdf

    #### 二、Smali基本概念 - **Dalvik虚拟机**:Android操作系统的核心组件之一,负责执行应用程序的字节码。 - **寄存器**:用于存储数据的内存单元,不同指令可以访问不同数量的寄存器。 - **字面值**:直接赋值给...

    安卓逆向smali语法

    内容概述:本指南旨在介绍安卓应用逆向工程中使用的SMALI语法,涵盖了SMALI语言的基本语法结构、指令集以及常见的逆向分析技巧。通过学习本指南,读者将能够理解和分析安卓应用程序的SMALI代码,从而进行逆向工程和...

    Android 反编译和smali语法用于ROM适配

    在smali语法中,寄存器是执行操作的基础单元,它们都是32位宽,能处理所有基本类型。对于64位的数据类型如long和double,需要使用连续的两个寄存器来存储。寄存器的命名有两种主要方式: - V命名法:用于通用寄存器...

    smali语法中文.doc

    **smali语法中文详解** smali是一种用于解析和构建Android应用程序DEX文件的汇编语言,它是Dalvik虚拟机(Dalvik VM)字节码的表示形式。Dalvik虚拟机是Google专为Android平台设计的,它使用DEX(Dalvik Executable...

    smali语法.doc

    《深入理解Smali语法》 Smali是一种汇编语言,它是Dalvik虚拟机(Android系统中的虚拟机)的字节码表示形式。了解Smali语法对于Android应用的逆向工程和调试至关重要。以下是对Smali语法核心部分的详细解析: 1. *...

    smali高亮插件

    了解这些基本语法是理解和修改`.smali`代码的基础。 使用`smali高亮插件`时,开发者可以专注于代码逻辑,而不必被混乱的字符和行号所困扰。它使得`smali`代码看起来更接近高级语言,有助于更快地理解代码结构和逻辑...

    smali2java——直接将smali转换成java

    Smali代码保留了Java源代码的基本结构和语法,但使用了不同的指令集,这对于逆向工程和安全分析非常有用。 **Java语言** Java是广泛使用的面向对象编程语言,以其"一次编写,到处运行"的理念著称。在Android开发中...

    smali2java 源码

    首先,让我们了解一下"smali2java"的基本工作流程。它通常会从Smali文件中读取指令,然后通过一系列的映射和转换规则,将这些指令翻译成对应的Java语法。这个过程涉及到对Dalvik虚拟机指令集的深入理解,包括各种...

    Smali_BakSmali

    Smali语法简洁,与Java相比,虽然更接近机器语言,但仍然具有较高的可读性。 **2. BakSmali的作用** BakSmali是Smali的反编译器,它将.dex文件转换为Smali代码。这个过程被称为“反汇编”(disassembly)。BakSmali...

    smali2java

    对于smali语法,理解基本的指令集和数据类型是必要的,因为smali代码非常底层,每条指令都对应着Dalvik虚拟机的具体操作。此外,了解APK和JAR的结构也很重要,知道如何提取其中的smali文件。 在实际应用中,smali2...

    java2smali

    基本的Smali指令包括操作数栈操作(如`move`,`add`,`sub`等)、控制流(`if`,`goto`等)、方法调用(`invoke`系列)以及类和字段访问。通过阅读和修改Smali代码,开发者可以深入到应用的细节中,甚至实现对应用...

    微信7.0.0smali研究工程

    2. **Smali语法**:Smali是一种基于AT&T风格的汇编语言,用于编写Android的Dalvik字节码。理解Smali语法对于分析Android应用的底层行为至关重要。例如,指令如`invoke-virtual`用于调用方法,`const-string`用于设置...

Global site tag (gtag.js) - Google Analytics