smali基础

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不等于0
  • eqz等于0

+BBBBBBBB指向递增偏移表

比较

cmp-float 比较两个单精度浮点数

cmp-double 比较两个双精度浮点数

cmp-long 比较两个长整型

字符

普通字段以"i"开头:

iget 读操作

iput 写操作

静态字段以"s"开头:

sget 读操作

sput 写操作

方法调用

invoke-virtual 调用实例的虚方法

invoke-super 调用实例的父方法

invoke-direct 调用实例的直接方法

invoke-static 调用实例的静态方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一回生二回熟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值