首页 加密与解密正文

Smali基础语法学习

云水 加密与解密 2019-12-20 15:34:34 1854 0 Smali

一.Smali含义

Smali是Davlik的寄存器语言,语法上和汇编语言类似. Davlik是基于寄存器的,就是说smali里的所有操作都必须经过寄存器来进行.

二.Smali基本类型

B—byte 

C—char

D—double

F—float

I—int

S—short

V—void 

J—long 

Z—boolean

三.Smali引用类型

[XXX ----> array 数组

eg:

int[] ---> [I

Lxxx/yyy ----> object 对象

格式为 LpackageaName/objectName

eg:

String str --->str Ljava/lang/String;

LpackageaName/objectName$subobjectName 内部类

四.Smali函数

格式:

Func-Name (Para-Type1Para-Type2Para-Type3…)Return-Type 注意: 参数之间没有任何分隔符,返回值在最后

eg:

void fun() —> fun()V

boolean fun(int,int,int) —>fun(III)Z

String fun(boolean, int[], int[], String, long)

—>fun(Z[I[ILjava/lang/String,J)Ljava/lang/String

五.Smali基本语法

.field private isFlag:z 定义变量

.method 方法

.parameter 方法参数

.prologue 方法开始

.line123 此方法开始于123行

invoke-super 调用父函数

const/high16 v0,0x7fox 把0x7fox的值赋值给v0

invoke-direct 调用函数

return-void 函数返回void

.end method 函数结束

new-instance 创建实例

iput-object 对象赋值

iget-object 调用对象

invoke-static 调用静态函数

.class public Lcom/disney/WMW/WMWActivty; 类名

.super Lcom/XXX/XXX/XXX; 父类名

.source “XXX.java” 源文件名

.implements Lcom/XXX/XXX/XXX; 实现了接口

.annotation 内部类

六.Smali局部变量

本地寄存器 (local register, 非参寄存器)

常用v开头数字结尾的符号表示 v0,v1,v2…

参数寄存器 (parameter regisgter)

常用p开头数字结尾的符号来表示 p1,p2,p3…

.register 用来标明方法中寄存器的总数,即参数寄存器和非参寄存器

.local 标明在这个函数中最少要用到本地寄存器的个数,出现在方法第一行.

七.Smali条件语法

if-eq vA,vB,:cond_** 如果vA等于vB则跳转到:cond_**

ne 不等于

lt 小于

le 小于等于

gt 大于

ge 大于等于

eqz 等于0

nez 不等于0

ltz 小于0

gez 大于等于0

gtz 大于0

lez 小于0

八. Smali的包信息

- .class public Lcom/aaa;

- .super Lcom/bbb;

- .source "ccc.java"

说明

- 是com.aaa 这个package下的一个类

- 继承自 com.bbb这个类

- 是由 ccc.java这个类编译得到的smali文件

九. Smali函数分析

类型

smali中的函数和成员变量一样也分为两种:

- direct

- virtual

(1) direct method 就是 private 函数.

(2)其余的public 和 protected 函数都属于 virtual method.

eg:

invoke-direct,invoke-virtual,invole-static

invole-XXX/range (参数大于等于5个时候调用的指令)

1.invoke-static

- 用于调用static 函数

- eg: 

invoke-static{},Lcom/aaa;->CheckSignature()Z

- static后面的一对大括号{},实际就是调用该方法的实例 + 参数列表, 由于方法即不需要参数也是static, 所以{}为空.

- eg:

const-string v0,"NDKLIB"

invoke-staticP{v0},Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

- static void System.loadLibrary(String) 来加载 NDK编译的so库用的方法, 就是说这里的v0 就是参数"NDKLIB"

2. invoke-super

- 用于调用父类方法用的指令, 一般用于onCreate,onDestory等方法

3. invoke-direct

- 调用private 函数

- eg:

invoke-direct{p0},Landroid/app/TabActivity;-><init>()V

- 这里init()就是定义在TabActivity中的一个private函数

4. invoke-virtual

- 用于调用protectd或 public函数, 同时要注意修改smali时候不要错用invoke-direct或 invoke-static

- eg:

sget-object v0,Lcom/ddd;->bbb:Lcom/ccc;

invoke-virtual{v0,v1},Lcom/ccc;->Message(Ljava/lang/Object;)V

- v0  就是 bbb:Lcom/ccc

- v1  就是 Ljava/lang/Object参数

5. invoke-xxx/range

- 当方法的参数大于等于5个时候,需要在后面加上 "/range", range表示范围,使用方法也与以上不同

- eg:

invoke-direct/range{v0..v5

},Lcom/pb/ui/TestActivity;->

h(ILjava/lang/String,Ljava/lang/String;Landroid/content/intent;I)Z

- 表示需要传递v0到v5 一共6个参数,大括号里的参数采用省略形式, 且需要连续

6. Smali 中函数返回结果的操作

- Smali中需要分开来表示调用函数和返回函数结果

- 如果调用的函数返回非void, 还需要

move-result(返回基本数据类型)和move-result-object(返回对象)指令:

- eg:

const-string v0,"Eric"

invoke-static{v0},Lcom/pbi;->t(Ljava/lang/String;)Ljava/lang/String;

move-result-object v2;

- 这里 v2保存的就是调用t方法返回的字符串




原文链接:https://blog.csdn.net/qq_36252044/article/details/86636885


版权声明

1.本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行测试。
2.本站资源仅供学习和交流使用,版权归资源原作者所有,请在下载后24小时之内自觉删除。
3.若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与本站无关。
4.若内容涉及侵权或违法信息,请联系本站管理员进行下架处理,邮箱ganice520@163.com(本站不支持其他投诉反馈渠道,谢谢合作)

本文链接:http://apod.cc/index.php/post/216.html

发表评论

评论列表(0人评论 , 1854人围观)
☹还没有评论,来说两句吧...