Dalvik的两种不同的寄存器表示方法

0x01 Dalvik的两种不同的寄存器表示方法——v命名法与p命令法

在研究安卓逆向的时候,经常在看smali代码中有看到譬如v0啊,p1啊之类的代码,其实这些都表示的是寄存器,只不过表示的方法不同罢了,本文是我学习过程中的笔记吧,算是记录一下。

根据Dalvik虚拟机参数传递方式中的规定:假设一个函数使用到M个寄存器,其中函数的参数是N个,那么参数使用最后的N个寄存器,局部变量使用从头开始的前M-N个寄存器。

假设存在一个函数如下

1
2
3
4
5
6
7
8
9
10
public class Hello{
public int foo(int a, int b){
return (a + b) * (a - b);
}

public static void main(String[] args){
Hello hello = new Hello();
System.out.println(hello.foo(5, 3));
}
}

在这段代码代码中,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软件安全与逆向分析》

本文标题:Dalvik的两种不同的寄存器表示方法

文章作者:Pino-HD

发布时间:2018年06月10日 - 16:06

最后更新:2018年06月10日 - 16:06

原始链接:https://pino-hd.github.io/2018/06/10/Dalvik的两种不同的寄存器表示方法/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!