1 还是使用XHR定位(以抖音评论为例)
2 添加日志断点
清空控制台,禁用断点,放开断点。
启用断点后 点击打开二级评论,查看生成的日志
3 加减乘数算法日志点
监测栈v[p]的变化,包括加减乘除,取余,位运算等运算参数和结果来推算加密算法。
a_b参数是由其他参数加密而来,
看到参数加上dhzx,经过n方法运算之后结果是一个32为数组。查看n方法
将整个方法搞下来
补充函数环境,将参数传入看下结果跟网页端是否一致
看到数组是一致的,继续看下一个apply 好像又实用这个方法加密了一次。验证一下
这里卡了很长时间。
观察日志,一直在执行 减法操作,一直到v[p]-=0.后面开始循环执行* + % charCodeAt() + % 操作
第一次执行这个循环操作时,*操作的参数E=255 p=0,v[p]=0.做一个条件断点,单步调试 查看程序执行过程.
再新增日志断点(这一步需要耐心,多打几个条件断点)
触发评论 查看控制台。t74先制作了一个256长度的数组,数组内容是从255-0的值
后面观察数组变化(这里也花费很多时间)
发现* + % charCodeAt() + % 循环之后最后%得到一个索引值,它与循环次数的做索引值,在255-0数组中取得的两个数字位置进行交换
那么这个计算值怎么计算来的?
来看第一步乘法:
238是上一次计算结果,251是下一次要交换的位置的值,多往下翻几个循环验证一下
第五次结果
下次乘法应该是25073
第六次结果是155
下次乘法应该是253155(索引值乘以上次计算结果)
加法运算(上次计算结果+乘法结果)
求余运算:
被除数v[p]是索引值,除数E是3,向后翻找E的值一直是3,所以这步求余的结果只在0-2之间一直循环。
charCodeAt 方法运算:
参数是上一步求余的结果。那么是谁在掉用这个方法呢??
这里向大佬求助了……
搜索fromCharCode方法(将数字或数组转换为字符串)
注意:里面的数组[0.00390625, 1, 8] 是不断变化的
再使用生成的字符串调用charCodeAt
后面是第二次加法运算
E的值前一步charCodeAt 的返回值,v[p]是上一次加法的结果
循环最后一步 上一步结果对256求余
这两步需要多翻几个循环进行验证。
尝试用js代码还原一下这个过程
点击查看代码
// 创建一个长度为256的数组
const array = new Array(256);// 使用fill和map方法填充数组
const arr256 = array.fill().map((_, index) => 255 - index);console.log(arr256);
change_index = 0 //change_index是计算结果索引,arr256[change_index] 与循环索引值交换位置。第一是0,后面是计算得来
for(let index=0;index<256;index++){val = arr256[index]//当前索引位置的值// 乘法操作mul1 = val*change_index// 加法操作s = mul1+change_index// index 对3 求余rem = index % 3// 通过fromCharCode 获取字符串str = String.fromCharCode.apply(null,[0.00390625, 1, 8])// charCodeAt 操作str_index = str.charCodeAt(rem)// mul2加法操作mul2 = s + str_index// 第二次求余rem2 = mul2 % 256 // 第二次计算的结果即第change_indexchange_index = rem2// 进行交换arr256[index] = arr256[change_index]arr256[change_index] = val}
console.log(arr256)