強大的工具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出現閃退,報錯,卡死等等,那么恭喜你,你遇到反調了,這個就不再本文講述范圍了