寄存器 Registers
描述smali文件中寄存器的具体信息,并概括在dalvik字节码中的信息。
介绍Introduction
在dalvik字节码中,寄存器总是32位,能够保存任何类型的值。2个寄存器用来保存64位的类型(Long和Double)。
说明方法中寄存器的个数
有两种方法指定方法中有多少个寄存器可用。类似 .registers的指令,指明了方法中总的寄存器数目;另一中 .locals指令,指明了方法中不包括参数(函数入参)在内的寄存器数目。方法中总的寄存器数目包括保存locals(本地变量)所需的和保存函数参数所需的寄存器数目。
方法的参数是怎样传递到方法中的?
当一个方法被调用时,方法的参数被放置在最后几个寄存器中。如果一个方法有2个入参和注册了5个寄存器(v0-v4),参数被放置在最后2个寄存器,v3和v4.
非静态方法的第一个参数总是调用改方法的对象(可以理解为this指针)。
例如,你写了一个静态方法,LMyObject;->callMe(II)V.这个方法有2个整形参数,但是在两个整形参数之前,它还有一个隐藏的参数LMyObject;,因此改方法的参数总数是3.
假设你通过.register 5(v0-v4)或者.locals 2指令(2个本定寄存器加3个参数寄存器),指定在方法中有5个寄存器可用。当这个方法被调用时,调用改方法的对象将被保存在v2寄存器中,第一个整形参数保存在v3中,第二个整形参数保存在v4中。
静态方法与此类似,只不过没有隐藏的this参数。
寄存器的名称
寄存器有2种命名设计,正常的v命名和为了参数设计的p命名。p命名方案中的p0是指方法中的第一个参数。让我们回到上一个例子当中,方法有3个参数,共5个寄存器。下面的表格表明了v命名方案中每个v参数和相应的p命名方案中的p参数。
v0 |
|
第一个本地寄存器 |
v1 |
|
第二个本地寄存器 |
v2 |
p0 |
第一个参数寄存器 |
v3 |
p1 |
第二个参数寄存器 |
v4 |
p2 |
第三个参数寄存器 |
引用参数寄存器时,这两种命名方式都可以采用。
引入参数寄存器的动机
作为一个特例,引入p命名方案的参数寄存器,是为了在编辑smali代码时解决一个常见的烦恼。
假设你现在有一个有大量参数的方法,并要向里面添加一些代码,这时你发现你需要一个额外的寄存器。你会认为,这是一个小事,增加 .registers指令后面跟的number就好。
不幸的是,事情并不是那么简单,要记住的是方法的参数保存在最后几个寄存器当中。如果你增加寄存器的数量,你就改变了保存方法参数的寄存器。这样你就必须要改变.register指令并且改变每一个参数寄存器的号码。
但是如果在方法中,p命名方法被用来指示参数寄存器,你可以简单的改变方法中参数寄存器的数目,而不用担心改变任何现存的寄存器的号码。
注意:默认的,baksmali对参数寄存器使用p命名方案。如果你想把这部分功能关调,强制要求baksmali使用v命名方案,你可以使用-p/--no-parameter-registers option.
Long/Double values
正如前面所提到的,long和double类型(缩写是J和D)是64位的值,它们需要2个寄存器。当你要引用函数参数的时候,这一点要记住。例如假设你有一个方法(非静态的)LMyObject;->MyMethod(IJZ)V. 方法的参数是LMyObject;,int,long,bool.因此这个方法需要5个寄存器保存参数。
p0 |
this |
p1 |
I |
p2,p3 |
J |
p4 |
Z |
并且,在你随后调用这个方法得时候,你必须在调用指令的寄存器列表中,为任何一个double长度的参数指定一个双寄存器。
参考官方原文:
http://code.google.com/p/smali/wiki/Registers
分享到:
相关推荐
android 反编译工具,包括smali ,smali-1.4.2.jar,baksmali-1.4.2.jar,baksmali四个工具
android反编译工具---逆向助手,详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/78533913
Android 反编译和smali语法用于ROM适配
android安卓app开发之用AndroidStudio反编译apk.zip
### baksmali 下载使用 #### 资源下载 [source -> 资源下载](https://github.com/JesusFreke/smali) ...[Android反编译工具baksmali最新版的使用方法]( https://blog.csdn.net/qysh123/article/details/79023007)
Android反编译工具合集,里面包含了apktool、dex2jar、jdgui、Smali2Java
Android反编译工具合集,里面包含了apktool、dex2jar、jdgui、Smali2Java 更新:jdgui
使用如下命令,得到classout文件夹,即classes.dex的全部反编译文件,后缀名都为xxx.smali。 java -jar baksmali-1.3.0.jar -o classout/ classes.dex 3、用smali-1.3.0.jar编译classout成classes.dex 通过上面...
android反编译,二次打包一套工具
android安卓app反编译apk反编译教程.zip
smali2java使用apktool对dex中需要翻译的smali代码进行反编译,增加了难度和错误率,降低了手工分析的速度。此外,它们之间的相互作用很差,增加了人工分析的难度。商业jeb虽然具有较好的交互性,但在用multi
我们在开发 安卓中,有时需要对其他apk文件进行反编译,以便我们方便进行学习...我们对其进行反编译后 可以发现 会有Smali后缀名的文件。我们怎么对他进行反编译城Java文件,并让我们看懂呢?下面进行一下简单介绍:
Android动态调试逆向反编译smaliAndroid动态调试逆向反编译smaliAndroid动态调试逆向反编译smali
AndroidAPK反编译工具 apktool jd-gui dex2jar smali
Android中java和smali转化一键化操作工具Android反编译工具合集,里面包含了apktool、dex2jar、jdgui、Smali2Java
Android反编译并签名打包需要的文件,可以实现反编译apk,生成smali,重新签名打包
这个压缩包收集了APK反编译常用的4个工具,可以节省大家收集的时间,直接拿来用吧。用这套工具,一般的APK源码基本都可以看。 所有APK反编译工具都是依托apktool的,所以他的版本很重要,1.X的版本基本都会反编译...
android反编译看java代码工具,可以看apk反编译的smali文件
smali2java使用apktool对dex中需要翻译的smali代码进行反编译,增加了难度和错误率,降低了手工分析的速度。此外,它们之间的相互作用很差,增加了人工分析的难度。商业jeb虽然具有较好的交互性,但在用multi
反编译工具合集,apktool_2.0.2、Smali2Java、dex2jar、jd-gui-0.3.5.windows-apk,内包括基本使用方法与资源博客,高版本apktool可解决反编译过程中出现的常见错误。