发新帖

dex反编译寄存器问题

[复制链接]
13809 7
5NB
在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 ?
请大牛指教!

最佳答案

查看完整内容

召唤大神,求解决!!

举报 使用道具

回复

精彩评论7

FindAllBlue    发表于 2015-9-9 19:58:22 | 显示全部楼层
召唤大神,求解决!!

点评

谢谢!  详情 回复 发表于 2015-9-12 17:06

举报 使用道具

回复
大牛    发表于 2015-9-10 09:56:14 | 显示全部楼层
大牛来了

点评

呵呵  详情 回复 发表于 2015-9-12 08:06

举报 使用道具

回复
chdlong    发表于 2015-9-12 08:06:28 | 显示全部楼层

呵呵                                                      

举报 使用道具

回复
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 ...

谢谢!                                       

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表