你幹嘛沒事要來逆向工程啦

就是因為沒事啊。呃不對,其實以前就有聽說過 Android 逆向工具很成熟,不過自從換 iPhone 後就沒怎麼關注 Android 發展了,一直沒機會玩到。

昨天下午剛好就在臉書刷到一款課表 App,就簡稱為 「X 社小工具」好了,可以幫你匯入學校的課表,支援多個學校。看了看截圖,感覺是在手機端輸入校務系統登入帳密達成,X 社小工具會幫你抓下來,只是不知道後面 API 怎麽跑(誰知道)。秉持著好奇的心,就讓我來逆向看看吧 XDDD。

沒手機也要下載 APK

直接把 APK 的 bundle id 貼到 androidapk 這個網站就可以下載了,bundle id 長得像 com.facebook.katana

jadx 反編譯工具

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 都在這了。

接下來可以用 curlPostman 來試打 API,從 GET 的 Endpoint 開始,照著 Login 流程做。不過打 schedule API 的時候卻發現重大問題:

我的課表根本就沒課啊!!

所以 schedule 只好當做不知道怎麽解了哈哈哈😂

RxJava

題外話一下,X 社小工具也用了當紅的 Reactive Programming,反編譯後的原始碼就看到一堆短短的 presenter 檔案。

其實要拿 API 也不需要反編譯

可以用 Wireshark 之類的封包擷取工具撈一下,不過還是看原始碼直接啦😅

感想

看來 ProGuard 一類的混淆工具還是有用的,變數、類別都被換掉,腦內理解搜尋速度至少慢了十倍啊,還沒辦法直接 Go to Definition...

本來想寫個免責聲明,不過敏感資訊都已經藏起來了,應該還好吧 XD 這篇只是個人純粹玩工具、讀讀 code 的心得而已,不要追殺我啊 😂😂😂