BiliBili Android第三方——第0步

该项目的原因稍后再写,想开发BiliBili的Android第三方客户端总会有几个必须要跨过的坎,我们第0步主要就是为了这些而做的准备。

后台服务

已经很少有App能过脱离后台服务而独立运行,即便一些单机游戏也需要通过网络加载新的游戏关卡等,而我们做第三方App也同样需要后台服务的支持(除非只是想模拟UI,而非真实的功能)。

目前第三方客户端获取后台服务主要通过两种方式:

  1. 官方发布并维护一些开放API,供个人或其他团队开发人员进行个性化的开发。目前该种方式也逐渐没落了,仅存豆瓣、QQ等为数不多的几个开放平台仍在,目前BiliBili及许多大厂基本都已经关闭了个人开发者对第三方接口的申请。可能是维护开放API的成本要远大于所带来的引流的收获,可能国内开发人员也没有那么多时间去玩别家的开放API,为了生活就已经筋疲力尽了...
  2. 通过了解官方API的验签方式,而使用规范的官方API进行调用。其实,这种方式跟捡到一张银行卡,然后猜密码差不多(不过还好没有错误限制,可以一直试下去),不过因为签名方式不像银行密码那么简单就是6位整型数,而是无限种的加密方式。不过还好,常规方式就那么几种,就好像银行密码要么123456,要么6个0一样,猜个几次就能够猜的出来。

para + 排序 + appsecret + md5 拼sign

原来key1=value1&key2=value2&key3=value3,拼装后

  1. value1value2value3
  2. key1value1key2value2key3value3
  3. 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文件

工作流程

  1. 使用apktool反编译apk文件,获取资源文件
  2. 使用dex2jar反编译apk文件,获取Java代码(可能被混淆)
  3. 使用Charles截取想要重现的请求(也可以通过Log获取发送请求URL,一般会将在Log中打出网络请求)
  4. 根据分析代码,判断所需在哪个so中
  5. 猜测(猜想 + 测试),验证签名方式,并通过实际请求验证

详细内容

一、反编译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库中,也算是对代码的一种保护,因此需要继续下去使用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
    

    随便修改下参数发现返回为“api sign invalid”,证明该请求有sign验证。

  • 通过更改参数 + 猜测签名方式,请求验证,看是否被拒绝

    经验证发现,签名为上述第三种方式,将所有参数(包括变量名和值及=&符号)排序后加上appsecret(只有值)之后做md5,得到返回结果即为所求sign值


完成

至此,已经完成了真正后台服务的获取,并可以通过官方的方式进行调用,也因为APP即便发新版也需要支持旧版的运行,因此短期内不用担心官方更换secret或者更换签名的生成方式。最后,这只是完成客户端开发的第一步,也算是其中的第一个难点。UI和业务逻辑等都不能属于技术难点,本系列将着力于描述开发第三方BiliBili客户端遇到的坑,当然个人开发不可能包含整个APP的功能,因此只会逐步实现相关功能,目前仅完成直播首页(没有直播间)和新番查询两个功能,将继续利用空闲时间进行开发,并采用些新技术,用于日常工作使用前的demo开发。


Android开发新手,若有错误请指出,谢谢~

你可能感兴趣的:(BiliBili Android第三方——第0步)