用 jadx 來玩玩 Android 逆向工程
你幹嘛沒事要來逆向工程啦
就是因為沒事啊。呃不對,其實以前就有聽說過 Android 逆向工具很成熟,不過自從換 iPhone 後就沒怎麼關注 Android 發展了,一直沒機會玩到。
昨天下午剛好就在臉書刷到一款課表 App,就簡稱為 「X 社小工具」好了,可以幫你匯入學校的課表,支援多個學校。看了看截圖,感覺是在手機端輸入校務系統登入帳密達成,X 社小工具會幫你抓下來,只是不知道後面 API 怎麽跑(誰知道)。秉持著好奇的心,就讓我來逆向看看吧 XDDD。
沒手機也要下載 APK
直接把 APK 的 bundle id 貼到 androidapk 這個網站就可以下載了,bundle id 長得像 com.facebook.katana
。
jadx 反編譯工具
借一下官方的截圖,jadx 可以直接開啟 apk 檔,把 decompile 過的原始碼顯示出來;除了 gui 界面也有 command line 工具可以讓你直接轉存 source。
載下來解壓縮後有四個檔案:
. ├── jadx ├── jadx-gui ├── jadx-gui.bat └── jadx.bat
cd
進去目錄後執行 ./jadx-gui
,GUI 界面開啟照著操作,選擇你要解開的 apk 就會顯示 Java code 了,也可以選擇轉存,用你喜歡的 Editor 或 IDE 開起來。
讀讀讀讀讀 code
不像當初 Pokemon Go 被逆向 一樣,竟然連個混淆都沒做,X 社小工具解出來的原始碼裡,變數都被換成英文字母 abcde,不過想想我的目的就是拿到 API,就直接搜尋 http://
、https://
網址開頭的字串~~
Retrofit
然後就找到了這段:
public Retrofit a(as asVar) { return new Builder().baseUrl("https://容我隱藏一下.appspot.com/").addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).callbackExecutor(AsyncTask.THREAD_POOL_EXECUTOR).client(asVar).build(); }
看網址 Server 還是用 Google App Engine 架的 XD
Retrofit 是 Android 用的 HTTP 客戶端,雖然沒用過,不過對於 Retrofit 用 Decorator 標記各個 Endpoint 的寫法印象很深,Retrofit 首頁的範例就這樣寫:
public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user); }
接下來只要再找出各式 Decorator 就行啦!
API Endpoints
public interface a { ... ... @GET("schools") h<Map<String, j>> a(); @POST("login") h<f> a(@Body e eVar); @GET("users/{uid}/schedule") h<g> a(@Path("uid") String str, @Header("Authorization") String str2); ... ... }
上面是其中一段程式碼,看起來主要的 API Endpoint 都在這了。
接下來可以用 curl
或 Postman 來試打 API,從 GET 的 Endpoint 開始,照著 Login 流程做。不過打 schedule API 的時候卻發現重大問題:
我的課表根本就沒課啊!!
所以 schedule
只好當做不知道怎麽解了哈哈哈😂
RxJava
題外話一下,X 社小工具也用了當紅的 Reactive Programming,反編譯後的原始碼就看到一堆短短的 presenter 檔案。
其實要拿 API 也不需要反編譯
可以用 Wireshark 之類的封包擷取工具撈一下,不過還是看原始碼直接啦😅
感想
看來 ProGuard 一類的混淆工具還是有用的,變數、類別都被換掉,腦內理解搜尋速度至少慢了十倍啊,還沒辦法直接 Go to Definition…
本來想寫個免責聲明,不過敏感資訊都已經藏起來了,應該還好吧 XD 這篇只是個人純粹玩工具、讀讀 code 的心得而已,不要追殺我啊 😂😂😂