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

Smail语法

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

测试 2万+

引入 CloudWeGo 后飞书管理后台平台化改造的演进史

飞书管理后台是飞书套件专为企业管理员提供的信息管理平台,它通过引入 Kitex 泛化调用对飞书管理后台进行平台化改造,成为了企业统一数字化管理平台。本文将从三个方面为大家讲解 Kitex 泛化调用在飞书管理后台平台化改造过程中的落地实践。...

weixin_44186218的博客 1762

Smail语法基本知识(三)

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

computer165的专栏 1312

从原理到实现:在《图灵完备》中构建一个144*256像素、1536时钟刻/帧的视频播放器

本文详细解析了在《图灵完备》游戏中构建144*256像素、1536时钟刻/帧视频播放器的全过程。从图灵完备原理出发,通过分层架构设计、视频数据预处理和关键电路实现,展示了如何用基础电子元件模拟现代显卡功能。重点介绍了像素坐标定位系统和颜色数据处理流水线的优化方案,为游戏内复杂电子系统设计提供实践指导。

weixin_42520025的博客 445

Axure RP9 利用中继器实现列表数据的切换,分页器数据的动态交互加载

Axure RP9 利用中继器制作分页组件 在原型制作中,如何实现分页数据的动态加载、分页与数据的交互,每页显示条数的设定。下面通过制作五年级一班成绩单分页列表,分享给大家,适合有一定axure使用基础的人员,如有更好的方案,请多多指教。 最终效果图: 步骤1:首先利用中继器画出成绩单列表,并绑定成绩单数据。 步骤2:画出每页显示条数控制下拉框,利用中继器画出分页组件 步骤3:新增全局标量maxpage(显示的最多页码),minpage(显示的最小页码),i(循环计数),j(最循环数),selectpa

shandongmike的博客 6819

Smail语法(1)

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

zhanqq2012的专栏 607

gesp c++ 八级知识点

gesp c++ 八级知识点

MMD.然大大 2234

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

一、 smail语法基础学习

M_iranda的专栏 1470

vue3 - 最新详细实现高德地图绘制动态热力图详细教程,在某区域或城市地图上做“热力图层“展示人流量、旅游人口密度、热量图、全国地区地理热力图,利用颜色的深浅表示密度或强度等场景(详细示例代码教程)

vue3,nuxt3,高德地图,热力图,绘制热力图层,人流量,vue3使用高德地图实现某个区域热力图,vue3高德地图api加载热力图及关闭,接收热力图数据并渲染热力图,关掉热力图,Vue使用高德API制作热力图,热力图加载不出来,电子围栏围住热力图,vue3中使用高德地图渲染热力图组件,高德地图使用热力图详细教程,报错,卡顿,出不来怎么办,无法关闭,怎么解决这个问题,出错,城市名称,城市某个街道,城区,省份,市区,县城,乡镇,村,各省份的热力图,交通流量,人口流量,密度,旅游出行,人口数量,颜色介绍,深浅

✅ 精选推荐文章 5204

Linux | Ubuntu18.04安装WIFI6 AX201驱动完整教程

本节介绍了如何在Ubuntu18下安装AX201驱动的教程。

九七的博客 8880

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

30天入门 SAP BTP 开发系列之二:了解 SAP BTP Region 的概念,包含账号申请的详细步骤

SAP BTP 的 Region,实际是一组按地理位置划分的、由 SAP 或合作 Hyperscaler 承载的基础设施栈。这些基础设施栈至少包含多可用区网络、对象存储、计算节点及自动化运维等服务。

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

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

smail的语法

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

hongyucai的博客 546

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Smail语法基本知识(二)

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

computer165的专栏 1327

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值