首先介紹一款比較實用的工具——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出現閃退,報錯,卡死等等,那麼恭喜你,你遇到反調了,這個就再也不本文講述範圍了