dex反编译寄存器问题
在dex文件反编译后,我们得到SMALI文件,当我们要在其中注入代码时,一般要用到寄存器,为了不破坏程序原有的流程和数据,我们要添加新的寄存器使用,如果在一个方法中有这样的表达:.locals 6说明本方法用到了6个非参寄存器,如果我们需要增加一个则改为:.locals 7,然后我们就可以使用v6这个新增加的寄存器,而不会影响其它的寄存器。但是如果一个方法中寄存器是这样表达的:.registers 6,这表明本方法中用到了参数与非参数寄存器一共6个,如果参数寄存器2个,则会表示为:p0和p1而非参寄存器为v0 v1 v2 v3,如果新增加一个,应该改为:.registers 7,但是我们新增加的是哪一个呢?是v4还是v6?
本来可以试的问题是不应该来问的,这也是我的下一个问题
目前我自己编出来的测试程序中都是用.locals 6这样的表达方式,我编不出.registers 7这样表达的程序,我想知道反编译DEX的时候是不是可以指定samli中用什么样的寄存器表示方式?是.registers 还是.locals ?
请大牛指教!
{:4_97:}{:4_87:}召唤大神,求解决!! 大牛来了{:4_86:}{:4_109:} 大牛 发表于 2015-9-10 09:56
大牛来了
呵呵 FindAllBlue 发表于 2015-9-12 09:01
召唤大神,求解决!!
谢谢! v寄存器表示的话,参数寄出去始终处于最后面,修改寄存器数相当麻烦,增加一个寄存器所有参数寄存器都要后移.p寄存器表示就简单很多,.registers x只表示本地寄存器,没包含参数寄存器,增加一个就是在原来的v(max)+1. p寄存器是smali自己定义的方便寄存器修改而已,dex本身是按v方式处理的,
../smali/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java里处理寄存器数是.locals还是.registers的方法
private static int getRegisterCount(ClassDataItem.EncodedMethod encodedMethod)
{
int totalRegisters = encodedMethod.codeItem.getRegisterCount();
if (baksmali.useLocalsDirective) {
int parameterRegisters = encodedMethod.method.getPrototype().getParameterRegisterCount();
if ((encodedMethod.accessFlags & AccessFlags.STATIC.getValue()) == 0) {
parameterRegisters++;
}
return totalRegisters - parameterRegisters;
}
return totalRegisters;
}
smali/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java里有把v寄存器分离成p形式的, 其实吧,我觉得那个p命名和v命名是一样的,只不过反编译工具帮你做了下映射,类似取个别名那样,实际还是v0,v1...; rel 发表于 2015-9-13 15:15
其实吧,我觉得那个p命名和v命名是一样的,只不过反编译工具帮你做了下映射,类似取个别名那样,实际还是v0 ...
谢谢!
页:
[1]