快音视-视频id加密

  • 一、背景
  • 二、过程
    • 1、确定加密参数
    • 2、确定加密函数
    • 3、处理js函数
  • 三、知识点&踩坑

一、背景

今天看到一篇破解js混淆的文章,里面针对快音视的视频id加密,做了分析破解(链接:https://www.jianshu.com/p/5c945834270d ),刚好闲着无事,也分析一波,记录下自己的采坑经历

二、过程

1、确定加密参数

抓包后发现数据接口:https://kuaiyinshi.com/api/kuai-shou/recommend/?callback=showData&_=1557698894077, 里面的video_url字段,即视频下载链接为:

  • //txmov2.a.yximgs.com/upic/2018/08/25/08/:131:125:183:171:210:181:145:149:141:125:184:153:184:130:145:191:185:125:199:188:192:179:183:157:138:126:162:149:184:128:145:191:118:136:199:205:141:180:161:157:142:127:146:153:115:130:161:180:167:125:163:162:212:197:181:184:140:143:144:169:167:105:178:157:118:100:178:163:142:158:131:184:144:101:134:169:114:153:130:155:167:98:130:206:192:157:175:182:146:98:130.mp4

该链接无法打开,查看页面展示的实际下载链接为:

  • //txmov2.a.yximgs.com/upic/2018/08/25/08/BMjAxODA4MjUwODUxMzRfMjI1NTQwMDU5Xzc3NTI5ODU2OTJfMV8z_hd3_Bef6e354e9486d758e1f51f25df7bb924.mp4

尝试全局搜索short_id, play_id, data_id, video_id, 在搜索video_id时找到js文件

2、确定加密函数

全局搜索video_id,发现两个js链接

  • https://kys.tqdn.cn/js/main.js?t=1551350571, js混淆
  • https://kys.tqdn.cn/js/public.js?t=1551350571, 正常

先看下public.js,相关代码如下

大致意思就是根据不同平台的链接,将video_id取出来,无加密函数
再看下main.js函数,该js文件进行了混淆,关键字都用数组__Ox27641通过下标获取,同时将十进制数字转为16进制,如
var sc = getQueryString(__Ox27641[0x9]);
var st = getQueryString(__Ox27641[0xa]);
var video_id = getQueryString(__Ox27641[0xb]);

搜索后发现很多video_id,一开始以为是var video_id = getQueryString(__Ox27641[0xb]);即getQueryString是加密参数,进入publish.js里查看getQueryString函数

打断点调试后,发现请求一次,会调用三次该函数,传入的那么分别为source, st,video_id,但是没有发现加密
重新看main.js,看到ab3d7fc(video_id, ky),代码如下

function ab3d7fc(_0x871ex15, _0x871ex16) {var _0x871ex17 = [];var _0x871ex18 = _0x871ex15[__Ox27641[0x1e]](__Ox27641[0x1d]);delete _0x871ex18[0x0];var _0x871ex19 = [];var _0x871ex1a = _0x871ex16[__Ox27641[0x1e]](__Ox27641[0xc]);_0x871ex1a[__Ox27641[0x17]](function(_0x871ex1b) {_0x871ex19[__Ox27641[0x20]](_0x871ex1b[__Ox27641[0x1f]]())});var _0x871ex1c = _0x871ex19[__Ox27641[0x21]];_0x871ex18[__Ox27641[0x17]](function(_0x871ex1d, _0x871ex1e) {_0x871ex17[__Ox27641[0x20]](parseInt(_0x871ex1d) - (0xFF & _0x871ex19[(_0x871ex1e - 1) % _0x871ex1c]))});var _0x871ex1f = __Ox27641[0xc];_0x871ex17[__Ox27641[0x17]](function(_0x871ex13) {_0x871ex1f += String[__Ox27641[0x16]](_0x871ex13)});return _0x871ex1f
}

该函数出现了好几次,然后尝试打断点,发现该函数传入加密后video_id值,返回解密后的video_id,确定该函数为加密函数

3、处理js函数

(1)传入参数确定:
第一个参数为video_id, 第二个参数: ky,在console中输入ky,获得该值的数据:‘A0MjZfMTY0NDA3Mj’,固定值
(2)解析函数
第一步:将所有16进制数字转为10进制:

function ab3d7fc(_0x871ex15, _0x871ex16) {var _0x871ex17 = [];var _0x871ex18 = _0x871ex15[__Ox27641[30]](__Ox27641[29]);delete _0x871ex18[0];var _0x871ex19 = [];var _0x871ex1a = _0x871ex16[__Ox27641[30]](__Ox27641[12]);_0x871ex1a[__Ox27641[23]](function(_0x871ex1b) {_0x871ex19[__Ox27641[32]](_0x871ex1b[__Ox27641[31]]())});var _0x871ex1c = _0x871ex19[__Ox27641[33]];_0x871ex18[__Ox27641[23]](function(_0x871ex1d, _0x871ex1e) {_0x871ex17[__Ox27641[32]](parseInt(_0x871ex1d) - (255 & _0x871ex19[(_0x871ex1e - 1) % _0x871ex1c]))});var _0x871ex1f = __Ox27641[12];_0x871ex17[__Ox27641[23]](function(_0x871ex13) {_0x871ex1f += String[__Ox27641[22]](_0x871ex13)});return _0x871ex1f
}

第二步:根据__Ox27641数组的值及下标,替换关键字,同时使用短变量名重新命名变量,方便查看

function ab3d7fc(video_id, ky) {var aa = [];var bb = video_id.split(':');delete bb[0];var cc = [];var dd = ky.split("");dd.forEach(function(ff) {cc.push(ff.charCodeAt())});var xx = cc.length;bb.forEach(function(val, key) {aa.push(parseInt(val) - (255 & cc[(key - 1) % xx]))});var hh = '';aa.forEach(function(pp) {hh += String.fromCharCode(pp)});return hh
}

执行到这一步,就面临两个选择,第一个是直接执行该js获取数据,方便简单,但效率慢,第二个就是用python重写该函数
第三步:执行js函数或Python实现该函数
 方法一:执行js:选择js2py库,效率相对于PyV8和pyExecJS,效率更高,但要注意js2py执行复杂js代码会出错,所以要先试着能否js2py库正常执行,不行可以换成上面的两个库

import js2py
context = js2py.EvalJs()
context.execute(js)
video_id = context.ab3d7fc(':131:125:183:171:210:181:145:149:141:125:184:153:184:130:145:191:185:125:199:188:192:179:183:157:138:126:162:149:184:128:145:191:118:136:199:205:141:180:161:157:142:127:146:153:115:130:161:180:167:125:163:162:212:197:181:184:140:143:144:169:167:105:178:157:118:100:178:163:142:158:131:184:144:101:134:169:114:153:130:155:167:98:130:206:192:157:175:182:146:98:130', 'A0MjZfMTY0NDA3Mj')print(video_id)

 方法二:Python重写该函数

def get_video_id(video_id, ky='A0MjZfMTY0NDA3Mj'):aa = []bb = video_id.split(':')del bb[0]print(bb)cc = []for d in ky:cc.append(ord(d))print(cc)xx = len(cc)for key, val in enumerate(bb):aa.append(int(val)- (255&cc[(key)%xx]))print(aa)hh = ''for a in aa:hh+= chr(a)return hh

至此,完成该video_id的破解

三、知识点&踩坑

js混淆:关键字都用数组__Ox27641通过下标获取,同时将十进制数字转为16进制

int(), 第一个参数是字符串  ,第二个参数是说明,这个字符串是几进制的数, 转化的结果是一个十进制数2进制转10进制:int('10100111110',2)  ==> 134216进制转10进制: int('0x10', 16)  ==>  168进制转10进制:int('17',8) ==> 15
oct(), 将 任意进制的数 转换成 8进制的10进制转8进制: oct(11) ==> '013'16进制转8进制: oct(0xf)  ==> '017'2进制转8进制:   oct(0b1010) == > '012'
hex(), 10进制转16进制10进制转16进制: hex(16)  ==>  0x108进制转16进制: hex(int('17',8)) ==> '0xf'2进制转16进制: hex(int('101010',2)) ==> '0x2a'
bin(), 10进制转2进制10进制转2进制: bin(10) ==> '0b1010'16进制转2进制: bin(int('ff',16)) ==> '0b11111111'8进制转2进制: bin(int('17',8)) == > '0b1111'

2、js的forEach和Python的enumerate

快音视-视频id解密相关推荐

  1. ffmpeg 视频合并,无声或音视不同步

    无声: 第一个视频无声,合并之后整个视频无声 例如上面是我用图片合成的视频,就是没有音频的视频.只要没有音频的视频放在最前面,那么整个视频都会没有声音,ffmpeg默认以第一个视频为标准. 解决方法: ...

  2. 乐视视频 App 图标改为“欠 122 亿”,网友:我在别家分红包,却在你家随份子!...

    作者 | 苏宓 出品 | CSDN(ID:CSDNnews) 不知从何时起,春节成为了各家互联网公司的"高考"以及营销大比拼的另一个"战场". 这不在 2021 ...

  3. 鸿蒙密视视频加密软件,鸿蒙密视视频加密软件

    鸿蒙密视针对视频夸平台的离线观看.防拷贝.防刻录.防一号多人使用等问题,推出专门针对企业视频防护完整解决方案,鸿蒙密视视频加密软件,实现对视频数据安全的保护. 功能特点 1.支持所有视频音频格式 鸿蒙 ...

  4. 电脑网页如何安装扩展插件在线观看抖音短视频

    现在短视频都很火,对吧!抖音.微视.快手等等.不管在大街上还是哪里都会听见"噔噔蹬蹬噔噔蹬蹬蹬",但这都只能在手机上观看抖音短视频,那么可以在电脑上观看抖音吗?那么有人就说了:可以 ...

  5. 阿里云视频加解密VOD开发

    VOD使用开发 阿里云视频点播官方文档 阿里云视频点播(ApsaraVideo VoD)是集音视频采集.编辑.上传.自动化转码处理.媒体资源管理.高效云剪辑处理.分发加速.视频播放于一体的一站式音视频 ...

  6. 【福利】Python抖音小视频无水印下载工具助手exe

    本渣渣的一个老哥要的抖音小视频无水印下载,我觉得他是一个LSP,因为抖音上的小姐姐实在是太多,太好看了! 可是他就是不发好看的小姐姐抖音号给我... 难道我的肾没有他强?! 不可能啊,本渣渣经常吃韭菜 ...

  7. 如何做短视频推广?抖音短视频推广方案

    随着社交媒体和移动互联网的普及,短视频推广已成为企业推广营销的重要手段之一.那么什么是短视频推广?短视频推广是通过制作和发布短视频来宣传和推广企业产品或服务,吸引潜在客户,提升品牌知名度和美誉度,实现 ...

  8. uniapp - 仿抖音短视频项目

    仿抖音短视频阅读手册 特殊通知 1.请用户认真阅读以下说明,千万不能混淆页面随意引入,如果你发现运行后页面样式排版错乱,大概率是引入错误喔. 2.请App端用户将HbuilderX版本调整到3.3.9 ...

  9. 整合vite2.0+electron12+vant3.x跨端仿抖音短视频+聊天+直播exe应用

    vite2-electron-douyin 基于vite2.x+electron模仿抖音短视频应用实例. 整合了vite2+electron跨端开发技术仿制抖音界面桌面版exe应用软件.基于Vite2 ...

最新文章

  1. Pandas缺失数据
  2. 稀疏编码(Sparse Coding)(二)
  3. linux文件怎么操作,linux文件操作学习1
  4. 使用kibana或postman操作Elasticsearch的常用命令
  5. vue动态监听窗口高度 - 全背景banner
  6. C++指针和引用的区别
  7. jquery判断是否隐藏
  8. 【Scheme归纳】4 高阶函数
  9. oracle存储过程中返回一个程序集
  10. [转].net中的认证(authentication)与授权(authorization)
  11. 河南高二计算机会考excel,(完整版)高中信息技术学业水平考试Word、Excel操作题考点总结...
  12. 怎么删除网络文件服务器的帐号,linux连个文件都删除不了,什么鬼!
  13. 什么是外贸ERP系统?
  14. 【Java分享客栈】我为什么极力推荐XXL-JOB作为中小厂的分布式任务调度平台
  15. DP/最短路 URAL 1741 Communication Fiend
  16. 凉茶澄清过滤膜分离技术阐述
  17. Python读取和操作Excel(.xlsx)文件
  18. APICloud实战--每日生鲜App
  19. YOLO&Deepsort的车速&车流量检测系统(源码&部署教程)
  20. 常用缓存淘汰策略FIFO、LFU、LRU

热门文章

  1. linux常用命令及通过浏览器访问linux文件功能
  2. oracle 11g 下载
  3. C/C++要点全掌握(二)——堆栈、指针
  4. 锁相环(PLL)的工作原理
  5. mysql汉字插不进去_Mysql下插入汉字失败
  6. Android【WebView】
  7. GetCheckedRadioButton
  8. windows电脑系统优化
  9. 链栈的基本操作-C语言
  10. java smslib 发送短信错误信息