反编译-史上超详细的smali文件解读.pdf

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

反编译-史上超详细的smali⽂件解读

Dalvik虚拟机加载的是dex⽂件,Dex⽂件是Dalvik虚拟机的可执⾏⽂件格式,dex⽂件很难看懂,baksmali和smali是对Dex⽂件的反汇编

器和汇编器,通过对Dex⽂件反编译得到smali⽂件,smali⽂件是对Dalvik虚拟机字节码的⼀种解释(也可以说是翻译),并⾮⼀种官⽅标

准语⾔。通过对smali⽂件的解读可以获取源码的信息。

Dalvik指令是Dex⽂件最主要的组成部分:

smali⽂件的头3⾏

#指定了当前类的类名,访问权限为public,类名开头的L是遵循Dalvik字节码的相关约定

.classpublicLcom/example/administrator/myapplication/Demo;

#super指令指定了当前类的⽗类,⽗类为Object

.superLjava/lang/Object;

//指定了当前类的源⽂件名。注意:经过混淆的dex⽂件,反编译出来的smali代码可能没有源⽂件信息,source可能为空。

.sourceDemo.java

字段的声明:

smali⽂件的字段的声明使⽤.field指令,字段有静态字段和实例字段两种:

静态字段格式:.field访问权限static修饰关键字字段名字段类型

.fieldpublicstaticHELLO:Ljava/lang/String;

上⾯smali代码转为java代码为:

publicstaticStringHELLO=hello;

实例字段格式:.field访问权限修饰关键字字段名字段类型

.fieldprivatebutton:Landroid/widget/Button;

.fieldpublicnumber:I

上⾯的smali代码转为java代码为:

privateButtonbutton;

publicintnumber=5;

⽅法的声明

使⽤.method指令,分为直接⽅法(⽤private修饰的)和虚⽅法(⽤public和protected修饰的),直接⽅法和虚⽅法的声明是⼀样的。在

调⽤函数时,有invoke-direct,invoke-virtual,invoke-static、invoke-super以及invoke-interface等⼏种不同的指令。还有invoke-

XXX/range指令的,这是参数多于4个的时候调⽤的指令,⽐较少见:

.methodprivatestaticgetCount(II)V

.registers2

.paramp0,x

.paramp1,y

.prologue

.line28

return-void

.endmethod

第⼀⾏为⽅法的开始处,此处⽅法的修饰符是static,访问权限是private,⽅法名是getCount,有两个参数,都是int类型的(I代表

int),V代表⽆返回值。

第⼆⾏指定寄存器的⼤⼩。

第三⾏和第四⾏为⽅法的参数,每有⼀个参数,就写⼀个参数,此处有两个参数。

第五⾏为⽅法的主体部分(.prologue)

第六⾏指定了该处指令在源代码中的⾏号,这⾥是从java源码中底28⾏开始的

第七⾏return-void表⽰⽆返回值

第⼋⾏(.endmethod)⽅法结束

上⾯的smali转为java代码为:

privatestaticvoidgetCount(intx,inty){

}

类实现接⼝

如果⼀个类实现了接⼝,会在smali⽂件中使⽤“.implements”指令指出,相应的格式声明如下:

#interfaces

.implementsLcom/example/administrator/myapplication/TestParent;

上⾯smali代码表明了实现了TestParent这个接⼝。

类使⽤注解

如果⼀个类使⽤了注解,会在smali⽂件中使⽤“.annotation”指令指出,注解的格式声明如下:

#annotations

.annotation[注解属性]注解类名

[注解字段=值]

.endannotation

注解的作⽤范围可以是类、⽅法或字段。如果注解的作⽤范围是类,“.annotation”指令会直接定义在smali⽂件中,如果是⽅法或字

文档评论(0)

xman123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档