最近发现某网站初始化请求失败,cookie做了改版,于是简单分析了下
一、本地分析
请求之后 会发现状态码是 200 但是返回的是JS代码 em。。
其实这里已经可以发现 是对cookie进行了操作 document.cookie=xxxx
function reload(x) {setCookie("acw_sc__v2", x);document.location.reload();}
这里可以发现是加了acw_sc__v2这个cookie的值 然后页面再reload下
好了 我们直接把这一部分JS代码丢到美化里面 看看
言简意赅 这个函数直接就是设置cookie 也没加什么混淆 嵌套函数啥的 (-,- 友好)
接着就是分析这个value 也就是这个x是怎么来的了
这里可以发现 是调用了reload函数传了x 我们直接在代码里搜索哪里调用了这个函数
接着你会发现 上面有个定时函数 执行了这个reload函数 然后里面这个arg2 很明显就是加密后的值
那么就看看 这个arg2怎么来的
本地分析的已经差不多了 接着就去调试看看吧
二、调试
1.反调试
不出所料哈 进入了反调试
果然debugger是少不了的(可以看到字符串加了编码) 那么这里的话 我们这样解决
直接看上个调用栈
这里会发现 他是为了 生成这个debugger字符串 进行了拼接
好了 这里就不去分析怎么生成的 我们直接干掉这个触发debugger的函数
触发debugger的函数叫 _0x355d23 那么就这样
我们直接把这个函数置为空函数 为什么这么做?(因为代码后面你会发现还有个定时器)
这里就是触发这个debugger的定时器函数 直接从源头干掉
ok!
反调试过了 接着往下走
这里会发现 这里会调用arg1的unsbox方法 arg1是字符串 可没有这个方法 那么这个方法哪里来的?
首先要给字符串定义新方法的话 那肯定是要通过 String['prototype']
这个属性的
那么往上面看看代码
果然在这里就定义了 String的unsbox方法
这个方法也会返回一段字符串
接着是把上面那个字符串 再通过hexXor方法 和一个参数生成arg2
同理 这个hexXor方法在这里
那么再看看这个参数 (经测试 这个参数的值是固定的 可写死 -,-)
好了 把js代码扣到本地 试试
三、扣代码
先看看 本地生成的 和web端是否一致
是一样的哈
ok! 扣出代码 改一下
String['prototype']['hex'] = function hex(_0x4e08d8) {
var _0x5a5d3b = '';
for (var _0xe89588 = 0x0; _0xe89588 < this['length'] && _0xe89588 < _0x4e08d8['length']; _0xe89588 += 0x2) {
var _0x401af1 = parseInt(this['slice'](_0xe89588, _0xe89588 + 0x2), 0x10);
var _0x105f59 = parseInt(_0x4e08d8['slice'](_0xe89588, _0xe89588 + 0x2), 0x10);
var _0x189e2c = (_0x401af1 ^ _0x105f59)["toString"](0x10);
if (_0x189e2c["length"] == 0x1) {
_0x189e2c = '\x30' + _0x189e2c;
}
_0x5a5d3b += _0x189e2c;
}
return _0x5a5d3b;
}
String['prototype']['unsbox'] = function() {
var _0x4b082b = [0xf, 0x23, 0x1d, 0x18, 0x21, 0x10, 0x1, 0x26, 0xa, 0x9, 0x13, 0x1f, 0x28, 0x1b, 0x16, 0x17, 0x19, 0xd, 0x6, 0xb, 0x27, 0x12, 0x14, 0x8, 0xe, 0x15, 0x20, 0x1a, 0x2, 0x1e, 0x7, 0x4, 0x11, 0x5, 0x3, 0x1c, 0x22, 0x25, 0xc, 0x24];
var _0x4da0dc = [];
var _0x12605e = '';
for (var _0x20a7bf = 0x0; _0x20a7bf < this['\x6c\x65\x6e\x67\x74\x68']; _0x20a7bf++) {
var _0x385ee3 = this[_0x20a7bf];
for (var _0x217721 = 0x0; _0x217721 < _0x4b082b['length']; _0x217721++) {
if (_0x4b082b[_0x217721] == _0x20a7bf + 0x1) {
_0x4da0dc[_0x217721] = _0x385ee3;
}
}
}
_0x12605e = _0x4da0dc['\x6a\x6f\x69\x6e']('');
return _0x12605e;
}
function get_awc2(str1){
r1 = str1.unsbox()
r2 = r1.hex("3000176000856006061501533003690027800375")
return r2
}
最重要的来了
接着py模拟试试
OK! 成了