楼主逆向新手来着, 有些地方处理逻辑可能有点不妥, 如果有什么地方不对的话可以帮忙指点一下.
[color=]路过的巨佬请留步(没错说的就是你), 这个站的无限debug我解不开, 能指点一下嘛?
aHR0cHM6Ly93d3cuNTJobnR2LmNvbS8=
帖子包含大量图文, 流量党慎入
因为部分图片没有使用导致全部自动插入到帖子底部, 我已经把没使用的图片都删了, 如果发现有哪些地方缺少配图(被我误删)的话可以回复一下, 我尽量补图
站点目录:
0x01: *长资源(aHR0cHM6Ly9jenNwcC5jb20v)
0x02: *团影视(aHR0cHM6Ly93d3cuZmFudHVhbmhkLmNvbQ==)
0x03: *B影院(aHR0cHM6Ly9hYnUyMi5jb20v)
0x04: *光影院(aHR0cHM6Ly93d3cubGd5eS5jYy8=)
番外篇(不算数的)
0x05: *videos(?????)
这个是解不开无限debug的(我直接禁用断点)
0x06: *纳TV(aHR0cHM6Ly93d3cuNTJobnR2LmNvbQ==)
0x07: B站(地址就不用我说了吧)
0x02 js加密了, 混淆我弄不出来, 等我学会AST再回来会一会他~
The.Final.Master.2015.BluRay.1080p.x265.10bit.MNHD-FRDS.mkv_20220904_235551.gif (2.53 MB, 下载次数: 0)
下载附件
2022-9-5 00:51 上传
正文开始:
0x01: *长资源(aHR0cHM6Ly9jenNwcC5jb20v)
首先打开站点之后F12打开调试工具, 首页推荐这里看到, 那就进去吧, 女主好像是韩版黑凤凰?
aHR0cHM6Ly9jenNwcC5jb20vdl9wbGF5L2JYWmZNVFl6TFc1dFh6RT0uaHRtbA==
嗯????
bf3424c0911f6646b2131dccb28fdc2.jpg (9.2 KB, 下载次数: 0)
下载附件
2022-9-3 17:13 上传
下载地址直接甩脸上了? 看不到看不到, 我们继续
8c7861843e0f813318483f251e14b46.jpg (94.75 KB, 下载次数: 0)
下载附件
2022-9-3 17:12 上传
进去之后调试工具切换到network, 看看下面很多文件被加载出来, 往下右键-新窗口打开, 额, 好像是个完整的视频文件, 这下省事了, 都不用合并ts了, 另外这图(视频?)床好像是抖音的?
6a9067edd690dc733448465bd6f9919.png (104.36 KB, 下载次数: 0)
下载附件
2022-9-3 17:15 上传
0c316ffd634a71409de96af0c924e0a.jpg (109.72 KB, 下载次数: 0)
下载附件
2022-9-3 17:16 上传
把下载链接复制出来, 然后把文件名(7e4ddedad13144d997c2caa255cbbdc2)放进去搜索一下, 第一个文件点进去, 在右边的headers面板里可以看到这条请求的响应码是302, 就是说视频链接(图片里的4)就是通过这条链接302重定向过去的, 只要找到这条链接的来源可以了
78c1fb72c98d61b1b8e981e54b09d38.jpg (317.66 KB, 下载次数: 0)
下载附件
2022-9-3 17:18 上传
把地址复制起来, 然后搜索后面那段, 搜索不到任何结果, 查一下堆栈调用也找不到什么东西(这里卡了好久,主要是没有思绪)
c32d6f6c6c5b60fa934641c5d124e74.jpg (187.84 KB, 下载次数: 0)
下载附件
2022-9-3 17:18 上传
搜索不到值一般是参数加密了, JS混淆等等, 那就搜索解密关键字 decrypt, 第一个结果跟进去一下
bf0e1623b96da9076bafedd5ecd0afc.jpg (79.9 KB, 下载次数: 0)
下载附件
2022-9-3 17:19 上传
格式化后下断点, 这里断点要下在返回结果这里, 因为我们不知道这段解密后的结果是不是想要的, 不然分析了半天加密逻辑, 解出来的结果不是自己想要的岂不是尴尬??
6c853a01cb9a094e86078463276dc27.jpg (72.7 KB, 下载次数: 0)
下载附件
2022-9-3 17:20 上传
刷新网页, 被断下来了, 鼠标放上去这段return结果里, 显示出来是一段html代码
41e22b1d69fbe8f8116b45f3c28a769.jpg (83 KB, 下载次数: 0)
下载附件
2022-9-3 17:20 上传
注意这里的url, 把他记下来, 然后回去network选项卡这里对一下链接是不是一致(每次刷新链接会变, 所以要刷新后回去network重新看), 发现这里啥都看不到
f13971595ec0c3846a54c27fe1f28d5.jpg (160.03 KB, 下载次数: 0)
下载附件
2022-9-3 17:21 上传
为什么? 因为这段html在插入之前被断下来了, 所以记下记过后要马上放行这个断点, 再回来看可以看到确实有一个94TQ的请求
2a8bcd9cd62203262e0e0949bb4a86f.jpg (123.42 KB, 下载次数: 0)
下载附件
2022-9-3 17:21 上传
但是403了, 可能是刚才憋太久了,失效了, 重新刷新, 记下结果之后马上放行, 这次解密后的链接结尾是RtVw
1793afcba6986d64309d0952349e12e.jpg (108.9 KB, 下载次数: 0)
下载附件
2022-9-3 17:22 上传
回去network那里看看
0bc02bcad7e63b09636f214445fc425.jpg (131.9 KB, 下载次数: 0)
下载附件
2022-9-3 17:22 上传
确实有这个RtVw的链接被请求了, 而且仔细对比的话,链接是一摸一样的, 也就是说这段解密后的结果就是我们要的
看一下他的加密逻辑, 这里可以看到一段 AES.decrypt, 说明是用AES加密的, 虽然我的JS不咋滴, 但是吧, python里的AES解密需要什么我还是知道的, 16位key、16位IV偏移量(CBC)、加密方式以及密文
IV和加密方式(CBC)以及密文都甩脸上了, 没什么好说的, 这里有一个"23bc7c424c6abc75", 这里假设他是key
b12342ea432728a20bc0198585915c9.jpg (95.7 KB, 下载次数: 0)
下载附件
2022-9-4 12:29 上传
57865560e7b6225a77272afbb245797.jpg (48.38 KB, 下载次数: 0)
下载附件
2022-9-4 12:58 上传
这里padding的话查了资料后知道 AES的区块长度固定为128比特, 即是说被AES加密的数据都是128比特, 假如加密数据是256比特, 那就刚好切成两块来加密, 但是需要加密的数据总不可能都是刚好是128的倍数吧, 当数据是250比特的时候就必须找点东西来填充一下保证数据是128倍数, 这个padding就是填充的, 话题走远了, 有兴趣自己搜索AES加密标准
以上数据找到之后不要急着用python去实现, 因为我们都是猜测的, 得先来验证一下是否正确, 找个在线AES加密的网站试试水.
这里的密文是d89e1b(变量名每次刷新会变,以实际网页为准)太长不好复制的话可以在console打印出来
40649ae29b2555e83dcb6878beaf305.jpg (284.75 KB, 下载次数: 0)
下载附件
2022-9-3 17:26 上传
复制出来后把所有数据到网站进行解密
044b7662bda5250d192005a23e4dac3.jpg (298.59 KB, 下载次数: 0)
下载附件
2022-9-3 17:26 上传
一切都和预想的一致, 多刷新几次网页后IV是写死的, 也就是说不用我们去挖, 直接定义死就行了, KEY需要从网页里匹配出来
接下来就找找这段内容是在那个页面里的, 右键复制文件名, 记得把后面的:formatted删了,这是使用chrome格式化代码后自动产生的后缀, 因为是找文件, 直接在过滤器里过滤一下就行了, 其实这个第一个打开的网页, 看调试器顶部就可以看得出来了
fd54786bdc904e67d20491c14de3e23.jpg (26.85 KB, 下载次数: 0)
下载附件
2022-9-4 12:30 上传
c8b5ebb111eb8b6eaba08dea294cada.jpg (130.72 KB, 下载次数: 0)
下载附件
2022-9-3 17:28 上传
所有东西都找到了, 接下来就是使用python来实现获取这些数据了
1. 获取加密数据和KEY 直接requests请求下来之后用re匹配, re表达式怎么写大家各显神通就行, 能匹配出来就好
7453dc17a8c8962469d861b09eec4ef.jpg (260.81 KB, 下载次数: 0)
下载附件
2022-9-3 17:29 上传
2. python 实现AES解密, 代码如下
480dda64ed550d789128bf7a91ff4e5.jpg (191.94 KB, 下载次数: 0)
下载附件
2022-9-3 17:31 上传
3. 解密出来的video里的url就是我们需要的 但是要记住, 这个解密出来的链接具有时效性, 几分钟就是失效了, 而且如果访问错一次就会立即失效(别问我怎么知道的!!)
176a4c9fed3d6126f1f75a95bfd031f.jpg (74.43 KB, 下载次数: 0)
下载附件
2022-9-4 12:53 上传
4. 第2那堆什么的, 之前我也有疑惑, 在我上一帖 https://www.52pojie.cn/thread-1680708-2-1.html 的19楼大佬已经给了解答, 有兴趣的自己再去了解吧, 被我注释掉的那一段可以解决这个问题, 但是因为没影响, 所以也就不处理了.
3b034565172b0f428829bbf2dc2bdca.jpg (58.58 KB, 下载次数: 0)
下载附件
2022-9-3 17:31 上传
5. 提取解密后的链接, 这个也是re匹配的问题, 没啥好说的.
就这样结束了嘛?
再找一部电影来试试, 选这部"咒"吧, 地址: aHR0cHM6Ly9jenNwcC5jb20vdl9wbGF5L2JYWmZNVEE1TkRjdGJtMWZNUT09Lmh0bWw=
解析出来的结果是m3u8, 那就加个判断把, 如果链接包含m3u8我们就继续发起请求, 把m3u8内容请求下来
df5f77d562f84f56b6ae90d52b79943.jpg (119.36 KB, 下载次数: 0)
下载附件
2022-9-3 17:39 上传
复制其中一段ts切片用浏览器打开, 果然放不了, 图片?
image.png (14.78 KB, 下载次数: 0)
下载附件
2022-9-3 17:44 上传
右键保存, 直接放winhex看看, 图片伪装, 选中图片头删掉再保存, 用potplayer打开, 完美.
e36ff01e7ca03e543bb3a2186478672.jpg (237.6 KB, 下载次数: 0)
下载附件
2022-9-3 17:45 上传
4c98794c21035cb5e5ca295ec4c5f7a.jpg (26.67 KB, 下载次数: 0)
下载附件
2022-9-3 17:45 上传
这里怎么切? 切多少? 用python怎么实现? 这个问题我也问过, 也是在我那张帖子里, 11楼大佬提供了一个方案, 这里直接copy他的代码过来(没想到吧,其实我也是菜鸟来着,很多问题我也不会), 这里直接贴代码出来, 有兴趣的去我上一帖慢慢看.
这里
[color=]只下载一个切片就break循环, 因为只是示范, 没必要全部下载
, 运行完之后会在同级目录下生成一个叫做0.ts的文件, 用potplayer打开, 正常播放
再换一个电影试试, 选个神探大战, 运行完播放一下, OK.
1c76cd3ad5e12e4b24be44a8dfc15c8.jpg (89.09 KB, 下载次数: 0)
下载附件
2022-9-3 17:47 上传
再换一部蜘蛛侠英, 也没问题
0cb19b96bc236d1632b96f6c5ade0c7.jpg (95.98 KB, 下载次数: 0)
下载附件
2022-9-3 17:47 上传
打完收工了, 至于ts合并问题, 这里就不多说了, 去看上一帖或者用逍遥大佬的m3u8下载器(话说真想下载的话, 网站已经把视频下载地址给出来了啊)
python代码:
[Python] 纯文本查看 复制代码import requests
import re
import os
import base64
from Crypto.Cipher import AES
def download(url):
page_ = requests.get(url)
link = re.findall(r'var \w{6}="(.*?)";var',page_.text)[0]
key = re.findall(r'var \w{6}=md5\.enc\.Utf8\.parse\("(\w+)"\);',page_.text)[0]
iv = '1234567890983456'
encrypt_ = AES.new(key.encode(),AES.MODE_CBC,IV=iv.encode())
encry_url = base64.decodebytes(link.encode())
decrypt_ = encrypt_.decrypt(encry_url)
# decrypt_ = decrypt_[:-decrypt_[-1]]
decrypt_ = str(decrypt_,'utf-8')
url = re.findall(r'video: {url: "(.*?)"',decrypt_)[0]
print(url)
if url.find('.m3u8') == -1:
pass
else:
m3u8 = requests.get(url).text
m3u8 = re.sub(r'#EX.*','',m3u8).split()
lenght = len(m3u8)
for index in range(lenght):
with open(f'{index}.ts','wb') as f:
ts_stream = requests.get(m3u8[index]).content
if ts_stream[:4] == b'\x89PNG' or ts_stream[:2] == bytes.fromhex('424D') or ts_stream[:2] == bytes.fromhex('FFD8'):
ts_start = ts_stream.find(b'G@')
ts_stream = ts_stream[ts_start:]
f.write(ts_stream)
break
url = 'https://{自己换成主域名}/v_play/bXZfMTA5NDctbm1fMQ==.html'
download(url)
0x02: *团影视(aHR0cHM6Ly93d3cuZmFudHVhbmhkLmNvbQ==)
其实一开始是先找到这个网站的, 不过一顿分析之后真的找不出在哪里加密所以就把这个网站搁置了, 这个网站用了混淆, 我没有学过相关处理方法, 所以搞不定, 后来找到了上面那个网站后再回来看这个网站, 发现两个有异曲同工之妙, 所以也就解决了(然而混淆我还是不懂得如何处理!!)
选一部经典的
aHR0cHM6Ly93d3cuZmFudHVhbmhkLmNvbS9wbGF5L2lkLTMxNi0xLTEuaHRtbA==
老方法, 点开视频之后随便拖动几次进度条, 观察network这里有什么文件被请求下来, 可以看到都是一堆相同文件名且后缀为mp4的, 猜的没错的话应该是完整的视频文件, 不是切片
81a35d5847bb9e5b8248bcbf96e24cd.jpg (203.4 KB, 下载次数: 0)
下载附件
2022-9-3 17:57 上传
右键新窗口打开, 确实是完整的视频文件, 图床还是西瓜视频的
b064b6a0e013b373f187d41081bffe3.jpg (116.99 KB, 下载次数: 0)
下载附件
2022-9-3 17:58 上传
接下来找找链接生成位置, 然后链接的一部分去搜索一下, 然而不管我怎么搜都无法搜索到, 堆栈调用这里也是什么都没有
838defcadb91077003e1bfc81a0c585.jpg (246.9 KB, 下载次数: 0)
下载附件
2022-9-3 17:58 上传
27561a27ec0b08e76c363e80a1fb371.jpg (225.03 KB, 下载次数: 0)
下载附件
2022-9-3 17:59 上传
bc41bbcedfac34d225af367157276a8.jpg (93.88 KB, 下载次数: 0)
下载附件
2022-9-3 17:59 上传
那就只能去翻一翻请求下来的所有文件了, 好在东西不多, 随便晃啊晃, 看到了一个有趣的东西, 这里可以看到很多信息并且还有注释, 但是最重要的urls被加密了
b2400bf027ba90c20cd4936c65a83b6.jpg (173.99 KB, 下载次数: 0)
下载附件
2022-9-3 17:59 上传
看到有两个等号结尾, 下意识反应就是base64编码, 找个在线解码的网站, 看来不是base64编码的
ad39cc5c8651768ae47fdc99f0ec693.jpg (102.14 KB, 下载次数: 0)
下载附件
2022-9-4 12:55 上传
那就全局搜索decrypt试试, 第一个结果点进去, 看到这个iv啊,mode啊有没有一种很熟悉的感觉?
2fe304ab80783667a793f68efc76583.jpg (271.07 KB, 下载次数: 0)
下载附件
2022-9-3 18:01 上传
其实我第一次逆向的时候就已经看到这些了, 但是后面都是一堆加密的JS代码, 看的我头都大了, 所以就选择性忽略掉了
和上面那个网站一样, 这里下个断点, 不过不知道哪里才是解密后的结果, 所以宁杀错不放过, 这个区域都给断下来, 刷新网页, 额, 发现没有触发断点, 那可能是在其他位置也有同样的加密, 再页面里搜索'iv', 有四个结果匹配到, 但是我不知道是在哪个进行加密的, 那就四个位置全部打上断点
2965284f8fc65bc81409a573aaedba7.jpg (103.69 KB, 下载次数: 0)
下载附件
2022-9-3 18:01 上传
再刷新, 这次终于抓到了, 但是都是乱码怎么看呢?
4ce1c7ee10b0807f1baf20bf09e857a.jpg (258.19 KB, 下载次数: 0)
下载附件
2022-9-3 18:02 上传
把鼠标放上去, 比如放mode这里, 可以看到这串乱码的值是"CBC"
f0bbeac9bacd5f1328078f7235529d8.jpg (122.47 KB, 下载次数: 0)
下载附件
2022-9-3 18:02 上传
'mode': CryptoJS['mode'][_0x5bf4('0x945', '$VA#')]
上面代码相当于下面的
'mode': CryptoJS['mode']["CBC"]
同样把鼠标放上去,可以看到
a3500f81bc9332c881b7fbc7dd8ea82.jpg (93.01 KB, 下载次数: 0)
下载附件
2022-9-3 18:03 上传
CryptoJS[_0x5bf4('0x93c', '[ZFb')]['decrypt']
等于
CryptoJS["AES"]['decrypt']
答案很明显了, AES加密, 模式为CBC, IV的值同样可以用鼠标来确认为 c487eb12e38a0fa0
eeaaf813d70b7e5cd37fc0c32f4b3a1.jpg (115.33 KB, 下载次数: 0)
下载附件
2022-9-3 18:03 上传
需要解密的字符串为 "t9GkQwf" 开头的字符串, key为 0f84ff0c1f252cba
d4cc44971b0ec2d2985147ca47df4f8.jpg (184.6 KB, 下载次数: 0)
下载附件
2022-9-3 18:04 上传
57865560e7b6225a77272afbb245797.jpg (48.38 KB, 下载次数: 0)
下载附件
2022-9-3 18:04 上传
万事俱备, 马上找个在线解密的试试我们的判断, 可以正常解密
9105337ac27ef1ca278cf5169fa3354.jpg (118.67 KB, 下载次数: 0)
下载附件
2022-9-3 18:05 上传
解密后的链接也是可以打开, 接下来找找密文的来源, 搜索"t9GkQwf"看看, 结果只有一个, 这个不就是刚才打开的那个页面嘛?
802da6b024483a6533b2082b76ee662.jpg (197.98 KB, 下载次数: 0)
下载附件
2022-9-3 18:05 上传
接下来找找这个页面又是从哪里来的, 复制网页链接, 搜索一下, 可以看到来源是网站首页的一个 player_aaaa 后面的内容
237e8fa8d7761478798949f26f12a51.jpg (242.78 KB, 下载次数: 0)
下载附件
2022-9-3 18:06 上传
所有内容都找到来源来, 轮到python隆重登场了, 挖出出来player_aaaa之后我们只要url里面的, 那就用字典键值取出来就行了
357f2a4fccc39ca1f38420c00791852.jpg (139.7 KB, 下载次数: 0)
下载附件
2022-9-3 18:06 上传
e1d85799ab50a7f2c2ac0ff60d2916a.jpg (59.61 KB, 下载次数: 0)
下载附件
2022-9-3 18:07 上传
取出来之后在观察一下第二次请求的链接结构, 某个域名+刚取出来的url+一堆参数
d3bcc968478ef60e5e90aec0661e831.jpg (146.67 KB, 下载次数: 0)
下载附件
2022-9-3 18:07 上传
先不管参数, 把域名和刚才的url拼接一下试试看, 返回"域名未授权!"
image.png (40.14 KB, 下载次数: 0)
下载附件
2022-9-3 18:11 上传
回去浏览器看看他是怎么发起请求的, 这里有一个referer, 我们加回去给他, 这次有内容出来了, 但是我们需要的urls值怎么空了?
07ac50e2bc7837045bc377eae9c9c16.jpg (154.96 KB, 下载次数: 0)
下载附件
2022-9-3 18:11 上传
4c7cc0e0a6d4672d64a429cb58db302.jpg (74.9 KB, 下载次数: 0)
下载附件
2022-9-3 18:12 上传
链接加个"&from=uploadixigua"回去之后发现可以正常请求了
77ee081ed6f6dd4d7cfe543b2dc14e8.jpg (78.09 KB, 下载次数: 0)
下载附件
2022-9-3 18:13 上传
那就不能偷懒了, 得把from值补齐, 他和url一样来源player_aaaa这里(不信你划上去看看刚才的截图), 补齐后是这样子的, 密文找好了,接下来就开始解密,
[color=] key和iv试了几次, 发现是写死的, 我们跟着写死就行
, urls的匹配不说了(很简单), AES实例化也不说了, 分析上一个网站时说过了, 最后正常解密, 链接可以正常打开, 试了其他视频也能正常解析
6980abcdca7ed14e3045ca421eb3440.jpg (120.49 KB, 下载次数: 0)
下载附件
2022-9-3 18:15 上传
有些是m3u8, 要下载就用下载器吧, 不多说了. 打完收工.
261ff851660a445e6fa5e27dd35e92a.jpg (86.16 KB, 下载次数: 0)
下载附件
2022-9-3 18:16 上传
python示例:
[Python] 纯文本查看 复制代码import requests
import re
import base64
import os
from Crypto.Cipher import AES
import json
def downlaods(url):
page_ = requests.get(url).text
data_ = re.findall(r'player_aaaa=({.*?})',page_)[0]
data_ = json.loads(data_)
url = data_['url']
second_url = f'https://dp.1010dy.cc/?url={url}&from={data_["from"]}'
second = requests.get(second_url,headers={'referer': 'https://www.fantuanhd.com/'}).text
urls = re.findall(r'var urls = "(.*?)"',second)[0]
print('urls: ',urls)
key = '0f84ff0c1f252cba'
iv = 'c487eb12e38a0fa0'
encrypt_ = AES.new(key.encode('utf-8'),AES.MODE_CBC,IV=iv.encode())
encry_url = base64.decodebytes(urls.encode())
url = encrypt_.decrypt(encry_url)
url = str(url[:-url[-1]],'utf-8')
print('解密结果: ', url)
url = 'https://{换成主域名}/play/id-3989-1-1.html'
downlaods(url)
[color=]帖子篇幅已严重超出预期, 下面的内容我会尽量精简
0x03: *B影院(aHR0cHM6Ly9hYnUyMi5jb20v)
网络大电影, 从网大的角度看, 这已经是一部很不错的电影了, 地址: aHR0cHM6Ly9hYnUyMi5jb20vdm9kcGxheS8xMTI0MTAtMS0xLmh0bWw=
打开之后拖动一下进度条, 可以判断出那些文件是视频切片, 选中之后可以看到是一张花屏的图片
0bc0c20bc6f9198b4d7ffaec23078eb.jpg (114.65 KB, 下载次数: 0)
下载附件
2022-9-3 18:20 上传
明显是图片伪装, 用winhex删掉伪装头后可以正常播放
f54fe7d9724a33e2082766472bd3ed9.jpg (142.81 KB, 下载次数: 0)
下载附件
2022-9-3 18:21 上传
接下来找m3u8, 找到之后复制链接并搜索一下来源, 可以看到url是在一个请求的返回结果里
bdfb00231f319ee0d34f2bdbf4db528.jpg (69.81 KB, 下载次数: 0)
下载附件
2022-9-3 18:21 上传
67db33ff5173a87e112e55558578373.jpg (140.81 KB, 下载次数: 0)
下载附件
2022-9-3 18:21 上传
那看看这个请求是怎么完成的, 这是一个post请求, 请求参数有url,time,key
b0030d59f74914e7a8dfdf1c13abd78.jpg (21.48 KB, 下载次数: 0)
下载附件
2022-9-3 18:21 上传
4df5f8023fb58d4fce5ff1e044a87cb.jpg (41.48 KB, 下载次数: 0)
下载附件
2022-9-3 18:22 上传
接下来找数据来源, 直接搜索看看, 第一个结果进去, url和key全都在了,url找到了,但是这里的key和我们要(7aa开头)的不一样?
027b3158eab107dc09bdbce7be91843.jpg (149.66 KB, 下载次数: 0)
下载附件
2022-9-3 18:22 上传
去第三个结果点进去看看, 需要的数据都在这里了 url,key,time
6d6c51e9ad29c0114d117359e2968b1.jpg (130.69 KB, 下载次数: 0)
下载附件
2022-9-3 18:22 上传
这个链接"?url=BYGA-xxxxx"又是怎么来的? 通过首页来的, 这个流程就是(看着图片来)从 1-->2-->3
0af33a0b1eb34f4f62831b4568dbb5e.jpg (141.23 KB, 下载次数: 0)
下载附件
2022-9-3 18:23 上传
另外这个 var player_aaaa 有没有很熟悉? 可能他们用的都是同一套模板吧, 下载下来最后的格式bmp乱码图片, 看到这里还不会处理这个问题的, 拉出去弹小jj十分钟
f3c39e68b47128193412ff703f27154.jpg (100.3 KB, 下载次数: 0)
下载附件
2022-9-3 18:24 上传
python 示例:
[Python] 纯文本查看 复制代码import time
import requests
import re
import base64
import os
from Crypto.Cipher import AES
import json
def downloads(url):
# 从首页获取数据
page_ = requests.get(url).text
data_ = re.findall(r'player_aaaa=({.*?})',page_)[0]
data_ = json.loads(data_)
key = data_['key']
url_ = data_['url']
tm = data_['tm']
# 第二次获取数据
url2 = f'https://play.shzpin.com/BYGA/?url={url_}&tm={tm}&key={key}'
page_2 = requests.get(url2).text
data_2 = re.findall(r'var config = ({.*?})',page_2,re.S)[0]
data_2 = json.loads(data_2)
url_3 = data_2['url']
time_3 = data_2['time']
key_3 = data_2['key']
# 第三次获取数据
api = 'https://play.shzpin.com/BYGA/API.php'
data = {'url': url_3,'time': time_3,'key': key_3}
post_data = requests.post(api,data=data).json()
# 链接不一定是m3u8,也可能是完整的视频
m3u8 = post_data['url']
print(m3u8)
url = 'https://{换成主域名}/vodplay/112410-1-1.html'
downloads(url)
0x04: *光影院(aHR0cHM6Ly93d3cubGd5eS5jYy8=)
, 宫佬经典中的经典 aHR0cHM6Ly93d3cubGd5eS5jYy92b2RwbGF5LzU3MzI1LTEtMS5odG1s
直接过滤关键字m3u8,选中链接之后从堆栈调用里进去最后一个
cf3b053c5e71d4b2ed61d1aecba3ee5.jpg (97.64 KB, 下载次数: 0)
下载附件
2022-9-3 18:29 上传
看到关键信息, 下个断点刷新, 成功断下来, 鼠标放上去可以显示结果
9d210486ff21539e6db80105f616f15.jpg (89.95 KB, 下载次数: 0)
下载附件
2022-9-3 18:29 上传
复制后打开下载一段m3u8, 文本编辑器打开, 复制一段ts链接下载, 结果是一张1像素的图
957cf950abbac6d79ba1914698bddf7.jpg (84.34 KB, 下载次数: 0)
下载附件
2022-9-3 18:29 上传
拿进去winhex去掉图片头保存, 可以正常播放
fea262011be8cdc00ba2d65a1bf7387.jpg (301.13 KB, 下载次数: 0)
下载附件
2022-9-3 18:30 上传
确定getVideoInfo(urls)的返回结果是m3u8之后, 先看看urls(密文)来自哪里? 来源于这个
/dplayer.php?url=xxxx 的请求返回结果里
9c16914258f075629cddb59c109f448.jpg (122.36 KB, 下载次数: 0)
下载附件
2022-9-3 18:30 上传
而这条请求连接构造通过搜索可以知道来自于首页的player_aaaa, 有没有发现又是这个参数? 密文来源搞定
接下来看 getVideoInfo这个方法对密文做了什么, 鼠标放上去可以直达函数
cb39a66840f4941fb79a848753647cc.jpg (40.85 KB, 下载次数: 0)
下载附件
2022-9-3 18:32 上传
进去之后打断点刷新网页, 虽然是加密的, 但是好在表达式不长
40ed085843256322c1a5a9d6ed3bb88.jpg (51.37 KB, 下载次数: 0)
下载附件
2022-9-3 18:32 上传
鼠标放上去看看, _0x38afx2 为传入的密文, 我们用urls表示, 所以
d958b15ca927f3a8414c7b90984b03e.jpg (24.2 KB, 下载次数: 0)
下载附件
2022-9-3 18:33 上传
64c6b86c1b999f21db783f50ba0673f.jpg (23.09 KB, 下载次数: 0)
下载附件
2022-9-3 18:33 上传
string = _0x38afx2[__Oxdef43[0x1]](8, _0x38afx2[__Oxdef43[0x0]])
相当于下面的
string = urls["substring"](8, urls["length"])
就是说, string就是把传入的密文去掉前面八个字符, 然后再拿去base64解码, 解码完成后再把前面8个和最后8个字符删掉, 这就是最终的结果的, 这就是整个解密流程.
cc198745ea40f90e99c534abc67f599.jpg (69.25 KB, 下载次数: 0)
下载附件
2022-9-3 18:34 上传
python 示例:
[Python] 纯文本查看 复制代码import requests
import re
import base64
import os
import json
def downlaods(url):
page_ = requests.get(url).text
data_ = re.findall(r'player_aaaa=({.*?})',page_)[0]
data_ = json.loads(data_)
url = data_['url']
url_2 = f'https://{换成主域名}/static/player/dplayer.php?url={url}'
page_2 = requests.get(url_2).text
url_3 = re.findall(r'var urls = \'(.*?)\'',page_2)[0]
url_3_decode = base64.decodebytes(url_3[8:].encode())
url_3_real = str(url_3_decode,'utf-8')[8:-8]
print(url_3_real)
url = 'https://{换成主域名}/vodplay/57862-1-1.html'
downlaods(url)
0x05: (???????)
直接在过滤器搜索m3u8, 第一个就是了, 里面包含了各个分辨率的二级m3u8文件
1.png (62.77 KB, 下载次数: 0)
下载附件
2022-9-5 00:49 上传
复制下载地址搜索, 很容易发现链接直接放在首页里, 没有任何加密混淆(大站就是不一样!), 圈起来的三个前两个是mp4格式的完整视频直链(但清晰度没有1080), 第三个是m3u8链接(包含1080p)
image.png (348.77 KB, 下载次数: 0)
下载附件
2022-9-6 16:02 上传
发请请求之后会返回来各个清晰度的二级m3u8, 所以要写个判断获取最高清晰度(有些视频没有1080p), 这个站没有任何逆向难度, 所以这个就不算第五个站了, 算"番外"?
3.png (88.85 KB, 下载次数: 0)
下载附件
2022-9-5 00:50 上传
0x06: *纳TV(aHR0cHM6Ly93d3cuNTJobnR2LmNvbQ==)
无限debug解不开, 直接硬上
随便找一个视频吧
aHR0cHM6Ly93d3cuNTJobnR2LmNvbS9pbmRleC5waHAvdm9kL3BsYXkvaWQvMjAwMDMvc2lkLzEvbmlkLzEuaHRtbA==
打开调试工具之后会被自动断点, 右上角禁用所有断点之后点击继续
image.png (51.48 KB, 下载次数: 0)
下载附件
2022-9-5 10:44 上传
等待页面加载完毕之后记得停止录制, 不然你的chorme会卡死
image.png (65.85 KB, 下载次数: 0)
下载附件
2022-9-5 10:45 上传
接下来直接搜索m3u8, 复制链接之后直接搜索
image.png (53.79 KB, 下载次数: 0)
下载附件
2022-9-5 10:45 上传
看到数据来源为首页的 player_aaaa
image.png (62.44 KB, 下载次数: 0)
下载附件
2022-9-5 10:46 上传
其他的没什么好说的
image.png (107.2 KB, 下载次数: 0)
下载附件
2022-9-5 10:47 上传
简简单单啦, 主要是卡在无限debug上了
python: [Python] 纯文本查看 复制代码import requests
import re
def downlaods(url):
page_ = requests.get(url).text
data_ = re.findall(r'player_aaaa=({.*?})',page_)[0]
data_ = json.loads(data_)
url_ = data_['url']
print('m3u8链接:',url_)
m3u8 = requests.get(url_).text
m3u8 = re.sub(r'#EXT.*','',m3u8).split()
for m3u in m3u8:
print(m3u)
url = 'https://{换成主域名}/index.php/vod/play/id/20003/sid/1/nid/1.html'
downlaods(url)
0x06: bilibili
应309楼要求, 分析一下B站(后来发现超级简单), 打开之后随便拖动进度条, 可以看到很多同样的链接被重复加载
1.png (613.09 KB, 下载次数: 0)
下载附件
2022-9-11 15:35 上传
2.png (144.21 KB, 下载次数: 0)
下载附件
2022-9-11 15:35 上传
很明显了, 这就是视频文件, 右键新窗口打开, 403拒绝访问...
2.1.png (29.04 KB, 下载次数: 0)
下载附件
2022-9-11 15:36 上传
看一下chrome是通过什么方式访问的, 使用get方式访问, 没什么稀奇, 再看看请求头里, 有一些比较重要的参数
3.png (245.31 KB, 下载次数: 0)
下载附件
2022-9-11 15:37 上传
直接无脑复制headers, 因为我不知道用chrome怎么修改请求头发送请求, 所以直接上python, 代码如下, 直接request发起请求然后打印一下响应码, 结果是206, 和网页请求返回来的结果一致
4.png (97.83 KB, 下载次数: 0)
下载附件
2022-9-11 15:37 上传
直接把他写进去文件试试, 发现无法打开
5.png (116.62 KB, 下载次数: 0)
下载附件
2022-9-11 15:37 上传
然后我试着把range这行注释掉, 因为我们要获取的是完整视频, 而不是分段, 然后神奇的一幕发生了, 能直接把整个视频文件下载下来了, 时长是完整的, 但是没有声音
6.png (524.87 KB, 下载次数: 0)
下载附件
2022-9-11 15:38 上传
这里可以猜测出来, 视频音频是分开的, 回去chrome看一下, 可以发现一个规律, 每次我们拖动进度条请求都是成双成对出现的, 一个是 "xxxx-1-xxxx", 一个是 "xxxx_nb2-xxxx"
7.png (114.67 KB, 下载次数: 0)
下载附件
2022-9-11 15:38 上传
刚才我们python请求的是-1的这条链接(视频), 这次我们请求nb2的试试, 下载之后打开果然是一段音频, 我真是太聪明了~
8.png (154.67 KB, 下载次数: 0)
下载附件
2022-9-11 15:39 上传
9.png (24.12 KB, 下载次数: 0)
下载附件
2022-9-11 15:39 上传
那这些信息哪里来的? 直接搜索吧, 左上角输入文件名(我们这个视频的是481327329-1-100026) 搜索可以看到首页, 点进去之后格式化代码, 然后页面内搜索一下可以很快定位到这里
10.png (370.73 KB, 下载次数: 0)
下载附件
2022-9-11 15:39 上传
所有的链接都在这里了, 这个格式有点代码基础的可以看得出来是json的, 我们往上找找父节点, 可以看到他在video里
11.png (87.34 KB, 下载次数: 0)
下载附件
2022-9-11 15:40 上传
刚才已经说过了, 他是音频视频分开的, 这里有video, 那必须有audio的呀, 往下翻一翻可以找到audio
12.png (95.07 KB, 下载次数: 0)
下载附件
2022-9-11 15:40 上传
所有东西都有了, 接下来就是python实现, re匹配没什么好说的, 这里我把视频部分信息打出来发现分辨率有重复, 回去chrome(代码格式化后比较容易阅读)看了一下, 区别好像是编码器和帧率的区别
13.png (161.17 KB, 下载次数: 0)
下载附件
2022-9-11 15:40 上传
14.png (95.74 KB, 下载次数: 0)
下载附件
2022-9-11 15:41 上传
一般最高分辨率是放在第一个的, 我们就下载第一个就好, 至于能不能下载会员视频, 这个脚本肯定不行, 因为没有传递cookie并且我没有会员无法做测试, 所以有动手能力的自己实现就行了
最后请求头里的referer直接引用传递进来的链接url即可, 其余参数都可以精简掉, 至于怎么合并, 嘿嘿, 我不说, 因为你是想下载的话网上很多下载器, 自己去找找就行了
15.png (673.71 KB, 下载次数: 0)
下载附件
2022-9-11 15:41 上传
16.png (771.69 KB, 下载次数: 0)
下载附件
2022-9-11 15:42 上传
[color=]完结了
编辑这帖子, 配文插图花了几个小时.....
如果从开头一直有耐心看到这里的话, 给你点个赞