前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >smali 介绍

smali 介绍

作者头像
一只小虾米
发布2022-10-25 16:49:25
4480
发布2022-10-25 16:49:25
举报
文章被收录于专栏:Android点滴分享

本篇介绍

smali 可以看成是虚拟机的汇编语言,在逆向时可以看懂smali可以提升不少效率.

Smali 语法

数据类型

Java 和 Smali 的类型对应关系和jni类似,如下所示: 基本数据类型

Smali数据类型

Java数据类型

V

void

Z

boolean

B

byte

S

short

C

char

I

int

J

long

F

float

D

double

对象类型

Smali数据类型

Java数据类型

Lpackage/name/ObjectName;

ObjectName

[I

int[]

Smali 格式

打开smali 文件,头三行格式如下:

代码语言:javascript
复制
.class <访问权限> [关键修饰字] <类名>;
.super <父类名>;
.source <源文件名>

类的成员变量形式是:

代码语言:javascript
复制
.filed <访问权限> [关键修饰字]  <字段名>:<字段类型>

函数的声明格式如下:

代码语言:javascript
复制
.method <访问权限> [关键修饰字]  <方法原型>
<.locals> <.registers> // 函数中非参数的变量的多少
[.param] // 方法参数
[.line]
<代码>
.end method

Smali 指令

Smali 指令有常量操作指令,方法调用指令,移位指令,分支判断指令。 常量操作指令主要是const相关指令,格式如下:

代码语言:javascript
复制
const-<类型> 寄存器, 操作数

const-string v1, "test" // 定义字符串“test”并存到 v1 寄存器中

const/16 v1, 0x1e // 定义了16位的数据常量"0x1e",并存到v1寄存器中

方法调用指令 是以invoke开头的相关指令,格式如下:

代码语言:javascript
复制
invoke-kind {vA,vB,vC},mehtod@DDDD
//  mehtod@DDDD 表 示 函 数 的 引用;vA,vB,vC则表示函数的参数
// 其定义顺序与调用函数的参数一 一对应;kind则代表被调用的类型
// 主要有static、virtual、 super(被调用的函数是静态函数、正常的函数和父类函数等)

invoke-super {p0, p1}, Landroidx/Appcompat/App/AppCompatActivity;->onCreate (Landroid/os/Bundle;)V
// 调用AppCompatActivity的onCreate方法,p0是this,p1是bundle类型参数

移位指令是move相关指令,格式如下:

代码语言:javascript
复制
move v1,p1 // 将 p1 赋值给 v1

分支判断指令是if 相关指令, 格式如下:

代码语言:javascript
复制
if-[test] v1,v2, [condition] // 如果v1, v2 满足test,则跳转到condition 执行

if-ge p1, v0, :cond_0 // 如果 p1 >= v0, 则跳转到 cond_0

目前介绍了下Smali的基础,看起来也是比较好懂的

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本篇介绍
  • Smali 语法
  • 数据类型
    • Smali 格式
      • Smali 指令
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档