其在第 22 行,是个大数组,补了之后运行程序后发现卡住了,一段时间后程度报错:
这个报错可能是内存资源耗尽导致程序崩溃了,将这部分代码复制到浏览器中进行调试,开启一个新页面,打开开发者人员工具,在 Sources 中选择 Snippets,新建一个脚本,将已经扣下来的代码粘贴进去,在第一行写入 debugger;手动打断点调试,ctrl + s 保存文件后点击右下角按钮运行脚本即会在第一行断住:
点击单步调试,一步步查看是哪里出了问题:
点了几步后,卡了一下,跳到第 2711 行,是个 for 循环,右侧出现红框报错,意思是潜在的内存崩溃,即单步调试断到到此处时程序临近内存崩溃:
接着往后单步调试,会发现一直在第 2712 行和第 2713 行间来回执行,到后来甚至浏览器崩溃了,所以问题出在 WxzuQr 对象中出现了无限循环,直至耗尽了内存资源:
这部分内容在 $dbsm_0x42c3 函数中,接下来需要研究一下崩溃原因,右侧堆栈中向上跟栈,上两步分别通过构造函数创建了两个实例对象 WjJIeN 和 vnuqco,WjJIeN 部分如下:
_0x11a714['prototype']['WjJIeN'] = function(_0x4859ef) {
if (!Boolean(~_0x4859ef)) {
return _0x4859ef;
}
return this['WxzuQr'](this['yewpLt']);
}
这里进行了一个 if 判断,~ 为按位取反,意思是如果 !Boolean(~_0x4859ef) 的值为 false,则执行 WxzuQr 的无限循环行为,直至程序崩溃,接着跟进到 vnuqco 部分,查看 _0x4859ef 是啥,对什么进行了判断:
_0x11a714['prototype']['vnuqco'] = function() {
_0x2940ac = new RegExp(this['PuKGlh'] + this['CTXIfT']),
_0x3fba94 = _0x2940ac['test'](this['XxpyjG']['toString']()) ? --this['yHmSUE'][0x1] : --this['yHmSUE'][0x0];
return this['WjJIeN'](_0x3fba94);
}
返回值中给 WjJIeN 传入的参数为 _0x3fba94,其定义在第 2699 行,是个三目表达式:
_0x2940ac['test'](this['XxpyjG']['toString']()) ? --this['yHmSUE'][0x1] : --this['yHmSUE'][0x0];
到控制台打印输出一下,看看该行各部分什么含义:
--this['yHmSUE'][0x1] 的值固定为 -1,而每运行一次 this['yHmSUE'][0x0] 的值即减一:
console.log(!Boolean(~-1)) // true
console.log(!Boolean(~-2)) // false
所以只有当 _0x2940ac['test'](this['XxpyjG']['toString']()) 的值为 true 时才不会进入无限循环,在控制台打印下 this['XxpyjG']['toString']() 部分内容: