Smail语法基本知识(一)

Smali语言基础语法 定义、声明、调用 Smali数据类型 定义:与Java相同,Smali中也有一套数据类型体系,且该体系实质上是同Java一一对照的。 示例1:Smali——Java数据类型对照表 PS:如上图所示,Smali语言中的数据类型的关键词基本上为Java中同名数据类型的首字母大写,需要着重记忆的例外为:1.long类型的关键词为大写J;2.boolean类型的关键词为大写Z;3.数组的关键词为左半边中括号[;4.object类型(各种类)的关键词为大写L加上该类的全类名路径,路径中的层级用/分割。 阅读详情

Smali 背景:

 Smali,是指安卓系统里的 Java 虚拟机(Dalvik)所使用的一种.dex 格式文件的汇编器。

 Baksmali 则是反汇编器。

 其语法是一种宽松式的 Jasmin/dedexer语法,而且它实现了.dex 格式所有功能(注解,调试信息,线路信息等)。

 Smali,Baksmali 分别是冰岛语中编译器,反编译器的叫法。


Smali 语法简单介绍如下:

类型

Davlik 字节码中,寄存器都是 32 位的,

所以64 位类型(Long/Double)需要用 2 个寄存器表示。

Dalvik 字节码有两种类型:原始类型和引用类型(包括对象和数组)

原始类型

V     void            只能用于返回值类型

Z     boolean

B    byte

S    short

C    char

I      int

J     long(64 位)

F     float

D    double(64 位)

说明:只有boolean和long不同,因为他们和byte,int的首字符一样,所以换了一个字符表示。

对象类型

使用L来表示对象。

Lpackage/name/ObjectName; 

相当于 java 中的package.name.ObjectName;

其中:

L                             表示这是一个对象类型

package/name       该对象所在的包

ObjectName           对象名

;                             表示对象名称的结束


数组表示

使用[ 来表示数组。

[I :表示一个整形的一维数组,相当于 java 的 int[];

对于多维数组,只要增加[ 就行了,[[I = int[][];

注:每一维最多 255 个;

例如:

[Ljava/lang/String 表示一个 String 的对象数组;

也就是Java代码中的字符串数组:  java.lang.String[]


方法表示

Lpackage/name/ObjectName;->methodName(III)Z 


Lpackage/name/ObjectName   表示是哪个类

methodName                            表示方法名

III                                              表示参数(这里表示为 3 个整型参数,因为整形是I)

Z                                               返回值,这里是boolean

说明:方法的参数是一个接一个的,中间没有隔开。


成员变量表示

Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;

即表示: 包名(package.name),成员变量名(ObjectName)和各成员变量类型(java.lang.String)

有两种方式指定一个方法中有多少寄存器是可用的

.registers 指令指定了方法中寄存器的总数

.locals 指令表明了方法中非参寄存器的总数,出现在方法中的第一行

例如:

.method private static a(Ljava/io/File;)V
    .locals 3 //表明有3个非参数寄存器 v0,v1,v2


方法的传参

当一个方法被调用的时候,方法的参数被置于最后 N 个寄存器中;
例如,一个方法有 2 个参数,5 个寄存器(v0~v4)
那么,参数将置于最后 2 个寄存器(v3 和 v4)
非静态方法中的第一个参数总是调用该方法的对象;

说明:对于静态方法除了没有隐含的 this 参数外,其他都一样。

可以这样理解 reg = local + para(详细解析见下段)


寄存器的命名方式

有两种方式——V命名方式和P命名方式。

P命名方式中的第一个寄存器就是方法中的第一个参数寄存器。

在下表中我们用这两种命名方式来表示上一个例子中有5个寄存器和3个参数的方法。
  v0 第一个local register
  v1 第二个local register
  v2 p0 第一个parameter register
  v3 p1 第二个parameter register
  v4 p2 第三个parameter register
  你可以用任何一种方式来引用参数寄存器——他们没有任何差别。

使用 P 命名是为了防止以后如果在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点


特别说明一下:Long 和 Double 类型是 64 位的,需要 2 个寄存器

例如:对于非静态方法
LMyObject——>myMethod(IJZ)V;
有 4 个参数:LMyObject,int,long,bool; 需要 5 个寄存器来存储参数;
P0 this
P1 I (int)
P2,P3 J (long)
P4 Z(bool)

标记

  # static fields             定义静态变量的标记

  # instance fields        定义实例变量的标记

  # direct methods       定义静态方法的标记

  # virtual methods      定义非静态方法的标记

参考资料如下:

概要:http://wenku.baidu.com/view/2ac1725e8e9951e79b8927df.html

寄存器P,V命名方式:http://blog.sina.com.cn/s/blog_65380c300101dn8f.html

smali 语法:http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
smali语法从入门到精通 Smali是Android虚拟机的反汇编语言。Android虚拟机的可执行文件并不是普通的class文件,而是再重新整合打包后生成的dex文件。dex文件反编译之后就是Smali代码,所以说,Smali语言是Android虚拟机的反汇编语言。本教程让你1小时了解Smali的基础知识,让你很快从入门到精通。 阅读详情

相关推荐

Android逆向工程:Smali语法解析完整指南

Smali语法指南摘要 本文详细介绍了Android反编译后的Smali中间表示语法,主要内容包括: Smali基础:dex文件与smali文件的相互转换关系 数据类型系统:包含8种基本数据类型和对象类型的表示方法 字节码语法:字段和方法定义的标准格式 寄存器机制:本地寄存器(v0-vN)和参数寄存器(p0-pN)的使用规则 方法结构:包括访问修饰符定义和特殊方法(构造方法、静态初始化块) 字段结构:声明语法和访问控制修饰符 指令系统:重点介绍了常量指令(整数和字符串)的操作方法 文中配有大量示例代码

无方少年游 2190

Smali入门手册

Smali语法学习摘要欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用M...

cmdkeeper 9544

android 逆向工程 smail 语法学习

众所周知,android 是开源的,现在市场上反编译别人的劳动果实的人也不少,所以我们也是有必要学习下smail语言,(就是android工程反编译后出的语法语音),看看改怎么给我们的代码 “埋雷” ,才能更好的保护好我们自己的劳动成果。 接下来就让我们来学习下吧~!(事先声明:本人也是初学smail语言,有介绍不当的地方还请海涵,并请指出,大家一起学习) ==================

LX. 的专栏 3535

吾爱破解安卓逆向入门教程

一、环境配置安装 java jdk,并设置好环境变量。测试: java -version二、初识 APK、Dalvik字节码以及Smali1. apk是什么?apk实质上是一个zip压缩包,将apk后缀修改为zip,解压之后可以看到其内部结构:2. apk 的组成assets: 资源目录1,assets 和 res 都是资源目录但有所区别: res 目录下的资源文件在编译时会自动生成索引文件(R

龙哥盟 9万+

3、Smail语法

apk文件通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件。smali语言是Davlik的寄存器语言,语法上和汇编语言相似,Dalvik VM[1]与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器的意思是,在smali里的所有操作都必须经过寄存器来进行。Smali,Baksmali 分别是指安卓系统里的 Java 虚拟机(Dalvik)所使用的一种 dex 格式文件的汇编器,反汇编器。

weixin_42407151的博客 1789

一篇文章将三极管讲透:三极管从原理到应用,从参数到特性,从入门到精通

晶体三极管(Transistor)是一种半导体电子器件,也是电子工程中最基本的元件之一。它有三个区域,分别是P型半导体,N型半导体和P型半导体,从而形成PNP型晶体三极管或者NPN型晶体三极管。

学习帮的博客 9万+

Smail语法

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

测试 2万+

Flutter加载本地HTML的优雅解决方案:轻松实现富文本展示

通过以上步骤,我们实现了Flutter加载本地HTML的完整流程,并简单介绍了如何通过WebView与HTML页面进行交互。HTML文件作为一种灵活、易维护的富文本展示方式,能有效提升Flutter应用的内容呈现能力。这种方法在展示新闻、资讯或帮助文档等内容时非常有用,能够让开发者灵活调整内容的样式和排版。希望这篇文章能对你在Flutter开发中的HTML加载有所帮助!

四楼没电梯的专栏 3641

Smail语法基本知识(三)

------------------------------------------------分割线------------------------------------------------------------------------------------- 虽然关于指令集现在还没有讲,但是可以先看一个例子,加深一下理解。 HelloWorldAppActivity.smail

computer165的专栏 1312

瑞萨RH850/U2A8以太网模块mcal说明

如下所有功能的支持需要在达芬奇中开启EthGlobalTimeSupport。秒[32bit], 纳秒[32bit], 纳秒小数[20bit]每一帧发送数据的相关结构缓冲区都放在变量。每一帧接收数据的相关结构缓冲区都放在变量。

至道无难,唯嫌拣择。 1860

计算机组成原理(第三版)唐朔飞-第三章系统总线-课后习题

计算机组成原理(第三版)唐朔飞-第三章系统总线-课后习题

weixin_45735391的博客 6万+

Smail语法(1)

【情景分析】Android apk,反编译之后,我们能阅读到的代码是dalvik字节码 - smali 。有时候,工作需要,必须破解apk里面的一些协议或者方法。以此,借鉴经验,来开发自己的项目。 【官方语法链接】http://www.blogjava.net/midea0978/archive/2012/01/04/367847.html 【语法】 一. 数据类型 1 ...

zhanqq2012的专栏 607

SAP Single Sign-On 全景指南:从传统 SAP SSO 到 SAP Secure Login Service for SAP GUI 的架构、场景与迁移实践

本文系统梳理了SAP生态下的单点登录技术方案,重点分析了SAP GUI的云化替代方案SAP Secure Login Service(SLS)。内容涵盖SNC、Kerberos/SPNEGO、SAML 2.0等核心协议的技术实现,对比了传统SAP SSO与新型SLS for SAP GUI的架构差异,并给出AS ABAP系统的具体实施路径。针对SAP GUI访问、浏览器访问Fiori/移动端等不同场景,提供了详细的协议选型建议和配置指南,帮助团队构建安全可靠且适应云时代的统一认证体系。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 273

Android逆向学习日记(一) 初学smail

一、 smail语法基础学习

M_iranda的专栏 1470

生成EtherCAT从站XML图片信息方法

详细介绍了EtherCAT从站XML文件中图片元素的生成方法。

kevin1499的博客 2128

手把手教你使用YOLOv11完成人脸分类识别,YOLOv11人脸识别,解决中文乱码问题,全网最详细教程

手把手教你使用YOLOv11完成人脸分类识别,YOLOv11人脸识别,解决中文乱码问题,全网最详细教程

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4443

Smail语法(2)指令解析

【重点】归总了一些简单的Smail指令。 1.If语句 if-nez v0,:cond_0 如果结果不为0,就跳转到cond_0标号处 if-eqz v0,:cond_1 如果结果为0,就跳转到cond_1标号处 2.数据操作指令 move v0,v1 将v1的值赋给v0 ,两个寄存器都为4位 move-result...

zhanqq2012的专栏 7442

AI实时盯盘与素材更新迭代功能开发——千川素材投流系统完全指南

《AI驱动的千川素材投流系统完全指南》摘要 本文针对抖音电商生态中巨量千川平台的素材投放挑战,提出了一套AI驱动的实时盯盘与素材更新迭代解决方案。系统通过分层架构设计,整合数据采集、实时监控、AI分析和自动化执行模块,实现分钟级数据追踪与智能决策。核心功能包括实时数据采集、异常检测、自动化投放调整和素材生命周期管理,有效解决人工盯盘效率低、素材生命周期短、决策响应慢等痛点。系统采用Python+FastAPI技术栈,结合机器学习和自动化工具,提供从数据采集到决策执行的全链路解决方案,帮助商家提升投放效率和R

huanghm88的专栏 229

smail及其语法

在smali里的所有操作都必须经过寄存器来进行:本地寄存器用v开头数字结尾的符号来表示,如v0、 v1、v2。参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2。特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0代指“this",p1表示函数的第一个 参数,p2代表函数中的第二个参数。而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法)这里要补充两个smali指令 一个是if-eqz 另一个是if-nez 这两条指令是相对的。

SXXYNHHXX的博客 3934

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

smail的语法

.locals 3 //表示有局部变量的个数

hongyucai的博客 546

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Smail语法基本知识(二)

这篇文章介绍了一些常见的指令语法, 想要知道更全的指令语法,请见:http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html 移动 move vx,vy                      将vy的内容移动到vx中。 两个寄存器必须是最前面256个寄存器中之一。 move-object vx,vy          移动对

computer165的专栏 1327

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 逆向project smail 语法学习

众所周知,android 是开源的。如今市场上反编译别人的劳动果实的人也不少。所以我们也是有必要学习下smail语言,(就是androidproject反编译后出的语法语音),看看改怎么给我们的代码 “埋雷” 。才干更好的保护好我们自己的劳动成果。 接下来就让我们来学习下吧~!(事先声明:本人也是初学smail语言,有介绍不当的地方还请海涵,并请指出。大家一起...

aofan9566的博客 288

smail语法 详解

大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版本): Where's My Water.zip\ asset\                        lib\                            

肿菜的博客 1027

dex2jar源码解析----smail转dex

SmaliCmd用来将smail文件转换为dex文件smail转dex用到了一个ANTLR 语言识别的一个工具 (ANother Tool for Language Recognition ) 来识别 smail语法,它定义了一个smail的文法文件这里的Smail.g4就是定义的文法文件,使用的是g4版本,另外几个java文件是根据文法文件自动生成的这是文法文件的一部分关于ANTLR我也不是特别

new_abc的专栏 3474
上一篇: Shallow and retained sizes
下一篇: Smail语法基本知识(二)
computer165
博客等级 码龄16年 7粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值