smali语法基础详解

news/2024/7/19 10:40:39 标签: android, smali, 爬虫

一、介绍

apk文件通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件。
smali语言是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行。

二、类型

Java中的基本数据类型与Dalvik字节码类型的对应关系

DalvikJava
Bbyte
Cchar
Ddouble
Ffloat
Iint
Sshort
Vvoid
Jlong
Zboolean

*注意J、Z两个不是对应类型的首字母;在dalvik字节码中,寄存器都是32位的,能够支持任何类型,Long和Double类型是64位的,需要2个寄存器;V 只能用于返回值类型;

三、描述类的信息

在打开smali文件的时候,它的头三行描述了当前类的一些信息
.class < 访问权限> [ 修饰关键字] < 类名>
.super < 父类名>
.source <源文件名>
.class指令表示当前的类名,类的访问权限是public,类名为LHelloWorld,类开头的L表示后面跟随的字符串是一个类。
.super指定了当前类所继承的父类,后面指的就是这个父类的类名,L表示后面跟的字符串是一个类.
例:

.class public Lcom/tt/android/xigua/detail/c/a$1;
.super Ljava/lang/Object;
.source "SourceFile"

四、静态字段

#static fields
.field < 访问权限> static [ 修饰关键字]< 字段名>:< 字段类型>
baksmali在生成smali文件时,会在静态字段声明的起始处添加注释”static fields”,注释是以#开头。
访问权限包括:private、protected、public修饰关键字为字段其他属性。
例:

# static fields
.field public static a:Lcom/meituan/robust/ChangeQuickRedirect;

五、实例字段

#instance fields
.field < 访问权限> [ 修饰关键字] < 字段名>:< 字段类型>
例:

# instance fields
.field final synthetic b:Lcom/tt/android/xigua/detail/c/a;

六、直接方法

直接方法指的是该类中定义的方法。
#direct methods
.method <访问权限> [ 修饰关键字] < 方法原型>、
<.registers>、<.locals> [.param][.prologue][.line]<代码体>
.end method
例:

.method public f()Ljava/lang/String;
    .locals 4

    .prologue
    .line 196608
    const/4 v0, 0x0
					……………………
    .line 196609
.end method

#direct methods 是注释,是baksmali添加的,访问权限和修饰关键字 跟字段是一样的。方法原型 描述了
方法的名称、参数与返回值。
.registers 指令指定了方法中寄存器的总数,这个数量是参数和本地变量总和。
.param 表明了方法的参数,每个.param指令表示一个参数,方法使用了几个参数就有几个.parameter指令。
.prologue 指定了代码的开始处,混淆过的代码可能去掉了该指令。
.line 指明了该处代码在源代码中的行号,同样,混淆后的代码可能去掉了行号。
.local 使用这个指定表明方法中非参寄存器

七、虚方法

虚方法指的是从父类中继承的方法或者实现的接口的方法,它的声明跟直接方法相同,
只是起始的初始为“virtual methods”。
#virtual methods
.method <访问权限> [ 修饰关键字] < 方法原型>
<.registers><.locals> [.param] [.prologue] [.line] <代码体>
.end method

八、接口

如果一个类实现了一个接口,那么会在smali文件中用.implements指令指出。
#interfaces
.implements < 接口名>
#interfaces是注释,
.implements 是接口关键字,后面的接口名是 DexClassDef 结构中 interfacesOff 字段指定的内容

# interfaces
.implements Lcom/tt/floatwindow/video/a/d;
console.log("公众号:虫术")
Blog:http://404nofoundx.top/

http://www.niftyadmin.cn/n/997367.html

相关文章

如何为Kafka集群选择合适的Partitions数量

如何为Kafka集群选择合适的Partitions数量Hadoop技术博文这是许多kafka使用者经常会问到的一个问题。本文的目的是介绍与本问题相关的一些重要决策因素&#xff0c;并提供一些简单的计算公式。文章目录1 越多的分区可以提供更高的吞吐量2 越多的分区需要打开更多地文件句柄3 更…

《开源安全运维平台--OSSIM最佳实践》节日期间当当自营店 五折 优惠活动开始啦!...

《开源安全运维平台--OSSIM最佳实践》节日期间&#xff0c;当当自营店 五折 优惠活动开始啦&#xff01;截止日期2017-02-07地址&#xff1a; http://product.dangdang.com/23903741.html

Tampermonkey油猴脚本安装及入门

一、简介 油猴脚本是是一款免费的浏览器扩展和最为流行的用户脚本管理器&#xff0c;它适用于 Chrome, Microsoft Edge, Safari, Opera Next, 和 Firefox&#xff0c;通过它可以让浏览器实现各种各样的扩展功能&#xff0c;和浏览器扩展的作用类似。比如获去链接重定向、微博页…

237. Delete Node in a Linked List

问题描述 解决方案 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:void deleteNode(ListNode* node) {if(nodeNULL) return;node->valnode…

使用Spring ThreadPoolTaskExecutor实现多线程任务

我们为何使用多线程&#xff0c;之前已经有讲过了&#xff0c;为了更快的处理多个任务&#xff0c;分割任务&#xff0c;或者调用多个毫无关联的第三方服务 其实spring就提供了ThreadPoolTaskExecutor这个类来实现线程池&#xff0c;线程池是啥&#xff0c;可以理解为数据源&am…

UVA11039 Building designing【排序】

问题链接&#xff1a;UVA11039 Building designing。基础级练习题&#xff0c;用C语言编写程序。 问题简述&#xff1a;输入n个绝对值各不相等的非0整数&#xff0c;选择尽量多的数&#xff0c;排成一个序列&#xff0c;使得正负交替并且绝对值递增。输出其最大长度。 问题分析…

Samba配置详解

一、简介一、简介&#xff1a;Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件&#xff0c;而SMB是Server Message Block的缩写&#xff0c;即为服务器消息块 &#xff0c;SMB主要是作为Microsoft的网络通讯协议&#xff0c;后来Samba将SMB通信协议应用到了Linux系统…

安卓逆向 | 某新闻类APP urlSign

*本文章仅供学习交流,切勿用于非法通途,如有侵犯贵司请及时联系删除 一、目标参数 urlSign 二、JAVA层分析 搜索出两个关键点,挨个看下。 第二个看起来比第一个像很多,有rand,signVer,urlSign参数,和抓包的参数可以对应上。 跟进去com.sina.sinahttpsignlibrary.a.a(p…