我们可以看到每个函数的代码全部被抹去了。接下来,我们先使用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虚拟机中,方法在调用时其字节码必须是正确的。换句话说,如果某个方法不处于调用状态,那么它的字节码可能是错误的。这个样本充分利用了这一点,实现了对方法的动态解密调用。
简单来说odex的作用是优化后的dex 文件,可以提高加载速度。现在一般第三方ROM都把APK和odex合并起来了,可以加快软件的启动速度,预先提取,减少对RAM的占用,因为没有odex的话,系统要从apk包中提取dex再运行。如果你的odex导出可能有问题,没有跟原本配在一起的APK合并在一起,导致导入的时候安装不了。ODEX优点
1.刷完机首次进入系统的时间会缩短一些。文件的运行速度应该也有所提升。
2.APK文件不能单独安装,并且如果反编译APK文件,一般也只能得到资源文件。可以说是起到一定的保护作用,避免被肆意修改和使用。这样做可以使其厂商保证一定的反盗版,因为没有dex文件的apk是无法正常安装的。
3.会增加一些可安装应用的空间,虽然不是很多。
4.某些机身内存太小的手机优化的时候可以删除dex文件来达到制作大内存包的目的,但是这种大内存包会使手机软件启动速度变慢。适合不追求速度,需要更多内存装软件的用户。
效果
Odex化后系统启动和程序运行速度大大提高,稳定性不变。因此推荐做Odex化。
一般来说官方rom都是odex化的rom(含Odex文件),而定制rom大部分都是deodex化的(无odex文件)。两者应该各有优点吧,貌似现在也没有统一的说法。官方rom大部分每个apk对应一个.odex文件,而deodex化的rom里面只有一个apk,把.odex转换成classes.dex放到apk包里面了。所以 odex rom的.apk+.odex=deodex化rom的1个.apk (简单地来说,其实就上一个合并的过程)
odex文件的生成
1、首先配置JAVA环境,相信大家都会
2、下载工具
adb工具包
dexopt-wrapper工具
3、用数据线将手机与电脑连接,手机中的设置----应用程序设置---开发下的USB调试、允许模拟地点要选上;将需要生成ODEX文件的***.apk文件放到 手机的data/local目录下(与dexopt-wrapper同一个目录)。
4:在电脑上(XP系统):
“运行”——cmd(回车)
输入 adb shell(回车)
Su(回车)
cd data/local(回车)
dexopt-wrapper ***.apk ***.odex (回车)(***.apk与***.odex中的***同名)
就这样ODEX就生成了(看不到的话退出local再进入local)
5、剪贴出来用winrar删除****.apk 里的classes.dex。
这样apk+odex就生成了。将这同名不同后缀的两文件拷到system\app 或data\app中修改权限重启手机就可用了。
Android的ROM中有很多odex文件,相对于APK中的dex文件而言这个odex有什么作用呢? 如果你仔细观察会发现文件名时一一对应的,同时那些对应的apk文件中没有dex文件。这样做可以使其厂商保证一定的反**,因为没有没有dex文件的apk是无**常安装的,而厂商直接将odex和不完整的apk文件放到手机rom固化到/system/bin中可以让一般用户无**常导出使用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)