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

摘要:
如果一个方法有两个参数和五个寄存器,那么这些参数将放在最后两个寄存器v3和v4中。例如,非静态方法LMyObject;-˃CallMeV有两个整数参数和一个隐含的LMyObject;参数,因此总共有3个参数。调用该方法时,调用该方法的对象存储在v2中,第一个整数参数存储在v3中,第二个整数参数保存在v4中。如果eqp1,v0,:cond8表示如果p1和v0相等,则执行cond8::cond8invoke direct{p0},Lcom/paul/test/a;-˃D()V调用com。保罗。test a,if-nep1,v0,:condb的d()方法意味着如果它不相等,执行condb的过程是:condb invoke direct{p0},Lcom/paul/test/a;-˃c(V)

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:该对象所在的包

;:表示对象名称的结束

数组的表示形式

[I  :表示一个整形的一维数组,相当于javaint[];

对于多维数组,只要增加[ 就行了,[[I = int[][];注:每一维最多255个;

对象数组的表示形式:

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

方法调用的表示形式:

Lpackage/name/ObjectName;——>methodName(III)Z  详解如下:

Lpackage/name/ObjectName  表示类型

methodName   表示方法名

III   表示参数(这里表示为3个整型参数)

说明:方法的参数是一个接一个的,中间没有隔开;

method(I [[I I Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;

methodint,int[][],int,String,Object[]

在java中则为:
String method(int, int[][], int, String, Object[])

 

字段的表示形式

 Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;

 即表示: 包名,字段名和各字段类型

有两种方式指定一个方法中有多少寄存器是可用的:

 .registers  指令指定了方法中寄存器的总数

 .locals        指令表明了方法中非参寄存器的总数,出现在方法中的第一行

方法的传参:

当一个方法被调用的时候,方法的参数被置于最后N个寄存器中。如果一个方法有2个参数,5个寄存器(v0-v4),那么参数将置于最后2个寄存器——v3v4 非静态方法中的第一个参数总是调用该方法的对象。
例如,非静态方法LMyObject;->callMe(II)V2个整型参数,另外还有一个隐含的LMyObject;参数,所以总共有3个参数。假如在该方法中指定了5个寄存器(v0-v4),以.registers方式指定5个或以.locals方式指定2个(即2local寄存器+3个参数寄存器)。当该方法被调用的时候,调用该方法的对象(即this引用)存放在v2中,第一个整型参数存放在v3中,第二个整型参数存放在v4中。

寄存器的命名方式:

 V命名

P命名  第一个寄存器就是方法中的第一个参数寄存器

比较:使用P命名是为了防止以后如果在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点

特别说明一下:LongDouble类型是64位的,需要2个寄存器

例如:对于非静态方法

LMyObject——>myMethod(IJZ)V;

4个参数:LMyObject,int,long,bool;   需要5个寄存器来存储参数;

P0    this

P1    I (int)

P2P3  J (long)

P4    Z(bool)

补充:
@ static fields 定义静态变量的标记
@ instance fields 定义实例变量的标记
@ direct methods 定义静态方法的标记
@virtual methods 定义非静态方法的标记
构造函数的返回类型为V,名字为<init>



if-eq p1, v0, :cond8 表示如果p1v0相等,则执行cond8的流程:
:cond8
invoke-direct {p0}, Lcom/paul/test/a;->d()V
调用com.paul.test.ad()方法
if-ne p1, v0, :condb 表示不相等则执行condb的流程:
:condb
invoke-direct {p0}, Lcom/paul/test/a;->c()V

免责声明:文章转载自《安卓破解软件需懂的Smali语法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇家族(codevs 1073)了解一下Mysql的刷脏以及如何合理刷脏下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

汇编效率优化:指令处理机制

大多数情况下,编写程序都不会使用汇编语言而是使用高级语言,原因大致有以下几点: 花费更多时间。高级语言的一行相当于汇编语言的几行、几十行甚至更多。 不够安全。比如说在进行函数调用时PUSH与POP必须成对出现,高级语言中的函数调用会自动为你执行PUSH与POP的操作,但是汇编语言中就必须由程序员自己保证PUSH与POP一致,否则会导致栈错乱,使得程序出现...

Linux PCI网卡驱动的详细分析

学习应该是一个先把问题简单化,在把问题复杂化的过程。一开始就着手处理复杂的问题,难免让人有心惊胆颤,捉襟见肘的感觉。读Linux网卡驱动也是一 样。那长长的源码夹杂着那些我们陌生的变量和符号,望而生畏便是理所当然的了。不要担心,事情总有解决的办法,先把一些我们管不着的代码切割出去,留下必 须的部分,把框架掌握了,哪其他的事情自然就水到渠成了,这是笔者的心得...

CP15 协处理器寄存器解读

转载 访问CP15寄存器指令的编码格式及语法说明如下: 31  28 27  24 23  21 20 19  16 15  12 11  8 7  5 4 3  0 cond 1 1 1 0 opcode_1 L cr n rd 1 1 1 1 opcode_2 1 cr...

[转] 函数调用栈

http://kingj.iteye.com/blog/1555017 http://www.cnblogs.com/rain-lei/p/3622057.html   函数调用大家都不陌生,调用者向被调用者传递一些参数,然后执行被调用者的代码,最后被调用者向调用者返回结果,还有大家比较熟悉的一句话,就是函数调用是在栈上发生的,那么在计算机内部到底是如何实...

汇编指令mov、add、sub、jmp

mov:寄存器,数据 mov:寄存器,寄存器 mov:寄存器,内存单元 mov:段寄存器,内存单元 mov:内存单元,寄存器 mov:内存单元,段寄存器 mov:段寄存器,寄存器 mov:寄存器,段寄存器 add:寄存器,数据 add:寄存器,寄存器 add:内存单元,寄存器 add:寄存器,内存单元 sub:寄存器,数据 sub:寄存器,寄存器 sub:...

EFLAGS标志寄存器加深理解

符号位表 这些符号位存在一个叫做PSW(Program Status Word,程序状态字)的16位(4字节)寄存器里面。 符号位 叙述 典型应用 汇编测试 OF 溢出标志,标明一个溢出的运算。真置1,假置0。 CPU 会根据有符号数来进行判断,如果有符号数溢出,OF置1 例如: 16位数 AX:0x858F 进行 SUB AX,...