s002android逆向安全初级篇之android smali语法总结

总结一下smali 的分析 。

smali代码相当于dalvik虚拟机的汇编语言。

--

  1. 如何得到smali代码参考百度,或我的文章s001android逆向安全初级篇之apk逆向常用工具及简单使用一览 利用这些工具可以得到。
  2. smali 的dalvik 操作码链接dalvik_opcodes

smali 中的数据类型

smali中有两类数据类型:基本类型和引用类型。
引用类型是指数组和对象,其他都是基础类型。

基础类型

使用一个简单的字符表示,在dex文件中实际上以字符串的形式存储。

V  空类型---仅仅可以用来作为返回类型
Z  Boolean 布尔型
B  Byte字节型
S  Short短整型(16位)
C  Char字符型
I  Int 整形
J  long (64 bits)长整型(64位)
F  Float浮点型
D  double (64 bits)双精度型(64位)

引用类型

对象 以Lpackagename/ObjectName;的形式表示

1. 开始的L表明这是一个对象类型
2. packagename  使用"/"代替"."
3. ObjectName是对象的名称,
4. 分号表明对象名的结束.

数组 以[数据类型 的形式表示

如:
[I  表示一维整形数组
[[I 表示二维数组
[Ljava/lang/String    表示String数组

方法

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

  1. Lpackage/name/ObjectName; 是一个类,
  2. MethodName明显是一个方法名,
  3. (III)Z是方法的签名,
  4. ‘III’在这个例子中是三个整形参数,
  5. Z是表示返回一个布尔类型的返回值。

寄存器

在dalvik字节码中,寄存器都是32位的,能够支持任何类型。64位类型(Long和Double型)用2个寄存器表示。
有两种方式指定一个方法中有多少寄存器是可用的。

.registers指令指定了方法中寄存器的总数。
.locals指令表明了方法中非参寄存器的数量。

方法的传参

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

例如,
非静态方法LMyObject;->callMe(II)V有2个整型参数,另外还有一个隐含的LMyObject;参数,所以总共有3个参数。假如在该方法中指定了5个寄存器(v0-v4),以.registers方式指定5个或以.locals方式指定2个(即2个local寄存器+3个参数寄存器)。当该方法被调用的时候,调用该方法的对象(即this引用)存放在v2中,第一个整型参数存放在v3中,第二个整型参数存放在v4中。
对于静态方法除了没有隐含的this参数外其它都一样。
寄存器的命名方式
有两种方式——V命名方式和P命名方式。P命名方式中的第一个寄存器就是方法中的第一个参数寄存器。在下表中我们用这两种命名方式来表示上一个例子中有5个寄存器和3个参数的方法。

v0    第一个local register
v1    第二个local register
v2    p0    第一个parameter register
v3    p1    第二个parameter register
v4    p2    第三个parameter register

你可以用任何一种方式来引用参数寄存器——他们没有任何差别。
注意:baksmali默认对参数寄存器使用P命名方式。如果想使用V命名方式,可以使用-pl—no-parameter-registers选项。
使用P命名方式是为了防止以后如果要在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点。
Long/Double值
Long和double类型是64位的,需要2个寄存器(切记切记)。
例如,对于非静态方法LMyObject;->MyMethod(IJZ)V,参数分别是LMyObject;,int,long,bool。故该方法需要5个寄存器来存储参数。

p0    this
p1    I
p2,p3    J
p4    Z

方法的修饰词

对于方法的修饰

.method static constructor <clinit>()V  表示不带参数的缺醒构造方法。
.registers 指令指定了方法中寄存器的总数  
.locals 指令表明了方法中非参寄存器的总数,出现在方法中的第一行

如果没有内部类的话一个类在一个文件中;
如果有内部类,则内部类单独一个文件文件名格式为:类名$内部类

类的声明

如下:声明了一个类NetProviderApplication 继承自Landroid/app/Application

.class public Lcom/android/netprovider/NetProviderApplication;
.super Landroid/app/Application;

集成接口Ljava/io/FilenameFilter 用如下表达

.implements Ljava/io/FilenameFilter;

未完持续。。。

其他

<clinit>
同样对于类或者接口的静态程序块,在JVM层面也给了他一个特殊的名字<clinit>,无论是类或者接口在被加载到class loader的时候,Java虚拟机都会调用这个类或接口的<clinit>的方法,这个方法是个无参的,返回类型为void方法,这个方法名也是编译器指定的,由于这个方法名并不是一个规范的方法名,所以我们无法在代码中直接使用。

说了这么多,其实读到这里只要记住两点:在字节码层面<init>表示构造方法,<clinit>表示静态程序块。

参考链接

  1. dalvik_opcodes
  2. s001android逆向安全初级篇之apk逆向常用工具及简单使用一览
  3. apk反汇编之smali语法
  4. Android apk的混淆
  5. Dalvik (software)

smali是一个开源并且注释清晰的反编译的java工程
apktool是基于smali开发的帮助反编译apk的利器
dedexer是独立与smali又一个反编译apk的工具
而dexdump就是android自带的c语言实现的dump dex文件的工具

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,444评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,867评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,157评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,312评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,673评论 3 289
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,802评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,010评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,470评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,696评论 2 250
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,187评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,538评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,188评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,127评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,889评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,741评论 2 274

推荐阅读更多精彩内容