.java ==> .class ==> .dex ==> .smali2)dx.jar脚本将class文件打包成dex文件
【可以和游戏同时运行的翻译器 安卓反编译apk工具有哪些】dx --dex --output=Test.dex com/xxx/ooo/Test.class3)Baksmali.jar脚本将dex文件反编译成smali文件
java -jar baksmali.jar -o smali_out/ source.dex4)smali.jar脚本将smali文件打包成dex文件
java -jar smali.jar smali_out/ -o source.dex6、Dalvik字节码类型Davilk字节码只有两种类型:基本类型和引用类型,对象和数组都是引用类型 。
基本类型和无返回值的void类型都是用一个大写字母表示
对象类型用字母L加对象的全限定名来表示
数组类型用[来表示
全限定名是什么?具体规则如下所示:
以String为例,其完整名称是java.lang.String,那么其全限定名就是java/lang/String; 。即java.lang.String的”.”用”/”代替,并在末尾添加分号”;”做结束符
类型描述符Java类型VvoidZBooleanBbyteSstringCcharIintJlongFfloatDdoubleLJava对象类型[数组类型解释下Java对象类型:L可以表示java类型中的任何类,比如在Java代码中的java.lang.String对应在Davlik中描述是Ljava/lang/String二、Dalvik指令集上面只是简单了解了Dalvik字节码,具体每个方法涉及到的逻辑还需要Dalvik指令集来解释,下面介绍Dalvik指令集,由于Dalvik虚拟机是基于寄存器架构的,其指令集的风格更偏向于x86中的汇编指令
数据定义指令const指令定义代码中变量、常量、类等数据
指令描述const/4 vA,# B将数值符号扩展为32后赋值给寄存器vAconst-wide/16 vAA,# BBBB将数值符号扩展为64位后赋值个寄存器对vAAconst/high16 vAA, # BBBB0000将数值右边零扩展为32位后赋给寄存器vAAconst-string vAA,string[@BBBB](https://github.com/BBBB “@BBBB”)通过字符串索引高走字符串赋值给寄存器vAAconst-class vAA,type[@BBBB](https://github.com/BBBB “@BBBB”)通过类型索引获取一个类的引用赋值给寄存器vAA
数据操作指令move指令用于操作代码中的数据
指令描述move vA,vB将vB寄存器的值赋值给vA寄存器,vA和vB寄存器都是4位move/from16 vAA,VBBBB将vBBBB寄存器(16位)的值赋值给vAA寄存器(7位),from16表示源寄存器vBBBB是16位的move/16 vAAAA,vBBBB将寄存器vBBBB的值赋值给vAAAA寄存器,16表示源寄存器vBBBB和目标寄存器vAAAA都是16位move-object vA,vB将vB寄存器中的对象引用赋值给vA寄存器,vA寄存器和vB寄存器都是4位move-result vAA将上一个invoke指令(方法调用)操作的单字(32位)非对象结果赋值给vAA寄存器move-result-wide vAA将上一个invoke指令操作的双字(64位)非对象结果赋值给vAA寄存器mvoe-result-object vAA将上一个invoke指令操作的对象结果赋值给vAA寄存器move-exception vAA保存上一个运行时发生的异常到vAA寄存器
比较指令cmp/cmpl用于比较两个寄存器值,cmp大于结果表示1,cmpl大于结果表示-1 。
指令说明cmpl-float vAA,vBB,vCC比较两个单精度的浮点数.如果vBB寄存器中的值大于vCC寄存器的值,则返回-1到vAA中,相等则返回0,小于返回1cmpg-float vAA,vBB,vCC比较两个单精度的浮点数,如果vBB寄存器中的值大于vCC的值,则返回1,相等返回0,小于返回-1cmpl-double vAA,vBB,vCC比较两个双精度浮点数,如果vBB寄存器中的值大于vCC的值,则返回-1,相等返回0,小于则返回1cmpg-double vAA,vBB,vCC比较双精度浮点数,和cmpl-float的语意一致cmp-double vAA,vBB,vCC等价与cmpg-double vAA,vBB,vCC指令
跳转指令用于跳转至不同的地址处,Davlik提供了三种跳转指令,goto、swicth和if跳转
指令操作gotoAA无条件跳转到指定偏移处(AA即偏移量)packed-switch vAA, BBBBBBBB有规律分支跳转指令.vAA寄存器中的值是switch分支中需要判断的,BBBBBBBB则是偏移表(packed-switch-payload)中的索引值,spare-switch vAA, BBBBBBBB无规律分支跳转指令,和packed-switch类似,只不过BBBBBBBB偏移表(spare-switch-payload)中的索引值if-eq vA,vB,targetvA,vB寄存器中的相等,等价于java中的if(a==b),比如if-eq v3,v10,002c表示如果条件成立,则跳转到current position 002c处.其余的类似if-ne vA,vB,target等价与java中的if(a!=b)if-lt vA,vB,targetvA寄存器中的值小于vB,等价于java中的if(a`
推荐阅读
- 深圳北一潮汕高铁票价多少时间,请问一下全部的高铁票深圳北去潮汕的中途普宁都可以下车吗我的是
- “双十一”和“双十二”谁划算 双十二和双十一哪个优惠力度大
- 南京高铁什么时候可以中转,南京火车站可以站内转乘吗车票买好了 两车交汇时间只有二十分钟
- 有什么表白游戏,玩手游也能表白
- 驱魔传游戏机怎么玩,为何在游戏里杀疯了
- 页游什么意思,3A游戏到底是什么意思
- 有竹小龙的游戏叫什么,游戏王卡组分享
- 蜀山伏魔录怎么提现,教你零基础从小白到专业游戏打金赚钱选手
- 优信二手车与优信拍,优信拍个人申请和商家申请区别
- 剧毒术士怎么打,这剧毒术士怎么使用
