根据之前的经验,看看是不是哪又有个格式化检测导致进入到这个循环里,果不其然,在第 55 行:
这里是对 removeCookie 处的代码进行了格式化检测,同样将函数体部分写成一行即可:
'removeCookie': function() {return 'dev';},
接着运行,又提示 _0x3c9ca8 未定义,ctrl + f 局部搜索找到函数定义位置扣下来即可,运行后又提示 _0x1316f4 未定义,这个扣下来之后记得将后面的自执行的括号删掉,接着会提示 _0x12a78e 未定义,扣下来的时候同样记得删掉末尾的括号,再接着就没什么特别需要注意的了,差哪个函数补哪个就行了,到后面提示 navigator 未定义,简单地补浏览器环境即可,node 环境下 window 设置为 global:
var window = global;
window.navigator = {};
自然不会这么轻易的结束了,运行后又会提示 _0x184fb0 未定义,跟之前一样,搜到扣下来即可,后面就是漫长的补函数的过程,没别的技巧,就是需要耐心,手都 cv 酸了,直到出现如下报错:
报错提示 history 未定义,这是个浏览器对象,显示在 console.log 处报错,在 console.log 行打断点调试,运行到这里时会跳转到虚拟机中,其中代码如下:
history.pushState 是向浏览器的会话历史中添加记录,当使用 console.log 输出结果的时候,就会执行 history.pushState,但是我们并没有 history 环境,所以会报错,补了 history 环境后运行程序发现一直卡着,仔细看代码才发现有个 while 循环,最离谱的是里面的 for 循环设置了 1100000 次,几乎可以说是在不间断检测,等不得等到猴年马月去了,这里直接将 console.log 赋值给一个变量替换掉即可,记得放到前面:
var result = console.log;
至此,终于结束了!成功打印出 m 参数的值:
这个题倒是不难,逆向下来思路也很清晰,但是扣代码的过程繁杂且坑不少,还是很值得大家上手去练习的。
完整代码
bilibili 关注 K 哥爬虫,小助理手把手视频教学:https://space.bilibili.com/1622879192
GitHub 关注 K 哥爬虫,持续分享爬虫相关代码!欢迎 star !https://github.com/kgepachong/
以下只演示部分关键代码,不能直接运行!
JavaScript 代码
var window = global;
window.navigator = {};
var result = console.log;
// 以下部分内容过长,此处省略
// 完整代码关注 GitHub:https://github.com/kgepachong/crawler
function _0x313b78(_0x575158, _0x1fa91a, _0x1cf5de) {
if (_0x5500bb[$dbsm_0x42c3(QoLq0i, q0Oqqo) + 'ZI'](_0x5500bb[$dbsm_0x42c3(LQOI0Q, QqOI00) + 'sB'], _0x5500bb[$dbsm_0x42c3(Q00oiq, QIioOo) + 'Zv'])) {
VWQQuv['oOa' + 'hG'](debuggerProtection, Q0LiqQ);
} else {
_0x5500bb[$dbsm_0x42c3(i1lQqq, q110Lq) + 'bE'](_0x3c9ca8);
return _0x1fa91a ? _0x1cf5de ? _0x5500bb[$dbsm_0x42c3(iqqLQO, LoOOOq) + 'Kk'](_0x21cf21, _0x1fa91a, _0x575158) : _0x5500bb['rqu' + 'KQ'](y, _0x1fa91a, _0x575158) : _0x1cf5de ? _0x5500bb[$dbsm_0x42c3(qLQQ1q, I1oOQ1) + 'Mn'](_0x443ca7, _0x575158) : _0x5500bb[$dbsm_0x42c3(qLLoQi, iO0OQo) + 'Mn'](_0x184fb0, _0x575158);
}
}
function getCookieM(){
var _0x160e3a = Date.parse(new Date());
var m = _0x313b78(_0x160e3a) + lOo0QQ + _0x160e3a;
return m;
}
// var _0x160e3a = Date.parse(new Date());
// var m = _0x313b78(_0x160e3a) + lOo0QQ + _0x160e3a;
// result(m);