要搞清楚JEB Decompiler里面的变量重命名是怎么操作的,重命名之后引用不同步又该怎么办,得先把重命名的对象给分清楚。局部变量、方法参数、字段、方法和类,这些全都会在反编译出来的代码里面出现,可是它们能起作用的范围是不一样的。局部变量一般只会在当前这个方法里头有影响,字段和方法的名字呢,是有可能被整个代码单元里好多地方给引用的。JEB给了一个统一的Rename操作,它的目标就是让代码项的名称,在对应的分析模型里面能保持一致。
一、JEB Decompiler变量重命名怎么操作
给变量重新起名字这件事情,比较合适在反编译视图里面去弄。汇编视图里头的寄存器、栈槽,还有反编译视图里面的局部变量,并不是完全一样的显示对象,要是在汇编层面直接去找变量的名字,常常不太容易判断它实际是拿来干什么的。
1、先定位需要修改的变量
进到反编译的代码里面以后,把光标挪到目标变量,或者是方法的参数上头,要确认好当前选中的是变量自己,而不是类型的名字、字段,也不是方法的调用。
同一个方法里面,有可能出现名字看起来差不多的局部变量。重新起名字之前,可以先去看一看这个变量是在哪里被赋值的,在哪里被使用,还有它处在哪一个分支里面,再确定它代表的是输入的参数、循环的计数、临时的结果,还是返回的那个值。
2、执行重命名操作
把变量选中之后,按下【N】键,或者是依次点开【Action】→【Rename】,把新的名字填进去,再确认一下。
JEB官方的操作说明里面给出的基本步骤,就是把光标放到目标的代码项上面,去执行Rename,然后再填上新的名字。反编译视图里面的变量和参数,也都是可以这样重新命名的。
名字最好能尽量体现变量是干什么用的,比如说把v3改成requestCode,把a1改成userId。在逻辑还没有完全弄清楚的时候,不要把名字写成特别具体的那种,要不然后面接着分析的时候,很容易被起错的名字给带偏了。
3、通过交叉引用确认含义
要是修改的是字段、方法,或者是类的名字,可以用【X】去查看交叉引用,弄清楚它都在什么位置被读取、被写入,或者被调用。
局部变量一般是只在当前的方法范围里面去判断就行了,可是字段和方法有可能贯穿好几个类。重新起名字之前,多看几个调用的位置,比起光靠一行代码去猜名字,要可靠得多。
二、变量重命名后引用不同步怎么办
名字重新起过了,可是某些地方还是显示老的名字,这不一定就说明Rename这个操作失败了。比较常见的原因有反编译视图没有去刷新、打开了多个旧的视图,又或者是那些被认为应该是同一个变量的东西,实际上属于不一样的作用域。
1、先刷新反编译视图
把当前这个方法的反编译视图关掉再重新打开,或者是执行刷新、同步视图的操作,然后再去检查名字是不是已经更新过来了。
JEB的旧版官方手册里面,是把F5或者对应的macOS刷新命令用来刷新、同步当前的视图。要是有好几个标签页同时都显示同一个类,这里面的某一个标签可能还留着修改之前渲染出来的结果,这个时候去重新生成一遍视图,通常比一遍又一遍地重命名要更有用。
2、确认是不是两个不同变量
反编译器有可能会把不同分支、不同生存周期,又或者是不同栈槽里面的值,给恢复成好几个局部变量。它们原来显示的名字看上去很接近,但这并不代表它们就是同一个变量。
比如在两个分支里面都出现了v2,重新反编译一下子之后,可能就各自变成了两个不一样的标识符。修改其中一个名字的时候,另外一个没有跟着变,这属于正常的情况。碰到这种时候,要结合着定义的位置,还有数据流去判断,不要光看着变量的样子,硬把它们给统一起来。
3、区分局部变量和成员字段
局部变量的名字改过以后,它只会影响到当前这个方法里面那个对应的标识符,不会把另外一个方法里头的同名局部变量也跟着一块儿改了。成员字段、方法和类,这些属于代码单元里面正式的项目,重新命名的影响范围通常是要大一些的。
另外,外部库里面的类、字段,或者是方法,并不是当前这个文件自己在内部定义的,有部分模块是不会允许直接去重命名的。官方旧版的说明里面也明确指出了,外部项目不能按照内部DEX项目的那种方式来修改名称。
三、重命名结果仍异常怎么继续排查
如果刷新之后,还是有那种很明显对不上的情况,那就要去检查分析的状态、调试的信息,还有软件的版本,而不是继续一遍遍地去重复执行Rename。
1、等待分析完成后再修改
那些体积很大的APK、DEX,或者是原生的程序,如果还在后台被分析着,函数的结构和变量恢复出来的结果,有可能还会接着变。要是名字改得太早了,重新反编译一回,就有可能出现变量被合并、拆分,或者是名字又被重新给渲染过了的情况。等到当前这个方法的分析稳定下来之后,再去统一整理名字,结果更容易保得住。
2、检查调试名称是否干扰
JEB是可以去读取调试的信息,并且用那里面的名字来给标识符命名的,可官方的配置说明也提醒过,DEX的调试元数据有可能不太可靠,甚至可能是经过伪造,或者被混淆过的。如果变量的名字老是变来变去的,就可以去检查一下项目里面对debug information的解析设置,再结合着字节码实际的用途,重新去判断一下。
3、保存项目并更新版本
JEB的项目数据库,是能够把重命名过的项目和标识符的名字都给保存下来的。名字改好以后,应该正常地把项目保存一下,重新打开之后再去检查。要是只有固定的某一个文件,或者特定的某一个版本才会出现不同步的情况,那还可以去翻一下更新的记录,然后升级到一个比较新的维护版本,有一部分版本是曾经修复过项目的重命名检查,还有界面激活这些相关问题的。
总结
JEB Decompiler变量重命名怎么操作,变量重命名以后引用不同步又该怎么办,基本的办法就是先把光标放到目标的变量上,再通过N键,或者是Action里面的Rename去把名字给改掉。碰到不同步的时候,要先刷新,或者重新打开反编译视图,然后再去确认一下那些引用,是不是真的都属于同一个变量。局部变量、成员字段、外部项目,还有汇编寄存器,这些东西能作用的范围是不一样的,不能光是去看老的名字是不是一样的。把定义的位置、数据流,还有交叉引用结合到一块儿去判断,给变量起名字这件事,才不会反过来干扰到代码的分析。
