此文章仅限学习使用. 如有侵权 请联系我删除. 谢谢.
开始今天愉快的分析
rbzid会自动请求domain/kramericaindustries.ac.lib.js执行一个js 自动去发送get请求
请求的headers会有一个x-zebra-********: 一段参数
这串东西就是今天我们要逆向分析的字段
那么直接用charles替换本地文件
之后在开头加入hook get请求代码 断住
// 保存原始的XMLHttpRequest.open方法
const originalXHROpen = XMLHttpRequest.prototype.open;
// 覆盖XMLHttpRequest的open方法
XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
// 检查是否为GET请求
if (method === 'GET') {
debugger; // 当发出GET请求时触发
}
// 调用原始的open方法
return originalXHROpen.apply(this, arguments);
};
成功进入debugger
这里的js我用了蔡老板星球里面的`代码结构调整`搞了下 如果需要学习js反混淆 可以加入蔡老板的星球
往上找看到e7参数里面已经有我们想要的东西了 且这个函数只接受了两个参数 那么继续往上找
直接分析这里的第一个参数 就是上面的x43
分析这段代码 单步跟进 T7[6] 的赋值
这里先将rbzns.seed字符后面加一个0
继续
这里我没解混淆.所以就在控制里面打出来这个参数是怎么来的
btoa(i7[7][s3S.l8(104)](Y7[18]))[s3S.w8(127)](/\u003d/g, s3S.w8(61))
那么就可以简化为
btoa(i7[7]).join(";$(hash);_xcalc(arguments.calle);").replace(/\=/g,"-")
直接分析i7[7]即可
i7[7]是一个5个长度的数组
开始分析第一个值 跟进去 发现是一串计算得来的数
先不管这一系列的计算 直接弯道超车 看返回值
这里我试着直接将整串代码丢进去chatgpt里面 进行分析得知有可能是sha1加密
二话不说直接验证 发现跟返回值是一样的 那么第一个值解决
第二个值固定是0
第三个值搜一下全局 Y7[7] 发现
Y7[7] = (new Date()[s3S.w8(132)]() * 123456789)[s3S.w8(54)]();
可以简化为
Y7[7] = (-480 * 123456789).toString()
第四个值固定值是"disabled"
第五个值其实就是最开始的window.rbzns.seed
至此 数组全部解决
继续分析headers的key和get请求的地址url的生成 根据debugger发现是这个b7[1]
那么整段代码拿出来
var e7 = [arguments];
e7[5] = P(8);
e7[2] = P(32);
e7[3] = {};
s3S.B7(18);
e7[7] = s3S.W2(18, 13, 6, 12);
e7[3][s3S.l8(e7[7]) + e7[5]] = e7[0][0];
function G5() {
}
console[s3S.w8(39)](s3S.w8(14), e7[3]);
1;
Y7[4](s3S.l8(63));
Y7[8][s3S.w8(124)](function () {
var b7 = [arguments];
b7[1] = {};
b7[1][s3S.l8(84)] = [s3S.w8(116), s3S.w8(101), e7[2]][s3S.l8(104)](s3S.l8(92));
b7[1][s3S.l8(91)] = e7[3];
s3S.n8S();
return b7[1];
通过debugger和分析;
得知url跟e7[2]有关
headers跟e7[5]有关
那么这两个都是P函数生成的
看看P函数做了什么
比较简单 根据传参长度生成随机字符串的函数 期间使用charAt函数
那么直接转成js代码
// 生成随机字符串的函数
function randomStr(length) {
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let result = '';
const charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
那么一拼接 就得到最后的结果了
验证下 cookie 搞定.
代码就自己写了 不会提供成品 此分析比较简单.
在此谢谢cbb不不哥,挽风和蔡老板的星球.
接下来有空可以再带来incapsula的utmvc和reese84的分析.