Android 系统应用解析之——odex

 强大的工具ES文件浏览器

 首先介绍一款比较实用的工具——ES文件浏览器(小映子推荐),当需要破解某些系统软件,而该系统还无法root时,这个软件可以轻松的获取源文件:

 它类似与文件管理器,但可以显示那些系统想隐藏而不让你看到你文件,且无需root权限。一般系统软件都存放在 system/app中,当然别忘了还有system/priv-app等,从内存中将想要的文件进行拷贝,然后黏贴到sdcard,接着通过USB调试就可以直接获取这些文件,简单易用

 优化的可运行dex——odex

 odex是从apk文件中提取出classes.dex文件,并通过优化生成一个可运行的文件单独存放

 原apk文件中的classes.dex文件可以保留,也可以删除,有时候为了混淆视听,甚至会留下残破的dex文件

 所以odex的目的一般有两个:

 1. 加快软件的启动速度,odex可预先提取(提前存储于缓存,优先级高于对应apk中的dex,有odex的情况下不会再加载其对应的dex),一般常见于系统ROM

 2. 应用保护,一般情况下有odex的应用,其对应的apk文件中只存留资源文件,或者破损的dex文件,这样在反编译的情况下得不到正确的应用数据,同时也无法安装使用

 odex的编译(odex-->smali)

 这里使用到的工具是baksmali,我下的是最新版2.2.2,首先看一下使用:

D:\baksmali>java -jar baksmali-2.2.2.jar
usage: baksmali [--version] [--help] [<command [<args>]]

Options:
  --help,-h,-? - Show usage information
  --version,-v - Print the version of baksmali and then exit

Commands:
  deodex(de,x) - Deodexes an odex/oat file
  disassemble(dis,d) - Disassembles a dex file.
  dump(du) - Prints an annotated hex dump for the given dex file
  help(h) - Shows usage information
  list(l) - Lists various objects in a dex file.

See baksmali help <command> for more information about a specific command

 这里我们需要用到的就是 deodex(de,x),解析一个odex文件,下面以oppo的CloudService为例,CloudService文件夹下有一个应用程序apk,同样有一个可运行文件odex。

 用压缩软件打开apk文件可以发现,apk中并没有dex文件,当我们安装这个apk时会发生INSTALL_FAILED_DEXOPT错误,即安装包破损(这里就是缺少dex文件)

 下面首先看下解析odex:

D:\baksmali>java -jar baksmali-2.2.2.jar de C:\Users\xk\Desktop\jebpath\CloudService.odex


Error occurred while loading class path files. Aborting.
org.jf.dexlib2.analysis.ClassPathResolver$ResolveException: org.jf.dexlib2.analysis.ClassPathResolver$NotFoundException: Could not find classpath entry boot.oat
        at org.jf.dexlib2.analysis.ClassPathResolver.<init>(ClassPathResolver.java:145)
        at org.jf.dexlib2.analysis.ClassPathResolver.<init>(ClassPathResolver.java:105)
        at org.jf.baksmali.AnalysisArguments.loadClassPathForDexFile(AnalysisArguments.java:129)
        at org.jf.baksmali.AnalysisArguments.loadClassPathForDexFile(AnalysisArguments.java:86)
        at org.jf.baksmali.DisassembleCommand.getOptions(DisassembleCommand.java:207)
        at org.jf.baksmali.DeodexCommand.getOptions(DeodexCommand.java:71)
        at org.jf.baksmali.DisassembleCommand.run(DisassembleCommand.java:181)
        at org.jf.baksmali.Main.main(Main.java:102)
Caused by: org.jf.dexlib2.analysis.ClassPathResolver$NotFoundException: Could not find classpath entry boot.oat
        at org.jf.dexlib2.analysis.ClassPathResolver.loadLocalOrDeviceBootClassPathEntry(ClassPathResolver.java:216)
        at org.jf.dexlib2.analysis.ClassPathResolver.<init>(ClassPathResolver.java:120)
        ... 7 more

 出错了。。。正常,看日志可以发现,是缺少boot.oat这个文件,这个文件在手机系统的system/framework/arm中,拿出这个文件,放到baksmali文件同目录下,再次执行

D:\baksmali>java -jar baksmali-2.2.2.jar de C:\Users\xk\Desktop\jebpath\CloudService.odex

D:\baksmali>

 在baksmali同目录下有一个out文件夹,里面存放的就是对应的smali文件

 1. 如果是根据smali进行静态分析,到这一步就可以了

 2. 如果需要分析Java代码,首先利用smali软件将out文件夹中的smali文件转换成dex文件,之后可以使用dex2jar或jeb等软件进行分析(jeb的话将dex直接塞到apk中替换原dex即可)

  D:\baksmali>java -jar smali-2.2.2.jar a out -o classes.dex 

 3. 如果是需要安装apk,光把dex塞入apk还不行,会产生INSTALL_PARSE_FAILED_NO_CERTIFICATES错误,需要利用signapk来重新进行签名

  D:\signapk>signapk CloudService.apk 111.apk 

 4. 如果你安装的apk出现闪退,报错,卡死等等,那么恭喜你,你遇到反调了,这个就不再本文讲述范围了

 

 

 

 

posted @ 2017-11-10 09:55  九鼎煮鸡蛋  阅读(6914)  评论(0编辑  收藏  举报