这个函数在第 2689 行,再来看看对其进行了怎样的判断,跟进到 _0x2940ac 定义位置,在第 2698 行,是个正则表达式对象,控制台中打印后可知道表达式为:
/w+ *() *{w+ *['|"].+['|"];? *}/
- / ... /:正则表达式限制符,字面量写法,防转义,中间正则表达式部分若存在 d 不会将 d 的 当作转义字符
- *():匹配零个或多个括号, 为转义字符
- *{ 、*}:匹配前后大括号
- w+:匹配一个或多个字母数字字符
- .+:贪婪匹配任意字符
- ['|"]:匹配单引号或者双引号
- ;?:匹配零个或一个分号
所以匹配样式大致如下:XXX( ){ XXX ' XXX ' ;},并不匹配换行符、制表符、空格等,没格式化的代码会被压缩成一行,所以这里相当于格式化检测,由于一开始进行了格式化操作,因此判断结果为 false,从而进入了无限循环,导致程序崩溃,所以只需要将这部分内容压缩为一行即可,检验一下:
没有格式化后打印出的结果为 true,即不会调用到 WxzuQr 对象,从而进入无限循环,修改后再次运行程序,结束了吗,当然没有,上个问题倒是解决了,又出现了以下报错:
报错在第 3854 行,内容如下:
_0x5500bb[$dbsm_0x42c3(QoLq0i, q0Oqqo) + 'ZI']
接着在浏览器中进行调试,在这一行上面打上 debugger;然后运行脚本,断住后打印分析一下:
'ZI' 即 ‘ZI’,QoLq0i、q0Oqqo 为定值,因此问题出在 $dbsm_0x42c3 函数中,其实如果对 OB 混淆了解的话会知道这种混淆方式有一些特征,其一般由三部分组成:大数组、移位自执行函数、解密字符串函数,大数组我们之前已经找到了,就是 $dbsm_0x123c,而 $dbsm_0x42c3 是解密字符串函数,这里差了个移位自执行函数,缺东西自然结果会不对,需要找到将其补上,在第 23 行到第 93 行,夹在 $dbsm_0x123c 和 $dbsm_0x42c3 之间,补完后运行程序,又到了熟悉的卡住,过了一会后报错:
报错在第 27 行,放到浏览器中进行调试,还是在开头打上 debugger;运行后单步向下执行,点了几下熟悉的卡住,然后跳到第 24 行 for 循环处:
右侧出现熟悉的警告提示,证明又进入到无限循环了,果不其然,过了一会浏览器页面就崩溃了: