声明:案例分析仅供学习交流使用,勿用于任何非法用途。如学习者进一步逆向并对版权方造成损失,请自行承担法律后果,本人概不负责。
简介
我们日常见到的接口多半是【http:www.xxx.com/aa=1&bb=2&cc=aaa】形式,该形式的接口很容易被别有用心的人篡改、尝试参数。为了防止此类情况发生,很多开发者会用地址中的参数、常量等生成一个字段来验证地址的合法性。本次逆向的直播apk接口就拥有校验字段,并且生成规则放置在了so文件中。
目标
逆向apk接口校验字段的生成规则,自由拿取接口数据。
逆向流程
突破口——找到目的接口
假设我们要拿到该软件播放节目的相关信息,就要从播放逻辑与接口入手。播放一个节目,并抓取相关信息,可以得到两个比较在意的接口:
1.该接口请求参数为直播房间号等参数,响应为与此房间相关的详细信息。
2.这个接口响应便是节目的播放地址。
播放地址由1中响应内容里的rtmp_url字段和rtmp_multi_bitrate字段可拼接而成。
研究接口参数
由播放地址的拼接方式可知破解的关键在于第一次请求。反编译客户端进行分析追寻第一次请求相关线索。可从下面两个函数发现端倪:
tv.douyu.control.api.APIHelper.a(Context context, String str, String str2, DefaultCallback defaultCallback)
tv.douyu.misc.util.EncryptionUtil.a(String str, List<ParameterBean> list, List<ParameterBean> list2, boolean z)
逐一比对出第一次请求用到的参数如下,其中auth字段就是需要逆向的“校验字段”:
room:房间Id。
aid:可以用固定值android1。
client_sys:可以用固定值android。
ne:可以用固定值1。
support_pwd:可以用固定值1。
time:本地时间。
auth:由Native函数native_makeUrl(Context context, String str, String[] strArr, String[] strArr2, String[] strArr3, String[] strArr4, int i, int i2)生成的加密字串。
逆向so文件
由Native函数入口并配合ida进行分析,由【native_makeUrl】函数名称与参数信息追寻到疑似目标函数【sub_DF9C】:
动态调试此函数:
由以上过程读入了Java层传入的参数。
由sub_3D49(int a1, int a2, int a3, int a4, int a5, int *a6, int a7, int a8)中的sub_3D39(int a1)生成密匙:
显然auth字段“64875c22a567f41208a470f74a19caeb”由“room/431972?aid=android1&client_sys=android&ne=1&support_pwd=1&time=1470038940”做MD5加密后生成。
流程梳理
软件的播放流程如图:
举例Api拼接auth的方式为:
room/XXX?aid=android1&client_sys=android&ne=1&support_pwd=1&time=1470038940&auth=YYY
XXX:房间Id。
YYY:MD5(room/XXX?aid=android1&client_sys=android&ne=1&support_pwd=1&time=1470038940)