首先介绍一款比较实用的工具——ES文件浏览器(小映子推荐),当须要破解某些系统软件,而该系统还没法root时,这个软件能够轻松的获取源文件:java
它相似与文件管理器,但能够显示那些系统想隐藏而不让你看到你文件,且无需root权限。通常系统软件都存放在 system/app中,固然别忘了还有system/priv-app等,从内存中将想要的文件进行拷贝,而后黏贴到sdcard,接着经过USB调试就能够直接获取这些文件,简单易用浏览器
odex是从apk文件中提取出classes.dex文件,并经过优化生成一个可运行的文件单独存放缓存
原apk文件中的classes.dex文件能够保留,也能够删除,有时候为了混淆视听,甚至会留下残破的dex文件sass
因此odex的目的通常有两个:app
1. 加快软件的启动速度,odex可预先提取(提早存储于缓存,优先级高于对应apk中的dex,有odex的状况下不会再加载其对应的dex),通常常见于系统ROM工具
2. 应用保护,通常状况下有odex的应用,其对应的apk文件中只存留资源文件,或者破损的dex文件,这样在反编译的状况下得不到正确的应用数据,同时也没法安装使用优化
这里使用到的工具是baksmali,我下的是最新版2.2.2,首先看一下使用:spa
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出现闪退,报错,卡死等等,那么恭喜你,你遇到反调了,这个就再也不本文讲述范围了