-
-
[原创]android解释器----函数参数在寄存器存放顺序
-
发表于:
2019-11-14 14:18
3886
-
[原创]android解释器----函数参数在寄存器存放顺序
第一次发帖,目前市面上的加固工具都已经实现了java vmp,但是网上的资料少之又少,这里就自己研究的java vmp前奏--解释器之寄存器的存放顺序做一下分享,希望对其他同学有所帮助,纯自己研究摸索的,如有不对的地方还请大神们指教。(看这篇文章之前希望你先去熟悉一下smali的语法和dex的结构哈)
1.先来看一下测试程序的java源码,这里我会对函数multi的参数的存放顺序做说明
2.再来看一下函数multi的反编译出来的smali代码:可以看到multi的四个入参分别对应p1,p2,p3,p4,熟悉smali的同学会知道因为multi不是static方法,所以这里会有一个隐藏的参数this,也就是p0;smali的代码中可以看到还使用到了临时变量v0.(后面将会对参数p0,p1,p2,p3,p4,v0的存放顺序来进行解释说明)
3.这里我们再来看一下对应的dex文件中的数据(用010Editor打开dex可以看到,这里希望你先自己去熟悉一下dex的结构)
从图上我们可以看到registers_size的值为7,这里表示函数multi在解释的过程中总共使用了7个寄存器(包括local register,也就是临时变量v0,v1...和参数寄存器p0,p1,p2,p3,p4);ins_size的值为5表示入参为5个(即p0,p1,p2,p3,p4)
结论:下面是我手绘的一张对应关系图,最左边的0 1 2 3 4 5 6表示在dalvik解释器中对寄存器的编号,中间可以理解为寄存器在smali中的表示,最右边则为在java中的参数(这里V0总是从index为0的地方开始,依次往下;而P0的开始位置为registers_size - ins_size = 7 - 5 = 2; p1,p2,p3,p4依次跟在后面;这里特别说明一下:每个寄存器存是一个32位的值,有些同学可能想到了long和double是64位的,long和double是占2个临近的寄存器,低位在前高位在后);如何验证这个顺序是正确的,请等我的下一篇帖子哈(留意图3中dex中insns中的数据,这里为multi函数对应的dalvik指令,下一篇文章将针对multi函数中用到的指令invoke-virtual和move-result-wide)
[课程]FART 脱壳王!加量不加价!FART作者讲授!