smali语法从入门到精通

smali语法从入门到精通

相关资源

视频中提到的apk和源代码资源,到这里下载

Smali是什么

Smali是Android虚拟机的反汇编语言。Android虚拟机的可执行文件并不是普通的class文件,而是再重新整合打包后生成的dex文件。dex文件反编译之后就是Smali代码,所以说,Smali语言是Android虚拟机的反汇编语言。

掌握Smali有哪些好处

  1. 动态调试APK,通常静态分析APK是不够的,如果需要彻底分析APK的执行逻辑,需要通过动态调试来进行。
  2. 修改APK运行逻辑,通过修改Smali代码,再重新编译打包成新的APK,是Android逆向的基本操作。

Smali基本语法

数据类型

Smali(方法类型)

Smali(代码)

Java

备注

V

return-void

void

只能用于返回值类型

Z

const/4 v0,0x1

boolean

布尔值类型,判断逻辑

Ljava/lang/String;

const-string v0,”字符串”

String

字符串类型

I

const/4 v0,0x1

int

整数类型

Lpackage/name;

Lpackage/name;

对象类型

L表示这是一个对象类型,package表示该对象所在的包,; 表示对象名称的结束

S

const/16 v0, 0x64

short

短整数类型

J

const-wide/32 v0, 0x186a0

long

长整数类型

F

const/high16 v0, 0x42c80000   

float

浮点数类型

D

const-wide/high16 v0, 0x4059000000000000L

double

双浮点数类型

C

const/16 v0, 0x61

char

字符类型

B

const/4 v0, 0x1

byte

字节类型

