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文件的工具

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

C# 4.0 Optional Parameters 和Named Parameters

Optional Parameters 是C# 4.0的特色之一,可减少重载函数的数量,却可达到相同的效果,加快开发效率。在使用上就跟C++一样,只需用等号为函...

22070
来自专栏用户2442861的专栏

json格式

  1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(reco...

34720
来自专栏玄魂工作室

如何学python 第十一课 元组与字典

第十一课 元组与字典 欢迎回来。上一期的如何学python里,我们讨论了函数。我们今天将要学习的是两种类似于列表(list)类型的数据类型。我们先介绍’元组’...

32140
来自专栏C/C++基础

C++ struct与union

编码运行环境:VS2012+Win32+Debug Win32既表示运行平台是Windows 32bits操作系统,又表示生成32bits的应用程序。

9010
来自专栏简书专栏

Python入门

多媒体应用、WEB开发、网络爬虫、人工智能与机器学习、数据分析处理、服务器运维及其他小工具 知乎链接:用python做一些有趣的事情

37030
来自专栏Python攻城狮

正则表达式1.正则表达式概述2.re模块操作3.表示字符4.re模块的高级用法5.贪婪和非贪婪

在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re

26220
来自专栏老司机的技术博客

宝宝都能学会的python编程教程9:dict和set

dict字典 dict和我们小时候用的字典很像,如果你想查一个汉字,你只需要根据某一个拼音就可以很快速的查询到它。 ? 在字典的索引表里(比如部首表)查这个字...

36450
来自专栏程序员互动联盟

【今日问题】变量未初始化引起的崩溃

昨天写的今日问题,有小伙伴给我反馈,觉得挺有用,小编今天继续给小伙伴们总结遇到的常见问题 一、初学者经常由于没有养成良好的编程习惯,未初始化变量会引起那些问题 ...

30660
来自专栏屈定‘s Blog

Java--Enum的思考

枚举类是Java5引进的特性,其目的是替换int枚举模式或者String枚举模式,使得语义更加清晰,另外也解决了行为和枚举绑定的问题.

16840
来自专栏Jimoer

数据结构:数组、链表、栈、队列的理解

解释定义 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。再简单描述一下:数据结构就是描述对象间逻辑关系的学科。 如果还是不太清楚下面会...

544100

扫码关注云+社区

领取腾讯云代金券