.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的基本语法及其各种操作码的使用方式,这对于理解Android应用程序的工作原理、进行逆向工程分析以及代码调试具有重要意义。 #### 二、基本概念 - **寄存器**:在Smali中,所有的变量都存储在...
本文将对smali语法进行详细的介绍,包括基本语法、数据类型、操作符、控制流语句、函数调用、异常处理等内容。 基本语法 smali语法与Java语法非常相似,但smali语法更加简洁。smali语法主要由以下几部分组成: * ...
首先,Smali语法的基础元素包括字段定义、方法定义、参数、流程控制等。例如: `.field private isFlag:z` 定义了一个名为isFlag的私有布尔型变量。 `.method` 开始一个方法的定义,`.parameter` 用于声明方法参数...
SMALI基本结构** SMALI代码由一系列指令组成,每条指令占一行,由操作码、操作数和注释(可选)组成。例如: ``` .method public constructor ()V .registers 2 invoke-direct {v0}, Ljava/lang/Object;->()V ...
首先,我们要理解Smali语法的基本结构。Smali语法遵循Dalvik虚拟机的指令集,每个指令通常由操作码(opcode)、操作数(operands)以及可能的注释组成。例如,`move`指令用于将一个寄存器的值移动到另一个寄存器: ...
1. **基本结构**:每个Smali文件都代表一个类,以`.class`开头,包含类名、父类名和接口列表。例如,`.class public Lcom/example/MyClass;`定义了一个名为`MyClass`的公共类。 2. **指令**:Smali代码由一系列指令...
2. **Smali基本语法(入门).txt** 这是针对初学者的基础教程,涵盖了smali的入门知识,如指令集、类结构、字段和方法定义等。它将帮助你理解如何将Java源代码转换为smali,以及如何读取和解析smali代码,是迈进...
#### 二、Smali基本概念 - **Dalvik虚拟机**:Android操作系统的核心组件之一,负责执行应用程序的字节码。 - **寄存器**:用于存储数据的内存单元,不同指令可以访问不同数量的寄存器。 - **字面值**:直接赋值给...
内容概述:本指南旨在介绍安卓应用逆向工程中使用的SMALI语法,涵盖了SMALI语言的基本语法结构、指令集以及常见的逆向分析技巧。通过学习本指南,读者将能够理解和分析安卓应用程序的SMALI代码,从而进行逆向工程和...
在smali语法中,寄存器是执行操作的基础单元,它们都是32位宽,能处理所有基本类型。对于64位的数据类型如long和double,需要使用连续的两个寄存器来存储。寄存器的命名有两种主要方式: - V命名法:用于通用寄存器...
**smali语法中文详解** smali是一种用于解析和构建Android应用程序DEX文件的汇编语言,它是Dalvik虚拟机(Dalvik VM)字节码的表示形式。Dalvik虚拟机是Google专为Android平台设计的,它使用DEX(Dalvik Executable...
《深入理解Smali语法》 Smali是一种汇编语言,它是Dalvik虚拟机(Android系统中的虚拟机)的字节码表示形式。了解Smali语法对于Android应用的逆向工程和调试至关重要。以下是对Smali语法核心部分的详细解析: 1. *...
了解这些基本语法是理解和修改`.smali`代码的基础。 使用`smali高亮插件`时,开发者可以专注于代码逻辑,而不必被混乱的字符和行号所困扰。它使得`smali`代码看起来更接近高级语言,有助于更快地理解代码结构和逻辑...
Smali代码保留了Java源代码的基本结构和语法,但使用了不同的指令集,这对于逆向工程和安全分析非常有用。 **Java语言** Java是广泛使用的面向对象编程语言,以其"一次编写,到处运行"的理念著称。在Android开发中...
首先,让我们了解一下"smali2java"的基本工作流程。它通常会从Smali文件中读取指令,然后通过一系列的映射和转换规则,将这些指令翻译成对应的Java语法。这个过程涉及到对Dalvik虚拟机指令集的深入理解,包括各种...
Smali语法简洁,与Java相比,虽然更接近机器语言,但仍然具有较高的可读性。 **2. BakSmali的作用** BakSmali是Smali的反编译器,它将.dex文件转换为Smali代码。这个过程被称为“反汇编”(disassembly)。BakSmali...
对于smali语法,理解基本的指令集和数据类型是必要的,因为smali代码非常底层,每条指令都对应着Dalvik虚拟机的具体操作。此外,了解APK和JAR的结构也很重要,知道如何提取其中的smali文件。 在实际应用中,smali2...
基本的Smali指令包括操作数栈操作(如`move`,`add`,`sub`等)、控制流(`if`,`goto`等)、方法调用(`invoke`系列)以及类和字段访问。通过阅读和修改Smali代码,开发者可以深入到应用的细节中,甚至实现对应用...
2. **Smali语法**:Smali是一种基于AT&T风格的汇编语言,用于编写Android的Dalvik字节码。理解Smali语法对于分析Android应用的底层行为至关重要。例如,指令如`invoke-virtual`用于调用方法,`const-string`用于设置...