引言
最近聽說親戚家的小孩生病,但是經常挂不上号,每次都要找黃牛幫忙挂号,黃牛每次都要收300塊錢,是以我就想幫幫他們,是以寫了一個挂号工具,通過它可以更快的完成『查票->挂号->付款』的操作流。本文記錄了制作該工具的思路和使用的工具。
開發流程
因為這個醫院有一個手機APP,預約挂号都是在這個APP上進行的,是以我就從這個APP入手,開始了我的破解曆程。
抓包
最初,本着試一試的态度,我先是從抓包入手,打算看一看這個挂号APP的請求内容。在這個過程中使用到了Mac平台的抓包工具
Charles,使用流程如下:
- 打開Charles的HTTP代理(預設會使用8888端口)
- 将手機與電腦連接配接到同一個網絡中
- 配置手機上的WIFI代理,填入Mac的IP和Charles的代理端口
配置好抓包工具後,發現了第一個問題:該APP和伺服器是通過HTTPS通訊的,Charles無法解析請求内容。于是我進行了如下操作:
- 打開Charles的HTTPS代理功能
- 在Charles的SSL Proxy Setting中設定需要HTTPS代理的host:port,這裡我填了
*:443
- 将Charles的CA憑證下載下傳到手機中
- 在手機設定中添加信任Charles的證書
本來以為這樣就能在Charles中看到HTTPS封包内容,但是這裡又遇到了一個坑,就是Google在Android6.0之後(不包括6.0)更新了對使用者級CA憑證的預設信任政策,即Android6.0之後,除非APP中特别聲明該APP信任使用者級證書,否則,隻會信任系統級證書。更詳細的說明可以從Android的
開發者文檔中檢視。
解決這個問題有兩個方案:
- 找一台Android6.0的手機進行抓包測試(我選擇了這個方案,最簡單)
- 解包APP,在res中添加網絡安全設定,使這個APP信任Charles的證書,然後重新打包(感覺超麻煩,還不一定能成功)
至此,我已經能在Charles中檢視該APP的所有請求内容了,分析各種操作的請求封包後,我發現該APP是通過HTTP請求中的一些Header資料來做身份驗證的。其中,大部分的資料都是不變的或者很容易推算的,隻有
x-bchapi-signature
是每次請求都不一樣,隻從抓包的資訊中無法推斷該資料是什麼。為了搞清楚
x-bchapi-signature
是什麼,我對該APP進行了反編譯。
反編譯
反編譯部分,初期我使用到了如下工具:
- ApkTool : 通過它可以可以解出Apk檔案中的靜态資源,比如xml檔案,圖檔等。
- dex2jar : 将dex檔案(即apk檔案中的java class資料)轉換成jar檔案。
- JD-GUI : 可以直接檢視jar檔案的内容。
這一階段的操作流程如下:
- 使用ApkTool拆解出來所有靜态資源和AndroidManifest.xml,拆解出來的靜态資源,會在之後分析代碼時用到,因為Android中通常會将一些恒量存在
中。此外,我還看了一下裡面确實沒有之前抓包時提到的網絡安全配置,這也印證了之前在Android6.0以上手機HTTPS不好用的推斷。/res/values/*.xml
-
apktool d xxx.apk
-
- 使用rar解壓工具解壓了apk,裡面有一個classes.dex檔案
- 使用dex2jar反編譯classes.dex,最終得到classes-dex2jar.jar
-
sh d2j-dex2jar.sh classes.dex
-
- 使用JD-GUI打開classes-dex2jar.jar
打開
classes-dex2jar.jar
後,發現裡面沒有什麼代碼,隻顯示了一些奇虎360的類,是以我推測他可能使用了一些代碼混淆技術,為了得到真正的源碼,我随後對apk進行了一些反混淆操作。

反混淆
反混淆部分,我使用到了如下工具:
- FDex2 : 通過Hook ClassLoader的loadClass方法,反射調用getDex方法取得Dex(com.android.dex.Dex類對象),在将裡面的dex導出。
- VirtualXposed : 無需root手機即可使用Xposed架構。
上述的兩個工具是配合使用的,Xposed是一個代碼鈎子架構,它需要root才能正常使用,而這裡我們用到的VirtualXposed是一個虛拟的Xposed,它可以在不root的手機上運作Xposed架構。
FDex2是一個運作在Xposed架構下的插件,通過他來得到所有apk代碼。
這一階段的操作操作流程如下:
- 手機安裝VirtualXposed
- 在VirtualXposed中安裝FDex2以及要破解的apk
- 啟動FDex2并設定讓其分析我們要破解apk
- 打開要破解的apk,并将挂号的完整流程都走一遍,這樣才能分析到完整的挂号代碼
- 将FDex2分析得到的dex檔案下載下傳到電腦上,這一步我用到了一個檔案資料總管
- 通過反編譯時使用的dex2jar解析dex檔案,最終得到jar檔案
- 使用JD-GUI打開最終生成的jar檔案
至此,我已經看到了該apk下的所有核心代碼,很快我就找到了
x-bchapi-signature
的構造方式,它是通過請求的url,請求的參數,目前時間等整合加密所得。随後,我馬上通過
postman構造了一個請求,并且成功發送了。
搶票工具的開發
有了反混淆後得到的代碼,剩下的工作就很簡單并且重複了,它基本都是遵循如下流程:
- 打開Charles,并在手機上點選想要破解的操作
- 在Charles中找到該操作的請求内容
- 在源碼中搜尋該操作傳輸的資料含義
- 在Java中使用HTTP Client構造相同的請求
文章說明
更多有價值的文章均收錄于
貝貝貓的文章目錄版權聲明: 本部落格所有文章除特别聲明外,均采用 BY-NC-SA 許可協定。轉載請注明出處!
創作聲明: 本文基于下列所有參考内容進行創作,其中可能涉及複制、修改或者轉換,圖檔均來自網絡,如有侵權請聯系我,我會第一時間進行删除。
參考内容
[1]
Mac下用Charles實作Android http和https抓包[2]
反編譯Android APK詳細操作指南[3]
Android APK脫殼