chdlong 发表于 2015-9-9 19:58:21

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 ?
请大牛指教!

FindAllBlue 发表于 2015-9-9 19:58:22

{:4_97:}{:4_87:}召唤大神,求解决!!

大牛 发表于 2015-9-10 09:56:14

大牛来了{:4_86:}{:4_109:}

chdlong 发表于 2015-9-12 08:06:28

大牛 发表于 2015-9-10 09:56
大牛来了

呵呵                                                      

chdlong 发表于 2015-9-12 17:06:20

FindAllBlue 发表于 2015-9-12 09:01
召唤大神,求解决!!

谢谢!                                          

maoabcd 发表于 2015-9-13 13:56:42

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形式的,

rel 发表于 2015-9-13 15:15:52

其实吧,我觉得那个p命名和v命名是一样的,只不过反编译工具帮你做了下映射,类似取个别名那样,实际还是v0,v1...;

chdlong 发表于 2015-9-13 19:13:40

rel 发表于 2015-9-13 15:15
其实吧,我觉得那个p命名和v命名是一样的,只不过反编译工具帮你做了下映射,类似取个别名那样,实际还是v0 ...

谢谢!                                       
页: [1]
查看完整版本: dex反编译寄存器问题