0x01 Dalvik的两种不同的寄存器表示方法——v命名法与p命令法
在研究安卓逆向的时候,经常在看smali代码中有看到譬如v0啊,p1啊之类的代码,其实这些都表示的是寄存器,只不过表示的方法不同罢了,本文是我学习过程中的笔记吧,算是记录一下。
根据Dalvik虚拟机参数传递方式中的规定:假设一个函数使用到M个寄存器,其中函数的参数是N个,那么参数使用最后的N个寄存器,局部变量使用从头开始的前M-N个寄存器。
假设存在一个函数如下
1 | public class Hello{ |
在这段代码代码中,foo函数使用了5个寄存器,2个显示的整形参数,其中foo函数是Hello类的非静态方法,函数被调用是会传入一个隐式的Hello对象引用,因此,实际传入的参数数量是3个。那么局部变量使用前2个寄存器,参数会使用后3个寄存器。
0x02 v命名法
v命名法采用以小写字母“v”开头的方式表示函数中用到的局部变量与参数,所有的寄存器命名从v0开始,依次递增。对于foo函数,v命名法会用到v0,v1,v2,v3,v4这五个寄存器,v0和v
1表示的是局部变量寄存器,v2表示的是被传入的Hello对象的引用,v3和v4分别表示两个传入的整形参数。
0x03 p命名法
p命名法会函数的局部变量寄存器命名没有什么影响,它主要是函数中引入的参数命名从p0开始,依次递增。对于foo函数来说,p命名法会用到v0,v1,p0,p1,p2这五个寄存器,v0和v1表示局部变量寄存器,p0表示的是被传入的Hello对象的引用,p1和p2分别表示两个传入的整形参数。
0x04 参考
《Android软件安全与逆向分析》