Appearance
诸葛找房Cookie之acw_sc__v2分析
声明
逆向目标
网址:aHR0cHM6Ly9zaC5lc2Z4aWFvcXUuemh1Z2UuY29tL3BhZ2UxLw==
目标:找到 Cookie acw_sc__v2
的生成逻辑
抓包分析
经过模拟请求分析后,发现主要核心 Cookie 为 acw_sc__v2
,只要携带正确的 acw_sc__v2
,则就可以正常请求到目标网站的数据。
参数定位
为了找到 acw_sc__v2
在哪里生成,直接使用 无痕模式
提前打开 DevTools(F12)
,打开网站,发现直接断在了下图位置
这个明显是 无限 debugger
,右边有几处调用栈信息,点击查看
在 Network
中点击访问的页面,发现返回的内容就是以上的 JS 内容
发现最后调用了 reload
方法设置了 acw_sc__v2
,其中 x
参数就是要设置的 Cookie 值,只要找到哪里调用了 reload
,就水落石出了,直接搜索 reload
字符串,发现在其他地方都没找到,初步猜测是因为 JS 代码混淆的原因,接下来先把 JS 代码利用 AST 做下简单的还原。
混淆还原
看上面的代码,字符串字面量都被转换成了十六进制编码,这里使用 mk-ast-tool
,GitHub地址:https://github.com/Mankvis/mk-ast-tool(欢迎大家点下 Star)进行下简单还原,也就是字符串字面量还原。
1.
打开 mk-ast-tool
项目,在 pro
文件中创建项目文件 zhuge.js
,因为这里只进行了简单的字符串字面量还原,所以直接使用公共插件中的 字符串还原 插件即可。2.
把网站中混淆的 JS 代码保存到本地放在根目录下,本文命名为 zhuge.js(命名自己随意)
,3.
执行命令 node main.js zhuge zhuge.js
,就会在根目录下输出 zhuge_output.js
还原后到代码。
编写还原文件
执行还原命令
js
node main.js zhuge zhuge.js
具体的使用方法请查看项目 mk-ast-tool
,GitHub地址:https://github.com/Mankvis/mk-ast-tool(欢迎大家点下 Star)。
查看还原结果
参数分析
上面通过 AST 还原了代码, 找到了实际就是要找到 arg2
的生成逻辑,这时候返回浏览器,在刚才的 JS 代码中,找到 arg2 直接下断。
然后回到当前断点,处理下 无限 debugger
,处理方法很简单,直接在当前 debugger 行右键,选择 Never pause here
即可
⚠️upload failed, check dev console
然后 F8
执行,直接来到了刚才下断点的地方
把上面的核心代码扣出来如下
js
var arg1 = '312B5604AF801D581BF9A4FF6F38AB78D8233A02'; // 定义在文件头部
var _0x5e8b26 = _0x55f3('0x3', '\x6a\x53\x31\x59'); // 定义在中间部分
var _0x23a392 = arg1[_0x55f3('0x19', '\x50\x67\x35\x34')]();
arg2 = _0x23a392[_0x55f3('0x1b', '\x7a\x35\x4f\x26')](_0x5e8b26);
setTimeout('\x72\x65\x6c\x6f\x61\x64\x28\x61\x72\x67\x32\x29', 0x2);
arg1
定义在头部,每次刷新都会变动,所以后面要动态的去获取计算,_0x55f3
两个参数是固定的,所以 _0x5e8b26
的值应该可以固定。如果硬扣 _0x55f3
会发现进入死循环,推荐还是写固定值。
还原后的核心代码
js
var arg1 = '312B5604AF801D581BF9A4FF6F38AB78D8233A02';
var _0x5e8b26 = '300017600085600XXXXXX3003690027800375';
var _0x23a392 = arg1["unsbox"]();
arg2 = _0x23a392["hexXor"](_0x5e8b26);
setTimeout("reload(arg2)", 0x2);
代码网上找,发现了对 String
对象添加方法,正是 unsbox
、hexXor
。
这里用 Python
把 unsbox
进行还原(代码在后面)
输出 52AFF7C0B359B1A109F314A48684E803FEB9EA6C
接着把 hexXor
还原(代码在后面)
输出 62afe0a0b3dcd1a70fe615f7b6878103d939e919
,这个也就是最终需要的 Cookie 了。
最终效果
部分代码
JS 部分代码
js
var _0x5e8b26 = _0x55f3("0x3", "jS1Y");
String[_0x55f3("0x5", "n]fR")][_0x55f3("0x6", "Pg54")] = function (_0x4e08d8) {
var _0x5a5d3b = "";
for (var _0xe89588 = 0x0; _0xe89588 < this[_0x55f3("0x8", ")hRc")] && _0xe89588 < _0x4e08d8[_0x55f3("0xa", "jE&^")]; _0xe89588 += 0x2) {
var _0x401af1 = parseInt(this[_0x55f3("0xb", "V2KE")](_0xe89588, _0xe89588 + 0x2), 0x10);
var _0x105f59 = parseInt(_0x4e08d8[_0x55f3("0xd", "XMW^")](_0xe89588, _0xe89588 + 0x2), 0x10);
var _0x189e2c = (_0x401af1 ^ _0x105f59)[_0x55f3("0xf", "W1FE")](0x10);
if (_0x189e2c[_0x55f3("0x11", "MGrv")] == 0x1) {
_0x189e2c = "0" + _0x189e2c;
}
_0x5a5d3b += _0x189e2c;
}
return _0x5a5d3b;
};
String["prototype"][_0x55f3("0x14", "Z*DM")] = 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["length"]; _0x20a7bf++) {
var _0x385ee3 = this[_0x20a7bf];
for (var _0x217721 = 0x0; _0x217721 < _0x4b082b['length']; _0x217721++) {
if (_0x4b082b[_0x217721] == _0x20a7bf + 0x1) {
_0x4da0dc[_0x217721] = _0x385ee3;
}
}
}
_0x12605e = _0x4da0dc["join"]("");
return _0x12605e;
};
var _0x23a392 = arg1[_0x55f3("0x19", "Pg54")]();
arg2 = _0x23a392[_0x55f3("0x1b", "z5O&")](_0x5e8b26);
setTimeout("reload(arg2)", 0x2);
Python 部分代码
python
def unsbox(arg1):
_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]
_0x4da0dc = []
for i in _0x4b082b:
_0x4da0dc.append(arg1[i - 1])
_0x12605e = "".join(_0x4da0dc)
return _0x12605e
def hexxor(s1, _0x4e08d8):
_0x5a5d3b = ""
for i in range(len(s1)):
if i % 2 != 0:
continue
_0x401af1 = int(s1[i: i + 2], 16)
_0x105f59 = int(_0x4e08d8[i: i + 2], 16)
_0x189e2c_10 = (_0x401af1 ^ _0x105f59)
_0x189e2c = hex(_0x189e2c_10)[2:]
if len(_0x189e2c) == 1:
_0x189e2c = '0' + _0x189e2c
_0x5a5d3b += _0x189e2c
return _0x5a5d3b
完整代码
关注微信公众号【趣码周
】回复 zgzf
获取完整代码
关注公众快速了解最新文章。