該項目的原因稍后再寫,想開發BiliBili的Android第三方客戶端總會有幾個必須要跨過的坎,我們第0步主要就是為了這些而做的準備。
后臺服務
已經很少有App能過脫離后臺服務而獨立運行,即便一些單機游戲也需要通過網絡加載新的游戲關卡等,而我們做第三方App也同樣需要后臺服務的支持(除非只是想模擬UI,而非真實的功能)。
目前第三方客戶端獲取后臺服務主要通過兩種方式:
- 官方發布并維護一些開放API,供個人或其他團隊開發人員進行個性化的開發。目前該種方式也逐漸沒落了,僅存豆瓣、QQ等為數不多的幾個開放平臺仍在,目前BiliBili及許多大廠基本都已經關閉了個人開發者對第三方接口的申請。可能是維護開放API的成本要遠大于所帶來的引流的收獲,可能國內開發人員也沒有那么多時間去玩別家的開放API,為了生活就已經筋疲力盡了...
- 通過了解官方API的驗簽方式,而使用規范的官方API進行調用。其實,這種方式跟撿到一張銀行卡,然后猜密碼差不多(不過還好沒有錯誤限制,可以一直試下去),不過因為簽名方式不像銀行密碼那么簡單就是6位整型數,而是無限種的加密方式。不過還好,常規方式就那么幾種,就好像銀行密碼要么123456,要么6個0一樣,猜個幾次就能夠猜的出來。
para + 排序 + appsecret + md5 拼sign
原來key1=value1&key2=value2&key3=value3,拼裝后
- value1value2value3
- key1value1key2value2key3value3
- key1=value1&key2=value2&key3=value3
再加上關鍵key,私鑰:appsecret=ea85624dfcf12d7cc7b2b3a94fac1f2c
然后一起md5,得到sign,服務端驗證sign是否一致,不一致的請求攔截掉,防止第三方隨意調用。
工具
Charles
使用charles進行截包,分析具體按鈕的請求及返回json數據
dex2jar
用于反編譯apk提取jar包,查看java源代碼(可能被混淆)
JD-GUI luyten
用于查看反編譯后的java代碼
apktool
主要用于獲取資源文件,如查看布局、獲得資源圖片等
IDA
主要用于反匯編.so文件
工作流程
- 使用apktool反編譯apk文件,獲取資源文件
- 使用dex2jar反編譯apk文件,獲取Java代碼(可能被混淆)
- 使用Charles截取想要重現的請求(也可以通過Log獲取發送請求URL,一般會將在Log中打出網絡請求)
- 根據分析代碼,判斷所需在哪個so中
- 猜測(猜想 + 測試),驗證簽名方式,并通過實際請求驗證
詳細內容
一、反編譯apk
-
在BiliBili官網下載官方apk

-
使用 apktool 和 dex2jar 反編譯apk文件。
apktool apktool d /Users/HaKu/Downloads/BiliPlayer3.apk -f ./d2j-dex2jar.sh /Users/HaKu/Downloads/app-debug.apk

-
使用 JD-GUI 和 IDA 分析代碼

通過查找GUI可以看出關于appsecret部分B站APP并沒有直接寫入在java代碼中,而是在bili的so庫中,也算是對代碼的一種保護,因此需要繼續下去使用IDA分析so庫的內容。
此處紅框包圍的代碼即APP調用so方法獲取appsecret的地方,這里把具體內容隱藏,有興趣的朋友可以直接自己操作一遍獲取內容。
二、通過測試確定簽名方式
-
建立Demo項目,通過截包確定需要簽名的請求
挑選一個需要簽名的請求,本例使用直播頁的請求:具體URL為
http://live.bilibili.com/AppIndex/home?_device=android&_hwid=51e96f5f2f54d5f9&_ulv=10000&access_key=563d6046f06289cbdcb472601ce5a761&appkey=c1b107428d337928&build=410000&platform=android&scale=xxhdpi&sign=fbdcfe141853f7e2c84c4d401f6a8758
隨便修改下參數發現返回為“api sign invalid”,證明該請求有sign驗證。
-
通過更改參數 + 猜測簽名方式,請求驗證,看是否被拒絕
經驗證發現,簽名為上述第三種方式,將所有參數(包括變量名和值及=&符號)排序后加上appsecret(只有值)之后做md5,得到返回結果即為所求sign值
完成
至此,已經完成了真正后臺服務的獲取,并可以通過官方的方式進行調用,也因為APP即便發新版也需要支持舊版的運行,因此短期內不用擔心官方更換secret或者更換簽名的生成方式。最后,這只是完成客戶端開發的第一步,也算是其中的第一個難點。UI和業務邏輯等都不能屬于技術難點,本系列將著力于描述開發第三方BiliBili客戶端遇到的坑,當然個人開發不可能包含整個APP的功能,因此只會逐步實現相關功能,目前僅完成直播首頁(沒有直播間)和新番查詢兩個功能,將繼續利用空閑時間進行開發,并采用些新技術,用于日常工作使用前的demo開發。
Android開發新手,若有錯誤請指出,謝謝~