本文仅记录我分析过程,仅供学习参考,如有涉及侵权联系本人删除
如果有任何问题,欢迎交流指导
很久没关注抖音了,不清楚算法什么时候进行了更新,快速过一遍。
一、准备工作
通过xhr断点定位到VMP代码
把这个js文件使用浏览器的替换功能进行替换,并使用v_jstoole的AST混淆解密中的 ”仅变量压缩“功能,转换下变量名,看上去美观一点
再把这个地方的代码手动修改下,方便断点。这里对w[0]进行额外判断,只有当需要加密的明文符合评论接口的时候才进行断点
考虑到还有其他地方存在apply调用,在这份js头部添加一段hook代码,hook Function.prototype.apply
// 保存原始的 Function.prototype.apply 方法
const originalApply = Function.prototype.apply;
// 修改 Function.prototype.apply 方法
Function.prototype.apply = function (thisArg, args) {
// 调用原始的 apply 方法来执行函数
const result = originalApply.call(this, thisArg, args);
// 输出结果
if (window.$_islog) {
try {
console.log("Function:", this, "\n 参数:", args, "\n结果:", JSON.stringify(result));
} catch (e) {
console.log("Function:", this, "\n 参数:", args, "\n结果:", result);
}
}
// 返回结果
return result;
};
log = console.log; ; ; ;
二、分析
拿到一分简略的日志后,保存至本地,先大概过一遍
跳过前面环境监测的日志,发现了类似md5的值
在js文件中搜下常见的一些特征值,比如0x67452301、1732584193等
并且他还在_0xa653c7的原型下,在这里再加两个日志点,
再次拿到一份日志,可以看到这里对明文params进行了两次md5并转成16进制的数组
通过python验证,生成的数组一致
其中"d41d8cd98f00b204e9800998ecf8427e"是md5("")的结果,并且下文再次对该md5进行加密,此处只有当body不为空时才有数据,算法与上文params加密一致
再往下看,发现'\x00\x01\f'作为key,对ua进行了rc4加密
具体可以进到函数,问问GPT
随后用rc4加密后的值进行Base64,每三个字节输出四个字符
不确定的话,可以通过Base64运算完成之后的结果进行校验。并且下文对该结果再次进行了md5
在下文,取出了时间戳和canvas
经过一系列计算拿到长度19的数组,转为字符串,用 ÿ 当作key,进行rc4加密。这个长度19的数组,除了几个固定值之外,其他数字根据前文得到,具体规则可参考网上其他大佬发的文章,生成规则一直没变过,不在这展开。
随后,把固定值 \u0002 和 ÿ 添加到该字符串头部
最后,用了一个改了编码表的Base64进行加密,生成Xbogus
三、总结
1.对params两次md5,转16进制数组
2.对body两次md5,转16进制数组
3.对ua rc4加密后,在进行标准Base64,再进行md5,转16进制数组
4.生成19位数组(补充:这个数组包含时间戳和canvas信息),转字符
5.对第四步结果进行rc4
6.拼接字符
7.改Base64编码表,对第六步结果进行Base64
四、测试
http://39.107.101.62:8111/docs