- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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⽂件中,如果是⽅法或字
您可能关注的文档
最近下载
- 贵州省黔东南州2023-2024学年高一下学期期末文化水平测试语文试卷(含答案).docx VIP
- 2025年墨西哥入境卡填写模板.pdf VIP
- 人民币升值对中国纺织业的影响和对策.pdf
- 年产10万吨乙烯气相法合成醋酸乙烯精制工段设计.docx
- 软件工程教材购销系统报告参考模板.pdf VIP
- 言语治疗复习题[1].docx
- 新概念英语第一册131-132课课件.pptx
- 2025年北京市东城区九年级(初三)二模物理试卷(含答案).pdf
- (必练)国家电网招聘(计算机类)专业知识备考题库资料宝典(核心题版).pdf VIP
- 中国AOPA民用无人机驾驶员地面站科目题库练习题和教程全集.pdf
文档评论(0)