郑重声明:本文所涉及的所有内容,纯粹以技术研究和学习交流为目的,绝不可用于任何商业用途、侵权行为或违反法律法规及平台规定的活动。请读者严格遵守所在国家和地区的法律法规,以及相关平台的使用条款,切勿将文中内容付诸实际操作。对于因不当使用本文内容而导致的任何法律责任和后果,作者及本平台概不承担。
一、配置
- 手机:google pixel6 定制系统
- 电脑:windows 系统
- 手机端工具:frida、SocksDroid
- 电脑端工具:Charles、jadx、WebStorm
二、电脑 <-> 手机 apk 迁移
大概是水平不够的原因当时在浏览器我并没有找到该短视频平台对应的apk,只能在手机上安装APKPuxe在里面下载了该软件再进行导出到电脑端。
adb操作
从电脑安装apk到手机
adb install xxx.apk
从手机导出apk到电脑
adb shell
dumpsys window | grep mCurrentFocus (获取手机当前运行APP的包名)
pm path com.xxx.xxx (查询出的包名获取apk文件名)
exit (退出adb shell)
adb pull /data/app/com.XXX==/base.apk xxx(windows保存apk路径)
三、抓包--媒体流传输逻辑
- 随意点开一个视频 会出现很多包 我们需要的包就在里面很好找
- 协议: https
- 域名:+ //api2.pxaxlxt.com
- 链接:+ /apis/8000/500007/xxx/xxxDetailNew
- 多点开几个不同的视频 多次抓包来确定需要还原的参数
- 通过分析发现除了我们一看便知道的参数比如 theater_id、timestamp
- 需要我们还原的只有sign一个 剩下的要么是一看便知的参数、要么就是手机、用户、语言等等一系列相关的定值参数
四、源码中查找蛛丝马迹
- 将上面我们导到电脑上apk的包使用jadx进行反编译
- 在jadx中进行搜索, 可以搜索链接(部分就行)、可以搜索参数名、常用系统函数、常用加密方法名称等。
- 搜索sign 我们一共找到了21个结果 就可以逐一点进去稍微看一下Java代码可以优先看与我们需要研究的apk包名一致的结果
图一:
- 通过查看我发现了一个可能是我们需要的函数 但是这只是猜测 如何确认呢?这就需要我们的神器frida去进行hook一下
图二:
图三: 注入hook代码之后会发现以下几种现象:
-
静止状态下 会有打印输出
-
随意点开一个短剧会有输出打印 而且不止一个
-
点击搜索会有输出打印
4 甚至滚动页面也会有输出打印
所以我们可以得出结论:无论是搜索还是媒体流传输都会经过这个函数,输出打印这么多,我们应该如何去确定哪一个是搜索的,哪一个是媒体流的呢?这时候就需要再次配合我们的抓包工具Charles(随意抓包工具都可以),你点一个短剧或者是点击搜索框都会给你返回不同的接口,接口中的sign值的不同,我们就可以确定不同的hook返回结果!
图四: 这种情况我们就找到了媒体流的sign值是如何确定的了
分析图二 我们hook的函数的返回值就是我们需要的sign值(md5) 但是需要两次md5 第一次是将str2进行md5 第二次是将str2返回的md5值进行一个拼接后再次进行md5的转换 这个时候我们就要去hook这个md5函数 去确定传入的str2是什么东西
图五: (还是通过Charles来确定哪一组是我们想要的数据) 经过多次的对比发现我们的str2的变化的值只有两个 一个是短剧的id一个是时间戳,短剧的id我们可以先随意点击一个 在Charles返回的包中会有短剧id(后面搜索会说如何获取根据短剧名获取短剧id)
通过分析图二我们发现得到的第一个md5的值加上appid以及一串定值再次进行md5就得到了我们的最终的sign的值
最终我们发起请求需要的传入参数只有短剧id、时间戳、sign值发起请求就可以得到集数、链接(只有免费观看的部分)、每集的名字等一系列参数。
图六:
至此我们的媒体流传输的研究就完成了!!下面进行搜索的思路描述
与媒体流一致 同样的方式 去点击一下搜索框会得到一个接口的sign值 hook的返回值去进行搜索来确定参数
最终发现只需要传入剧名以及时间戳就可以得到第一个md5参数
相同的方法可以得到第二个md5(sign)的值
发起请求我们只需要传入 时间戳、剧名、sign就可以得到结果。
可能遇到的问题:
1 我们得到第一个sign值时需要传入一个时间戳、发起请求时也需要传入一个时间戳,这两个时间戳是同一个时间戳!
2 接口比较杂且乱,不要找错接口,细心的去对照!
至此全部结束
希望各路大佬进行指点,下次写作一定会注意,感谢各位的观看!
下篇会讲述国内xx牛的登录协议!