Android逆向学习——Smali代码

Smali代码的数据类型

B---byte
C---char
D---double
F---float
J---long
I---int
S---short
V---void
Z---boolean
[XXX---array
LXXX/YYY---object
L代表这个数据类型是一个类,如
Ljava/lang/String代表一个String类

Smali的函数定义

Func-Name (Para-Type1Para-Type2Para-Type3...) Return-Type
例子:
1)Hello()V
void Hello();
2)Hello(IIC)V
void Hello(int,int,char);
3)Hello(Z[S[ILjava/Lang/String;[[J)Ljava/Lang/String
String Hello(boolean,short,int,String,long[][]);

基本语法

.field private isFlag:Z 定义变量
.method 方法
.parameter/param 方法参数(用P寄存器来代替传入的参数)
.prologue 方法开始
.line 123 方法位于第123行
invoke-supper 调用父函数
const/height16 v0,0x7f03 把0x7f03赋值给v0
invoke-direct 调用函数
return-void 函数返回void
.end method 函数结束
new-instance 创建实例
input-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
.loacls 使用V类型寄存器的个数
.annotation 内部类的表示

注意以上语法中所有前面带有"."的类型都可以理解为注释,在这种类型上下断点程序是无法中断的。
在调用函数的时候如果没有static关键字,p0都代表this指针。
使用put的赋值顺序是从左向右,而使用get语法的赋值是从右向左。
条件跳转

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_**

其他的方法可以使用AndroidKiller进行学习,只要将鼠标悬停在对应的Smali汇编上就可以看到具体的含义。
寄存器
本地寄存器用V开头数字结尾,如v0、v1等,参数寄存器则使用p开头,如p0、p1等。特别注意p0不一定是第一个参数。在非静态函数中p0代表this。

发布了30 篇原创文章 · 获赞 5 · 访问量 1913

猜你喜欢

转载自blog.csdn.net/AlexSmoker/article/details/104494220