← 全部文章
逆向抓包uniapp

抓包分析视频 App 接口:uniapp 应用逆向记录

约 5 分钟SIKUAI

脱敏说明:目标站点信息已脱敏,仅保留分析方法与流程。

此文章仅作为本人思路处理记录,不做任何其他用途

事情起因

在某天下午,一个好友给我发来两个涩涩软件,问我能不能破解,对于这种伤身的事情,我自然是义正言辞的回绝了,但是出于对软件本身的安全防护,以及整个流程的处理的好奇,我安装了这两个软件/doge。

开始整活

#第一步 MT拆包看一眼结构,好方便下手,发现是uniapp做的(其实特征还是挺明显的),软件目录有dc、io等文件夹,assets中有几个uni开头的js,以及.......看图\

[截图略——原文以 base64 内嵌,此处省略]
[截图略——原文以 base64 内嵌,此处省略]

uniapp做的软件有好处也有坏处,vue开发,一次构建多端使用,非常的方便 ,但是坏处也很明显,不能很好的防抓包,软件主要逻辑全在js中 ,虽然逆向完整的代码比较困难,但是修改其中的判断逻辑(破解会员判断),获取软件请求接口和逻辑(和这次做的差不多)。
#第二步 既然是uniapp那指定没有防抓包,直接开黄鸟抓包,抓到几个接口

获取列表(A1页全部)
/page/1/cid/2/tag_id/0/area_id/0/orderCode/lastTime/search/0
获取列表(B1页全部)
/page/1/cid/3/tag_id/0/area_id/0/orderCode/lastTime/search/0
获取列表(B1页“XX”标签)
/page/1/cid/3/tag_id/41/area_id/0/orderCode/lastTime/search/0
获取列表(其他1页全部)
/page/1/cid/4/tag_id/0/area_id/0/orderCode/lastTime/search/0
(其他2页)
/page/2/cid/4/tag_id/41/area_id/0/orderCode/lastTime/search/0
视频评论获取(post)
/commentList/appkey/xxxxxxx
数据
videoId=1922&lastId=0&limit=8
搜索视频(post)
/searchVideo/appkey/xxxxxxxxx
uid=0&did=xxxxxxxx&key=xxxxxxxxxxxx&page=1

抓完几个不同特征的我们来分析一下
首先是获取列表,可以看到AB的cid变了,其他没变,很明显cid控制分区,同理tag_id控制标签,page控制页数。
至于搜索视频此处还有一个限制,每个did每天仅可3次,后来读取原包js看了一下生成逻辑,后端并没有进行什么校验。(乐,下面调用提到了)
#第三步 既然抓到接口了,那我们肯定要测试一下,使用黄鸟抓包,可以直接导出请求,导到电脑使用postman测试接口,确定headers需要带什么参数就可以开始调用接口了。
此处使用python简单写了个调用,对接上QQ机器人(绝不是我要看,只是朋友需要),由于机器人还是比较麻烦,索性直接用uniapp写一个。

#第四步 开始复刻
原包是轮主页播图+视频列表+视频分区及类别,还有搜索,充值,评论区,个人主页......等乱七八糟的页面,出于[=我们自用=]锻炼自己的uniapp写简单应用的能力,我们只需要写【主页】【播放页】【搜索页】即可,因为平台只有安卓,所以不用操心h5等其他平台不兼容m3u8的播放,此处我们直接用video播放即可,视频m3u8播放使用potplay测试,没问题直接按逻辑写就行,通过接口获取视频id,通过id获取播放链接,简单解析一下响应。

<template>
	<view class="view">
		<!-- 此页面为播放页,即接收id页面 -->
		<video class="video" :src='video_src'></video>
		<view class="tit1">
			<view class="title">{{title}}</view>
		</view>
		<!-- 原接口这里使用了富文本,带有span等标签,所以此处使用rich-text -->
		<rich-text :nodes="info" class="info">{{info}}</rich-text>
<!-- </view> -->
	</view>
</template>

<script>
	export default {
		data() {
			return {
				id: '错误打开方式',
				title: '错误打开方式',
				info: '错误打开方式',
				video_src: "",
			}
		},

		// navigate.vue页面接受参数
		onShow: function(option) {
			this.id = (option.id);
			this.getVideoSrc()
		},
		methods: {
			getVideoSrc() {
			此处不多透露,只记录传参方法
			}

		}

	}
}
</script>

获取id页面

<template>
	<view>
		<view title="搜索" type="line">
		此处使用了search bar,调用记得安装
			<uni-search-bar @confirm="search" :focus="true" v-model="searchValue"></uni-search-bar>
		</view>
		<view class="List">
			<view v-for="item in video_list" :key="item.id" class="video">
			通过navigator带参跳转
				<navigator :url="'/pages/webview/webview?id='+item.id">
					<image :src="item.thumbnail"></image>
					<rich-text :nodes="item.title" class="title">{{title}}</rich-text>
					<view class="click">
						点赞:{{item.good}}
						播放:{{item.click}}
					</view>
				</navigator>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				searchValue: 'XX',
				video_list: [],
				title: '未获取到数据',
				info: '未获取到数据',
			}
		},
		onShow() {
			this.search()
		},
		methods: {
			search(res) {
			此处为搜索页面方法,调用时间戳作为did解除搜索限制(其实是没写random),
			},
		}
	}
</script>

此处的did使用时间戳的接口直接获取不重样
顺带提一句,兄弟父子页面传参还是得注意,老是忘

结束

终于是搞完了,除了UI有些闹心以为,软件勉强能看,趁接口还没失效,又赶了一个python脚本,批量下载服务器上的视频,for遍历获取视频id,ffmpeg下载m3u8,单线程的原因(主要是怕ban ip)仅作为测试,资源仅作为测试,并没有实际拿到手。
文章记录到这里,接近尾声,很高兴你能看到这里,亦或者是我作为思路的备份,将它记录下来。此文章仅作为技术探讨,一个小菜鸡的求学之路,实际操作,请遵守当地的法律法规,对违法爬虫说不,对黄赌毒说不!