android的.registers定义了方法中总共使用了几个寄存器.locals定义了方法中有几个非参数寄存器如果一个方法有5个寄存器.locals定义了方法中有几个非参数寄存器如果一个方法有5个寄存器即
android的.registers定义了方法中总共使用了几个寄存器.locals定义了方法中有几个非参数寄存器如果一个方法有5个寄存器.locals定义了方法中有几个非参数寄存器如果一个方法有5个寄存器即.registers5,v0-v4,而且该方法有两个参数那么这两个参数将使用最后的两个寄存器即v3和v4。对于非static方法那么第一个寄存器肯定是this比如方法LMyObject;->callMe(II)V有两个整形参数那么它就会用三个寄存器。为了动态调试android代码有时候需要动态的注入代码但是代码注入时候有几次发现会崩溃后来经过研究发现是寄存器用错。一个方法可能本身就用了5个寄存器v0-v4而你用v5那肯定要崩溃是吧或者你用了后面会用到的寄存器把值给改了那肯定也要崩溃。具体大家可以看看下面的文章见 http://code.google.com/p/smali/wiki/Registers 有点像stdcall的压栈形式。说白了就是比如有个方法void method(arg1, arg2){ int i; i arg1arg2;}那么method函数就要用三个寄存器如果采用V模式来使用寄存器那么就是i v0arg1 v1arg2 v2如果是p模式使用寄存器那么就是i v0arg1 p0arg2 p1下面两个重载函数public int Add(int i,int j)C#委托和Lambda表达式的学习 { int k 0; k ij; return k; } public int Add(int i,int j,int k ) { int m 0,n 0; m ij; n mk; return n; }对应的smali码:# virtual methods.method public Add(II)I .locals 1 .parameter "i" .parameter "j" .prologue .line 44 const/4 v0, 0x0 .line 45 .local v0, k:I add-int v0, p1, p2 .line 46 return v0.end method.method public Add(III)I .locals 2 .parameter "i" .parameter "j" .parameter "k" .prologue .line 50 const/4 v0, 0x0 .local v0, m:I const/4 v1, 0x0tp-link 941n v2设置samba密码教程 .line 51 .local v1, n:I add-int v0, p1, p2 .line 52 add-int v1, v0, p3 .line 53 return v1.end method说明我们要注入代码要使用寄存器的话可以增加local然后方便的用多出来的就行了关键是要开启P模式。
转:https://www.cnblogs.com/ctou45/archive/2011/09/05/2167671.html