Android逆向之smali学习

Smali是Android虚拟机Dalvik反汇编的结果。

Dalvik指令集

指令格式为:[op]-[type](可选)/[位宽,默认4位] [目标寄存器],[源寄存器](可选)

赋值:move*  v1,v2

返回操作:return-[type]  (void ,不带, object,wide)  

声明常量:  const(/4、/16、/hight16) v1 im  将常量赋值给v1寄存器,const-wide(/16、/32、/hight16) v1 im  将双字型常量赋值给v1寄存器,const-string(/jumbo) v1 “str”  过长时需要加上jumbo,const-class v1 La/b/TargetClass  将Class常量a.b.TargetClass赋值给v1

调用函数:invoke-[kind()] {参数表}, 函数名@BBBB

invoke-virtual      :用于调用一般的,非private、非static、非final、非构造函数的方法,它的第一个参数往往会传p0,也就是this指针
invoke-super       :用于调用父类中的方法,其他和invoke-virtual保持一致
invoke-direct       :用于调用private修饰的方法,或者构造方法
invoke-static       :用于调用静态方法,比如一些工具类
invoke-interface  :用于调用interface中的方法

判断: if-*  v1,v2 【less than - lt,greater than - gt,equal -eq, not -ne,le,ge】

比较:cmp* v1,v2,v3 等价于 v1 = (v3 - v2)%1

取值(get)和赋值(put): iget* 和 iput*

类型转换 :如 float-to-int  将v2寄存器中的float类型值转换为int类型,并赋值给v1寄存器

算术运算 :add-int/2addr v1, v2 将v1、v2寄存器中的值相加,并赋值给v1寄存器

注:lit8(limit)是对要加的常量的长度限制,如果不写,则默认为4位,还可选择lit16,即16bit

语法:

.field  定义变量

.method  方法

.parameter  方法参数

.prologue  方法开始

.line 12  此方法位于第12行

数据类型:

  • V void,只能用于返回值类型

  • Z boolean

  • B byte

  • S short

  • C charI intJ long(64 位)

  • F floatD double(64 位)

  • L Java 类类型

  • [ 数组类型

猜你喜欢

转载自www.cnblogs.com/glodears/p/9826592.html