脱敏说明:目标站点信息已脱敏,仅保留分析方法与流程。
此文章仅作为本人思路处理记录,不做任何其他用途
事情起因
在某天下午,一个好友给我发来两个涩涩软件,问我能不能破解,对于这种伤身的事情,我自然是义正言辞的回绝了,但是出于对软件本身的安全防护,以及整个流程的处理的好奇,我安装了这两个软件/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)仅作为测试,资源仅作为测试,并没有实际拿到手。
文章记录到这里,接近尾声,很高兴你能看到这里,亦或者是我作为思路的备份,将它记录下来。此文章仅作为技术探讨,一个小菜鸡的求学之路,实际操作,请遵守当地的法律法规,对违法爬虫说不,对黄赌毒说不!