首页
社区
课程
招聘
[原创]android解释器----函数参数在寄存器存放顺序
发表于: 2019-11-14 14:18 3886

[原创]android解释器----函数参数在寄存器存放顺序

2019-11-14 14:18
3886
    第一次发帖,目前市面上的加固工具都已经实现了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作者讲授!

收藏
免费 1
支持
分享
最新回复 (11)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
棒棒棒,讲解清晰易懂!
2019-11-14 14:38
0
雪    币: 7
活跃值: (223)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
简洁易懂,必须点赞
2019-11-14 15:02
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
java vmp
好新颖的叫法
不过Java怎么实现vmp呢,除了 java to c
2019-11-14 16:19
0
雪    币: 24
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
无边 java vmp 好新颖的叫法 不过Java怎么实现vmp呢,除了 java to c
这里其实我不是很明确的知道你所说的java to c是哪种?我认为dalvik解释器解释java代码时本身也是java to c,用c语言解释执行java指令
2019-11-14 17:27
0
雪    币: 225
活跃值: (277)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
膜拜一下
2019-11-15 10:31
0
雪    币: 582
活跃值: (317)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你好 能否QQ交流一下 Q:1990343340
我想请教一下ptrace 我是新手
一个问题被困了2天了
2019-11-15 14:06
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
摇曳的小树叶 这里其实我不是很明确的知道你所说的java to c是哪种?我认为dalvik解释器解释java代码时本身也是java to c,用c语言解释执行java指令
dalvik解释器的是native
一般java2c指在so里运行java 代码
2019-11-15 14:13
0
雪    币: 24
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
无边 dalvik解释器的是native 一般java2c指在so里运行java 代码
后面有时间补充一篇invoke类型指令解释
2019-11-15 14:43
0
雪    币: 1376
活跃值: (1621)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
没看出这个和java vmp有啥关系,到是讲了些smali的寄存器相关内容,你的vmp在哪啊?
2019-11-16 21:29
0
雪    币: 24
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
aihacker 没看出这个和java vmp有啥关系,到是讲了些smali的寄存器相关内容,你的vmp在哪啊?
请看清楚标题,谢谢
2019-11-17 12:41
0
雪    币: 24
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
摇曳的小树叶 请看清楚标题,谢谢
看雪有大神开源了自己的vmp代码,不歪大神的demo,还有某大神的DCC,但是不歪大神的demo只是解释了算数运算,自己实现dex的指令的难点在invoke系列指令的实现,所以这里只就寄存器顺序说明,后面会更新invoke指令的解释原理,dex中方法抽离等可以参见不歪大神的demo
2019-11-17 12:54
0
游客
登录 | 注册 方可回帖
返回
//