咪咕视频m3u8地址解析及ddCalcu参数加密逆向
咪咕视频m3u8地址解析及ddCalcu参数加密逆向
概述
本文主要讲述咪咕视频m3u8地址的解析以及使用Wasm对视频的m3u8地址进行加密得到ddCalcu参数的方法。
本文代码已于2025.12.02更新,适用于咪咕视频在2025.11.24更新的加密算法。
使用视频ID获取未加密的视频URL
以视频https://www.miguvideo.com/p/detail/722208612为例,此处的722208612就是视频ID
在浏览器打开链接进行抓包,查找此视频ID,可以发现,通过接口:
https://webapi.miguvideo.com/gateway/playurl/v3/play/playurl?contId=722208612&rateType=3&xh265=true&chip=mgwww&channelId=0132_10010001005
可以获取到视频的m3u8地址,接口的参数contId指定视频ID,这里是722208612,rateType指定视频分辨率,2为标清540P,3为高清720P,4为超清1080P(但超清要登录)。
访问此接口需要使用GET方法,并设定以下请求头:
Appcode: miguvideo_default_www
Appid: miguvideo
Channel: H5
x-up-client-channel-id: 0132_10010001005
接口返回JSON,JSON的body->urlInfo->url键值就是视频的m3u8地址:
http://gslbmgspvod.miguvideo.com/depository_yqv/asset/zhengshi/1008/227/894/1008227894/media/1008227894_1058897415_56.mp4.m3u8?msisdn=20251202132919e1ed224a28844600b5d8e699750bfe61&mdspid=&spid=800033&netType=0&sid=1702626858&pid=2028597139×tamp=20251202132919&Channel_ID=0132_10010001005&ProgramID=722208612&ParentNodeID=-99&assertID=1702626858&client_ip=0.0.0.0&SecurityKey=20251202132919&promotionId=&mvid=1008227894&mcid=1005&mpid=130000161591&playurlVersion=ZQ-A1-8.11.2-RELEASE&userid=&jmhm=&videocodec=h264&appCode=miguvideo_www&bean=mgspwww&tid=www&conFee=0&puData=88adf86e0da2785fe8343dced9294f50
若直接访问获取到的m3u8地址并不能正常得到m3u8文件,需要对其进行加密最终得到加密后的m3u8地址:
http://gslbmgspvod.miguvideo.com/depository_yqv/asset/zhengshi/1008/227/894/1008227894/media/1008227894_1058897415_56.mp4.m3u8?msisdn=20251202132919e1ed224a28844600b5d8e699750bfe61&mdspid=&spid=800033&netType=0&sid=1702626858&pid=2028597139×tamp=20251202132919&Channel_ID=0132_10010001005&ProgramID=722208612&ParentNodeID=-99&assertID=1702626858&client_ip=0.0.0.0&SecurityKey=20251202132919&promotionId=&mvid=1008227894&mcid=1005&mpid=130000161591&playurlVersion=ZQ-A1-8.11.2-RELEASE&userid=&jmhm=&videocodec=h264&appCode=miguvideo_www&bean=mgspwww&tid=www&conFee=0&puData=88adf86e0da2785fe8343dced9294f50&ddCalcu=0858afaa4db9fa2896dee0cdda32473885ef_s002&sv=10011
加密后的URL主要是多了ddCalcu参数,接下来就要知道网站是如何进行加密的。
视频URL的加密方法
注意:以下图片截取于2025.06.16,由于此后加密方法更新,实际的代码和图片所示代码会有所出入,但大体的框架是差不多的。
既然ddCalcu是加密得到的参数,首先想到的是直接搜索这个关键词,发现在pcPlayer.js文件中能找到

ddCalcu所在的代码正是用于将此参数拼接会原来URL的代码,同时能看到下方有一段调试信息"wasm encrypt success!",说明这个参数很可能就是用wasm加密得到的。
打个断点调试,发现果真如此。
既然视频URL是使用wasm进行加密的,那么代码中应该就能找到用于加载wasm的函数。
代码中查找instantiateStreaming或instantiate,这两种方法都是用于加载wasm的,在每一处出现的地方打上断点调试就能找到wasm加载的位置,只要找到了加载wasm的地方,再按图索骥,一步步调试,应该就不难找到使用wasm进行加密的代码逻辑,或者也可以从最终得到ddCalcu的代码入手,一步步往上调试,也能找到加密逻辑。下图为加载wasm的代码:

如图所示,wasm文件的URL为https://www.miguvideo.com/mgs/player/prd/v_20251124155500_63c16e66/dist/mgprtcl.wasm,其中的20251124155500_63c16e66是一个版本号,可以从https://app-sc.miguvideo.com/common/v1/settings/H5_DetailPage返回的playerVersion值获取,而实例化wasm需要导入3个函数,函数签名及实现逻辑能在代码中轻松找到,详见下文的代码实现。
继续调试能找到用于获取导出wasm虚拟机内存的代码:

此处出现的N是wasm实例,d是wasm导出的一段线性内存,变量p和h就是映射到wasm虚拟机内存的整型数组,通过读写这些数组就能读写wasm虚拟机内存。
然后就到了核心加密代码了:

在核心代码的起始处打上断点逐行调试,就能理顺其加密逻辑。
对于核心代码中的_malloc, _CallInterface1, _CallInterface2等等以下划线开头的函数,其实都是wasm的导出函数,只不过是换了个名字而已。而stringToUTF8和UTF8ToString是js代码中定义的函数,前者用于将字符串写入wasm虚拟机内存的指定位置,后者用于将wasm虚拟机内存中指定位置的二进制码读出为字符串。
stringToUTF8的代码逻辑:

UTF8ToString的代码逻辑:

其实,这段核心加密代码并不复杂,它只做了以下几件事:
- 从待加密的URL中取出用于加密的参数
- 为这些参数申请足够的wasm虚拟机内存,同时预留用于返回加密参数ddCalcu的内存
- 使用stringToUTF8方法将这些参数写入刚刚申请得到的内存
- 执行一系列wasm导出的加密函数(就是那一堆_CallInterface)
- 使用UTF8ToString方法将加密得到的ddCalcu参数取出
- 将ddCalcu参数拼接到原URL就得到了最终的URL
注意:除了部分URL参数需要写入wasm虚拟机内存,还有一个字符串常量的加密因子J6XuCcCtPfVdSv6YUls4Jg==也要写入,这是在逐行调试加密代码时发现的,其生成方式不用管,因为这个值是固定的,但在加密方法更新后会改变,可能是用于在wasm代码中进行加密的盐值。
具体实现见下文。
代码实现
具体代码实现已迁移至github仓库:https://github.com/jiarandiana0307/migu-video-crack

浙公网安备 33010602011771号