Android逆向之smali语法

当我们发现某应用有个很牛逼功能的时候,还在为如何实现和拿不到源码而烦恼吗?
当我们写的app需要考虑安全性的时候,还在为明明用了混淆和第三方加固,但别人还是能破解而烦恼吗?
当我们发现api在某些手机上被弃用,而其他应用或系统应用又能实现该功能的时候,还在为相同的api自己却不能用而烦恼吗?

前车之鉴:当我们用一些工具去打开反编译后的代码,看着一团麻的指令和一些你从未见过的关键字、代码格式风格,赖不住性子就潦草的关掉了。其实是我们没有找对方法来学习它。

接下来介绍一下smali:

1、Dalvik字节码

Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。虽然Android上的程序是使用java来开发的,但是Dalvik和标准的java虚拟机JVM还是两回事。Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex(dalvik executable),而JVM则执行的是java字节码。Dalvik VM比JVM速度更快,占用空间更少。

2、Smali定义

Smali是Davlik的寄存器语言,语法上和汇编语言类似。 Davlik是基于寄存器的,就是说smali里的所有操作都必须经过寄存器来进行。apk文件通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件。

3、Smali基本数据类型

语法 类型
V void
Z boolean
B byte
S short
C char
I int
j long(64 bits)
f float
D double(64 bits)

注:
1、变量存放在寄存器中,寄存器为32位,支持任何类型,其中long,double是64位,使用两个相邻的寄存器。
2、V 只能用于返回值类型。

4、引用类型(数组和对象)

语法 类型
L java类
[ 数组

[x表示一维数组,x代表基本类型,如[I代表int[],[[x代表二维数组,如[[I表示int[][]。
对象类型以L作为开头来表示,格式是Lpackage/ClassName;(用分号表示对象结束是必须的)
如:Ljava/lang/String;

String对象在smali中为:Ljava/lang/String;
Class1对象的一个boolean成员表示为:Lcom/disney/Class1;->isR

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值