天天看點

自制北京某醫院挂号工具

引言

最近聽說親戚家的小孩生病,但是經常挂不上号,每次都要找黃牛幫忙挂号,黃牛每次都要收300塊錢,是以我就想幫幫他們,是以寫了一個挂号工具,通過它可以更快的完成『查票->挂号->付款』的操作流。本文記錄了制作該工具的思路和使用的工具。

開發流程

因為這個醫院有一個手機APP,預約挂号都是在這個APP上進行的,是以我就從這個APP入手,開始了我的破解曆程。

抓包

最初,本着試一試的态度,我先是從抓包入手,打算看一看這個挂号APP的請求内容。在這個過程中使用到了Mac平台的抓包工具

Charles

,使用流程如下:

  1. 打開Charles的HTTP代理(預設會使用8888端口)
  2. 将手機與電腦連接配接到同一個網絡中
  3. 配置手機上的WIFI代理,填入Mac的IP和Charles的代理端口

配置好抓包工具後,發現了第一個問題:該APP和伺服器是通過HTTPS通訊的,Charles無法解析請求内容。于是我進行了如下操作:

  1. 打開Charles的HTTPS代理功能
  2. 在Charles的SSL Proxy Setting中設定需要HTTPS代理的host:port,這裡我填了

    *:443

  3. 将Charles的CA憑證下載下傳到手機中
  4. 在手機設定中添加信任Charles的證書

本來以為這樣就能在Charles中看到HTTPS封包内容,但是這裡又遇到了一個坑,就是Google在Android6.0之後(不包括6.0)更新了對使用者級CA憑證的預設信任政策,即Android6.0之後,除非APP中特别聲明該APP信任使用者級證書,否則,隻會信任系統級證書。更詳細的說明可以從Android的

開發者文檔

中檢視。

解決這個問題有兩個方案:

  1. 找一台Android6.0的手機進行抓包測試(我選擇了這個方案,最簡單)
  2. 解包APP,在res中添加網絡安全設定,使這個APP信任Charles的證書,然後重新打包(感覺超麻煩,還不一定能成功)

至此,我已經能在Charles中檢視該APP的所有請求内容了,分析各種操作的請求封包後,我發現該APP是通過HTTP請求中的一些Header資料來做身份驗證的。其中,大部分的資料都是不變的或者很容易推算的,隻有

x-bchapi-signature

是每次請求都不一樣,隻從抓包的資訊中無法推斷該資料是什麼。為了搞清楚

x-bchapi-signature

是什麼,我對該APP進行了反編譯。

反編譯

反編譯部分,初期我使用到了如下工具:

  1. ApkTool : 通過它可以可以解出Apk檔案中的靜态資源,比如xml檔案,圖檔等。
  2. dex2jar : 将dex檔案(即apk檔案中的java class資料)轉換成jar檔案。
  3. JD-GUI : 可以直接檢視jar檔案的内容。

這一階段的操作流程如下:

  1. 使用ApkTool拆解出來所有靜态資源和AndroidManifest.xml,拆解出來的靜态資源,會在之後分析代碼時用到,因為Android中通常會将一些恒量存在

    /res/values/*.xml

    中。此外,我還看了一下裡面确實沒有之前抓包時提到的網絡安全配置,這也印證了之前在Android6.0以上手機HTTPS不好用的推斷。
    • apktool d xxx.apk

  2. 使用rar解壓工具解壓了apk,裡面有一個classes.dex檔案
  3. 使用dex2jar反編譯classes.dex,最終得到classes-dex2jar.jar
    • sh d2j-dex2jar.sh classes.dex

  4. 使用JD-GUI打開classes-dex2jar.jar

打開

classes-dex2jar.jar

後,發現裡面沒有什麼代碼,隻顯示了一些奇虎360的類,是以我推測他可能使用了一些代碼混淆技術,為了得到真正的源碼,我随後對apk進行了一些反混淆操作。

自制北京某醫院挂号工具

反混淆

反混淆部分,我使用到了如下工具:

  1. FDex2 : 通過Hook ClassLoader的loadClass方法,反射調用getDex方法取得Dex(com.android.dex.Dex類對象),在将裡面的dex導出。
  2. VirtualXposed : 無需root手機即可使用Xposed架構。

上述的兩個工具是配合使用的,Xposed是一個代碼鈎子架構,它需要root才能正常使用,而這裡我們用到的VirtualXposed是一個虛拟的Xposed,它可以在不root的手機上運作Xposed架構。

FDex2是一個運作在Xposed架構下的插件,通過他來得到所有apk代碼。

這一階段的操作操作流程如下:

  1. 手機安裝VirtualXposed
  2. 在VirtualXposed中安裝FDex2以及要破解的apk
  3. 啟動FDex2并設定讓其分析我們要破解apk
  4. 打開要破解的apk,并将挂号的完整流程都走一遍,這樣才能分析到完整的挂号代碼
  5. 将FDex2分析得到的dex檔案下載下傳到電腦上,這一步我用到了一個檔案資料總管
  6. 通過反編譯時使用的dex2jar解析dex檔案,最終得到jar檔案
  7. 使用JD-GUI打開最終生成的jar檔案

至此,我已經看到了該apk下的所有核心代碼,很快我就找到了

x-bchapi-signature

的構造方式,它是通過請求的url,請求的參數,目前時間等整合加密所得。随後,我馬上通過

postman

構造了一個請求,并且成功發送了。

搶票工具的開發

有了反混淆後得到的代碼,剩下的工作就很簡單并且重複了,它基本都是遵循如下流程:

  1. 打開Charles,并在手機上點選想要破解的操作
  2. 在Charles中找到該操作的請求内容
  3. 在源碼中搜尋該操作傳輸的資料含義
  4. 在Java中使用HTTP Client構造相同的請求

文章說明

更多有價值的文章均收錄于

貝貝貓的文章目錄
自制北京某醫院挂号工具

版權聲明: 本部落格所有文章除特别聲明外,均采用 BY-NC-SA 許可協定。轉載請注明出處!

創作聲明: 本文基于下列所有參考内容進行創作,其中可能涉及複制、修改或者轉換,圖檔均來自網絡,如有侵權請聯系我,我會第一時間進行删除。

參考内容

[1]

Mac下用Charles實作Android http和https抓包

[2]

反編譯Android APK詳細操作指南

[3]

Android APK脫殼