如何修复使用NOP指令抹去关键方法的DEX文件
发布网友
发布时间:2022-04-22 07:09
我来回答
共1个回答
热心网友
时间:2022-06-17 06:24
首先,我们使用某些反编译工具打开一个classes.dex文件,
我们可以看到每个函数的代码全部被抹去了。接下来,我们先使用010 Editor来解析这个Dex文件,
看来010 Editor无法解析classes.dex文件,原因可能在于Dex文件中的某些字段已经被修改过。这些字段可能包含某些偏移量信息,用来标识文件内部的偏移量。如果偏移量的值超过了DEX文件的大小,会导致文件解析错误。
该Dex文件的大小为0x2B2DD8。
我写了一个C++程序来解析Dex文件,检查其中不正常的字段,部分输出结果如图3所示。
我们可以看到DexCode结构中,“debugInfoOff”字段的值不正常,超过了文件本身的0x2b2dd8大小。此例中,这些不正常的debugInfoOff字段取值范围在0x3ffff30到0x4000000之间。
为使010 Editor能正确解析这个Dex文件,我修复了文件debugInfoOff字段的值。我以MainActivity类中的“OnCreate”方法为例,演示修复过后的Dex文件在010 Editor中的解析结果。
接下来我将debugInfoOff的值修改为0。insns_size字段代表了代码中指令的长度,每一条指令包括2个字节,因此代码的长度为0x76。“OnCreate”方法的具体代码以“0E 00”字节码开始,其余部分全部为NOP指令。“0E 00”字节码代表的是void返回类型。
现在的问题是,如何获取该方法的真正字节码?图5中,某些关键方法已经被NOP指令抹去了。程序准备调用某个方法前,会先对该方法中的字节码进行解密,调用完毕后程序会使用原始的NOP字节码重新替换填充。
在Dalvik虚拟机中,方法在调用时其字节码必须是正确的。换句话说,如果某个方法不处于调用状态,那么它的字节码可能是错误的。这个样本充分利用了这一点,实现了对方法的动态解密调用。