smali基础
反编译安卓apk会得到smali代码。smali是dalvik的汇编指令集
寄存器
.locals
定义寄存器的数量
在smali中使用寄存器必须实现声明需要使用多少个寄存器,才能进行调用
在修改程序的smali代码时,如果增加了使用寄存器的数量,就需要进行修改
函数
.method
函数的开始
.end
函数的结束
两者之间为该函数的代码
数据操作
move vA,vB
将vB寄存器的值赋予vA寄存器
move16 vAA,vBBBB
/16定义了数据宽度,寄存器默认大小为四位,vAA为八位,vBBBB为十六位
move-object/16 vA,vB
用于对象赋值
move-object/16 vA,vB
返回
return vAA
return-object
返回一个对象
修改程序时,常修改其返回值来达到改变程序逻辑的目的
数据定义
const
const-string
定义一个字符串
实例操作
check-cast vAA,type@BBBB
将vAA寄存器的对象引用转化成制定类型
instance-of vA,vB,type@CCCC
判断vB寄存器的对象引用是否可以转换成制定类型,是则vA=1,反之则vA=0
new-instance vAA,type@AAAA
构造一个制定类型的新实例
array-length vA,vB
获取vB寄存器中数组的长度,结果赋予vA寄存器
new-array vA,vB,type@CCCC
构造制定类型和大小(vB)的数组,结果赋予vA
在分析密码加密时常用到array-length,ctf有时候会有对密码长度判断,针对这个进行修改可以达到破解的目的
异常
throw vAA
抛出vAA寄存器中指定类型的异常
跳转
常为分析的重点
goto
无条件跳转
packed-switch vAA,+BBBBBBBB
分支跳转,递增循环
sparse-switch vAA,+BBBBBBBB
分支跳转,无规律
if-test
if跳转
eq
等于ne
不等于lt
小于ge
大于等于`gt
大于nez
不等于0eqz
等于0
+BBBBBBBB指向递增偏移表
比较
cmp-float
比较两个单精度浮点数
cmp-double
比较两个双精度浮点数
cmp-long
比较两个长整型
字符
普通字段以"i"开头:
iget
读操作
iput
写操作
静态字段以"s"开头:
sget
读操作
sput
写操作
方法调用
invoke-virtual
调用实例的虚方法
invoke-super
调用实例的父方法
invoke-direct
调用实例的直接方法
invoke-static
调用实例的静态方法