該項目的原因稍后再寫,想開發(fā)BiliBili的Android第三方客戶端總會有幾個必須要跨過的坎,我們第0步主要就是為了這些而做的準備唯灵。
后臺服務
已經很少有App能過脫離后臺服務而獨立運行钝鸽,即便一些單機游戲也需要通過網絡加載新的游戲關卡等,而我們做第三方App也同樣需要后臺服務的支持(除非只是想模擬UI唾那,而非真實的功能)访锻。
目前第三方客戶端獲取后臺服務主要通過兩種方式:
- 官方發(fā)布并維護一些開放API,供個人或其他團隊開發(fā)人員進行個性化的開發(fā)。目前該種方式也逐漸沒落了期犬,僅存豆瓣河哑、QQ等為數不多的幾個開放平臺仍在,目前BiliBili及許多大廠基本都已經關閉了個人開發(fā)者對第三方接口的申請龟虎×Ы鳎可能是維護開放API的成本要遠大于所帶來的引流的收獲,可能國內開發(fā)人員也沒有那么多時間去玩別家的開放API遣总,為了生活就已經筋疲力盡了...
- 通過了解官方API的驗簽方式睬罗,而使用規(guī)范的官方API進行調用。其實旭斥,這種方式跟撿到一張銀行卡容达,然后猜密碼差不多(不過還好沒有錯誤限制,可以一直試下去)垂券,不過因為簽名方式不像銀行密碼那么簡單就是6位整型數花盐,而是無限種的加密方式。不過還好菇爪,常規(guī)方式就那么幾種算芯,就好像銀行密碼要么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截取想要重現(xiàn)的請求(也可以通過Log獲取發(fā)送請求URL逸吵,一般會將在Log中打出網絡請求)
- 根據分析代碼夹攒,判斷所需在哪個so中
- 猜測(猜想 + 測試),驗證簽名方式胁塞,并通過實際請求驗證
詳細內容
一咏尝、反編譯apk
-
在BiliBili官網下載官方apk
![下載Android版BiliBili](https://github.com/HakuLess/ImageLib/blob/master/blog/apk%E4%B8%8B%E8%BD%BD%E9%80%89%E6%8B%A9.png?raw=true =200x200)
-
使用 apktool 和 dex2jar 反編譯apk文件压语。
apktool apktool d /Users/HaKu/Downloads/BiliPlayer3.apk -f ./d2j-dex2jar.sh /Users/HaKu/Downloads/app-debug.apk
![進行反編譯](https://github.com/HakuLess/ImageLib/blob/master/blog/apktool.png?raw=true =400x150)
-
使用 JD-GUI 和 IDA 分析代碼
![通過GUI查看代碼](https://github.com/HakuLess/ImageLib/blob/master/blog/gui.png?raw=true =600x300)
通過查找GUI可以看出關于appsecret部分B站APP并沒有直接寫入在java代碼中,而是在bili的so庫中编检,也算是對代碼的一種保護胎食,因此需要繼續(xù)下去使用IDA分析so庫的內容。![通過IDA查看匯編代碼](https://github.com/HakuLess/ImageLib/blob/master/blog/ida_biliso.jpeg?raw=true =600x300)
此處紅框包圍的代碼即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
隨便修改下參數發(fā)現(xiàn)返回為“api sign invalid”生百,證明該請求有sign驗證递雀。
-
通過更改參數 + 猜測簽名方式,請求驗證蚀浆,看是否被拒絕
經驗證發(fā)現(xiàn)缀程,簽名為上述第三種方式,將所有參數(包括變量名和值及=&符號)排序后加上appsecret(只有值)之后做md5市俊,得到返回結果即為所求sign值
完成
至此杨凑,已經完成了真正后臺服務的獲取,并可以通過官方的方式進行調用摆昧,也因為APP即便發(fā)新版也需要支持舊版的運行撩满,因此短期內不用擔心官方更換secret或者更換簽名的生成方式。最后绅你,這只是完成客戶端開發(fā)的第一步鹦牛,也算是其中的第一個難點。UI和業(yè)務邏輯等都不能屬于技術難點勇吊,本系列將著力于描述開發(fā)第三方BiliBili客戶端遇到的坑,當然個人開發(fā)不可能包含整個APP的功能窍仰,因此只會逐步實現(xiàn)相關功能汉规,目前僅完成直播首頁(沒有直播間)和新番查詢兩個功能,將繼續(xù)利用空閑時間進行開發(fā)驹吮,并采用些新技術针史,用于日常工作使用前的demo開發(fā)。
Android開發(fā)新手碟狞,若有錯誤請指出啄枕,謝謝~