[类型

[类型

数组

[l表示一个int型数据,[Ljava/lang/String 表示一个String的对象数组

语法关键词

关键词

说明

.class

定义java类名

.super

定义父类名

.source

定义Java源文件名

.filed

定义字段

.method

定义方法开始

.end method

定义方法结束

.annotation

定义注解开始

.end annotation

定义注解结束

.implements

定义接口指令

.local

指定了方法内局部变量的个数

.registers

指定方法内使用寄存器的总数

.prologue

表示方法中代码的开始处

.line

表示java源文件中指定行

.paramter

指定了方法的参数

.param

和.paramter含义一致但是表达格式不同

寄存器

Java中变量都是存放在内存中的,Android为了提高性能,变量都是存放在寄存器中的,寄存器为32位,可以支持任何类型。

寄存器分为如下两类:
1、本地寄存器
用v开头数字结尾的符号来表示,v0, v1, v2,...
2、参数寄存器
用p开头数字结尾的符号来表示,p0,p1,p2,...
注意:
在非static方法中,p0代指this,p1为方法的第一个参数。
在static方法中,p0为方法的第一个参数。

Smali代码示例

const/4 v0, 0x1 //把值0x1存到v0本地寄存器

iput-boolean v0,p0,Lcom/aaa;->IsRegisterd:Z //把v0中的值赋给com.aaa.IsRegistered,p0代表this,相当于this.Isregistered=true

成员变量

成员变量定义格式为:
.field public/private [static][final] varName:<类型>

获取指令
iget, sget, iget-boolean, sget-boolean, iget-object, sget-object

操作指令
iput, sput, iput-boolean, sput-boolean, iput-object, sput-object
array的操作是aget和aput

指令解析
sget-object v0,Lcom/aaa;->ID:Ljava/lang/String;
获取ID这个String类型的成员变量并放到v0这个寄存器中
iget-object v0,p0,Lcom/aaa;->view:Lcom/aaa/view;
iget-object比sget-object多一个参数p0,这个参数代表变量所在类的实例。这里p0就是this

Smali代码示例1:

const/4 v3, 0x0

sput-object v3, Lcom/aaa;->timer:Lcom/aaa/timer;

相当于java代码:this.timer = null;

Smali代码示例2:

.local v0, args:Landroid/os/Message;

const/4 v1, 0x12

iput v1,v0,Landroid/os/Message;->what:I

相当于java代码:args.what = 18;
其中args为Message的实例

函数

函数定义格式为:
.method public/private [static][final] methodName()<类型>
.end method

Smali代码示例

.method private ifRegistered()Z

    .locals 2            // 本地寄存器的个数

    .prologue

    const/4 v0, 0x1      //v0赋值为1

    if-eqz v0, :cond_0   //判断v0是否等于0,等于0则跳到cond_0执行

    const/4 v1, 0x1      //符合条件分支

    :goto_0              //标签

    return v1            //返回v1的值

    :cond_0              //标签

    const/4 v1, 0x0      //cond_0分支

    goto :goto_0         //跳到goto_0执行

.end method

函数分为两类:direct method和virtual method
direct method就是private方法,virtual method就是指其余的方法。

调用指令:
invoke-direct
invoke-virtual
invoke-static
invoke-super
invoke-interface

调用格式:
invoke-指令类型 {参数1, 参数2,...}, L类名;->方法名
如果不是是静态方法,参数1代表调用该方法的实例。

Smali代码示例:

const-string v0, "NDKLIB"

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

相当于java代码:System.loadLibrary("NDKLIB")

函数返回结果
Smali需要用指令move-result或move-result-object来保存函数返回的结果

Smali代码示例:

const-string v0, "Eric"

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

move-result-object v2

表示将方法t返回的String对象保存到v2中。

方法的定义

private static int sum(int a, int b) {

        return a+b;

}

使用编译后是这样

.method private static sum(II)I

    .locals 4   表示需要申请4个本地寄存器

    .parameter

    .parameter 这里表示有两个参数

    .prologue

    .line 27

    move v0, p0

    .local v0, a:I

    move v1, p1

    .local v1, b:I

    move v2, v0

    move v3, v1

    add-int/2addr v2, v3

    move v0, v2

    .end local v0           a:I

    return v0

.end method

从上面可以看到函数声明使用.method开始 .end method结束,java中的关键词private,static 等都可以使用,同时使用签名来表示唯一的方法,这里是sum(II)I。

指令执行

smali字节码是类似于汇编的,如果你有汇编基础,理解起来是非常容易的。
比如:
move v0, v3 把v3寄存器的值移动到寄存器v0上.
const v0, 0x1 把值0x1赋值到寄存器v0上。
invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I 执行方法sum(),v4,v5的值分别作为sum的参数

条件跳转分支

"if-eq vA, vB, :cond_x" --- 如果vA等于vB则跳转到:cond_x

"if-ne vA, vB, :cond_x" --- 如果vA不等于vB则跳转到:cond_x

"if-lt vA, vB, :cond_x" --- 如果vA小于vB则跳转到:cond_x

"if-ge vA, vB, :cond_x" --- 如果vA大于等于vB则跳转到:cond_x

"if-gt vA, vB, :cond_x" --- 如果vA大于vB则跳转到:cond_x

"if-le vA, vB, :cond_x" --- 如果vA小于等于vB则跳转到:cond_x

"if-eqz vA, :cond_x" --- 如果vA等于0则跳转到:cond_x

"if-nez vA, :cond_x" --- 如果vA不等于0则跳转到:cond_x

"if-ltz vA, :cond_x" --- 如果vA小于0则跳转到:cond_x

"if-gez vA, :cond_x" --- 如果vA大于等于0则跳转到:cond_x

"if-gtz vA, :cond_x" --- 如果vA大于0则跳转到:cond_x

"if-lez vA, :cond_x" --- 如果vA小于等于0则跳转到:cond_x

常用修改技巧

const-string v0,”json数据”     //写死抓包返回的vip信息的数据

goto :cond_x       //无视后面的任何判断,直接跳转到校验成功后的代码段

return-void       //如果方法是返回的void,直接在某个代码的后面加上,终止后面的代码的执行

const/4 v0,0x1    //对于判断,写死true 0x1或者false 0x0

#               //某行代码前添加#,代表该行代码被注释掉,和删掉这行代码一样,但方便恢复

if-eq/…          //直接修改判断条件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/33261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速的让自己从月入2000变成月入两万?

从月入2000变成月入两万 前言我们可以这么做&#xff1a;1.提升自己的技能&#xff1a;2.寻找更好的工作机会&#xff1a;寻找更好的工作机会是一个重要的目标&#xff0c;以下是几个建议&#xff1a; 3.开展副业或兼职工作&#xff1a;4.创业或投资&#xff1a;5.构建个人品牌…

题目大解析(3)

题目 字符串中的第一个唯一字符 字符串中的第一个唯一字符 原题链接&#xff1a;字符串中的第一个唯一字符 计数法&#xff1a; class Solution { public:int firstUniqChar(string s) {int arr[130] {0};for(auto x : s){arr[x-0];}int i 0;for(auto x : s){if(arr[x-0] …

微服务与Nacos概述-4

限流规则配置 每次服务重启后 之前配置的限流规则就会被清空因为是内存态的规则对象&#xff0c;所以就要用到Sentinel一个特性ReadableDataSource 获取文件、数据库或者配置中心是限流规则 依赖&#xff1a;spring-cloud-alibaba-sentinel-datasource 通过文件读取限流规则…

centos修改DNS方法

如何修复dns服务器&#xff1f;dns服务器由解析器和域名服务器组成&#xff0c;主要存储网络中所有主机的域名和相应的ip地址。关于dns服务器有很多问题&#xff0c;我们将在这里给出一个具体的答案。 1、什么是dns&#xff1f; dns是指&#xff1a;域名服务器&#xff08;域…

docker 导入镜像 REPOSITORY和tag都是null怎么解决

当使用 docker import 命令导入镜像时&#xff0c;REPOSITORY 和 TAG 字段可能会为 null&#xff0c;因为 docker import 命令不会保留镜像的元数据&#xff0c;例如镜像名称和标签。这是因为 docker import 命令主要用于将本地文件系统中的文件或目录导入为 Docker 镜像&#…

Android高通8.1 Selinux问题

1、最近客户提了一个需求&#xff0c;说要在user版本上面切分辨率&#xff0c;默认屏幕分辨率是2.5 k 执行adb shell指令之后变成 4k 然后adb shell wm size可以查看 2、一开始我能想到就是在文件节点添加权限&#xff0c;这里不管是mtk还是qcom&#xff08;高通平台&#xff…

将.doc文档的默认打开方式从WPS修改为word office打开方式的具体方法(以win 10 操作系统为例)

将.doc文档的默认打开方式从WPS修改为word office打开方式的具体方法&#xff08;以win 10 操作系统为例&#xff09; 随着近几年WPS软件的不断完善和丰富&#xff0c;在某些方面取得了具有特色的优势。在平时编辑.doc文档时候也常常用到wps软件&#xff0c;不过WPS文献也存在…

WordPress中手动返回404的优雅方式

这篇文章也可以在我的博客中查看 关于本文 WordPress虽然有比较完善的404处理机制&#xff0c;但有时候我们需要手动返回404&#xff0c;这篇文章就来探讨一下这个问题。 何时返回404 根据mdn&#xff0c;404用作示意客户端找不到相应的资源&#xff0c;这可能是&#xff1…

记录第一篇被”华为开发者联盟鸿蒙专区 “收录的文章

记录第一篇被”华为开发者联盟鸿蒙专区 “社区收录的文章。 坚持写作的动力是什么&#xff1f; 是记录、分享&#xff0c;以及更好的思考 。

培训报名小程序报名确认开发

目录 1 创建页面2 创建URL参数3 信息展示4 消息订阅5 页面传参6 程序预览总结 我们上一篇介绍了报名功能的开发&#xff0c;在用户报名成功后需要展示报名的确认信息&#xff0c;如果信息无误提示用户支付&#xff0c;在支付之前需要让用户进行授权&#xff0c;允许小程序给用户…

从零开始搭建个人博客网站(hexo框架)

1.工具及环境搭建 1&#xff09;注册GitHub并且新建一个repositories 2&#xff09;下载node.js以及Git 下载链接&#xff1a; 检验安装是否成功&#xff1a; 【注】&#xff1a;MacOS自带Git&#xff0c;可以直接在终端输入git --version进行检验 3&#xff09;新建一个…

Springboot04--vue前端部分+element-ui

注意点&#xff1a; 这边v-model和value的区别&#xff1a;v-model是双向绑定的&#xff0c;value是单向绑定 li的key的问题 vue的组件化开发&#xff1a; 1. NPM&#xff08;类似maven&#xff0c;是管理前段代码的工具&#xff09; 安装完之后可以在cmd里面使用以下指令 2.…

ffmpeg工具实用命令

说明&#xff1a;ffmpeg是一款非常好用的媒体操作工具&#xff0c;包含了许多对于视频、音频的操作&#xff0c;有些视频播放器&#xff0c;实际上就是套了一个ffmpeg的壳子。本文介绍ffmpeg的使用以及一些较为实用的命令。 安装 ffmpeg是命令行操作的&#xff0c;不需要安装…

Vue+SpringBoot后台管理系统:Vue3+TypeScript项目搭建(一)

写在开始:一个搬砖程序员的随缘记录文章目录 一、Node安装二、Vue CLI安装三、相关的版本四、创建Vue3TypeScript项目五、Vue项目初始化六、项目启动 一、Node安装 查看Note版本 node -v查看npm版本 npm -v然后将npm升级至最新版本 npm -g install npm将npm下载源换至http:…

Electron 应用实现截图并编辑功能

Electron 应用实现截图并编辑功能 Electron 应用如何实现截屏功能&#xff0c;有两种思路&#xff0c;作为一个框架是否可以通过框架实现截屏&#xff0c;另一种就是 javaScript 结合 html 中画布功能实现截屏。 在初步思考之后&#xff0c;本文优先探索使用 Electron 实现截屏…

一文读懂Python生成器和迭代器

在python中&#xff0c;我们经常会遇到需要对一系列的元素进行遍历或处理的情况&#xff0c;例如对列表中的每个元素进行求和或排序&#xff0c;或者对文件中的每一行进行读取或写入。为了实现这样的功能&#xff0c;我们通常会使用for循环或while循环来逐个获取元素&#xff0…

森海塞尔为 CUPRA 首款纯电轿跑 SUV – CUPRA Tavascan 注入音频魅力

森海塞尔为 CUPRA 首款纯电轿跑 SUV – CUPRA Tavascan 注入音频魅力 音频专家森海塞尔携手富有挑战精神的 CUPRA&#xff0c;雕琢时代新贵车型&#xff0c;打造畅快尽兴的驾驶体验 全球知名音频专家森海塞尔与以颠覆传统、充满激情、不甘现状而闻名的汽车品牌 CUPRA 展开合作…

掌握Python的X篇_28_python包管理工具pip命令

本篇将会介绍在实际使用python中最能节省效率的内容&#xff0c;利用第三方库拿来就用。 文章目录 1. pip命令是什么2. pip相关操作2.1 list2.2 install2.3 uninstall2.4 导出和导入2.4.1 freeze命令2.4.2 “-r” 3. 国内镜像4. Python Packges Index网站 1. pip命令是什么 p…

SpringBoot复习:(33)WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter

WebMvcAutoconfiguration内部静态类WebMvcAutoConfigurationAdapter实现了WebMvcConfigurer接口&#xff0c;重写了一些方法&#xff0c;也就是默认对Spring Mvc进行了一些配置: 该静态类上有个**Import**注解&#xff1a; Import(EnableWebMvcConfiguration.class) 它的父类…

【uniapp】滚动相关

1、滚动到一定区域&#xff0c;顶部内容置换并置顶 功能&#xff1a; 当我向下滚动时&#xff0c;当关注那一行快到顶部的时候&#xff0c;把左侧区域的内容切换成右侧区域的内容&#xff0c;并置顶 原先我使用v-if来显示隐藏&#xff0c;发现会出现闪屏的现象&#xff0c;后来…