Skip to content
On this page

诸葛找房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 对象添加方法,正是 unsboxhexXor

这里用 Pythonunsbox 进行还原(代码在后面)

输出 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 获取完整代码

关注公众快速了解最新文章。

Released under the MIT License.