2012年2月12日 星期日

透過 dex2jar 和 JD-GUI 反編譯 APK

因為某種需求,想知道某些程式是如何撈到資料的...
透過 web scrawler 的方式遇到蠻多阻礙,所以就試試看從 APP 著手
意外發現這個相當邪惡的玩意兒~囧

參考資料:Android 開發教學筆記 - 關於反組譯 Android 程式,還真的不用 30 秒就搞定!


具體流程很簡單,先準備好想要反編譯的 APK 檔
下載 dex2jar 跟 JD-GUI(官方網站請見本文最下面的連結)
這邊先介紹 Windows 上的用法,Linux 環境的執行方法請見上面那篇文章連結
不過其實在 Windows 執行方法跟 Linux 一樣,只不過 Linux 要用 sh 呼叫 shell script 罷了。

1. 解壓縮 dex2jar,例如解壓縮到 D:\dex2jar。並將 apk 放在某個位置,本例中為 D:\xxx.apk
2. 開啟 cmd,輸入「D:\dex2jar\dex2jar.bat D:\xxx.apk」,執行無誤的話會出現一個 D:\xxx_dex2jar.jar 檔。
PS. 執行若出錯會跑出一串 Java 的 Exception,可以自行從 Exception 的描述大概看出可能原因是什麼,例如跑出「java.io.FileNotFoundException」就是指定的檔案路徑找不到檔案。這些 Exception 相信熟悉 Java 的人應該都知道該怎麼看!
3. 解壓縮 JD-GUI,執行裡面的 jd-gui.exe,然後用 JD-GUI 打開剛剛產生的 .jar 檔,就可以清楚看到 APK 檔裡所有的程式碼了!

其實打開以後會發現程式碼好像註解都不見了(還是我測試的 APK 裡面原本就沒寫註解?XD),原本程式碼的變數都被 Android compiler 替換成 Resource ID 了,不過還是不影響整個程式碼結構....真的是很邪惡的東西!囧"

相關資源:
1. dex2jar:http://code.google.com/p/dex2jar/ (目前為 0.0.9.7 版)
2. GD-GUI:http://java.decompiler.free.fr/?q=jdgui (目前為 0.3.3 版,有 Windows、Linux 和 MAC 版)


反反編譯:Google 在 2.3 以上版本有提供防止被反編譯的方法
即在 Android 專案目錄內的 default.properties 檔案中加上一行 proguard.config=proguard.cfg
編譯出來的 APK 靠以上方法就無法得到人眼看得懂的程式碼了。
不過反過來說,某個 APK 只要能夠被 Android 2.2.X 以下版本安裝,也同時表示它一定是可以被反編譯的~。

沒有留言: