在“逆向JS分析实战某违规网站3–还原混淆1”中,已分析并成功找到目标 js 文件vod.js,并在vod.js中找到了目标代码
_0xeb9911 = _0x43f960 + '/' + _0x2ef354[0x0] + '/' + _0x2ef354[0x1] + '/' + _0x2ef354[0x2] + _0x1f08('55', 'Re[3') + _0x2ef354[0x3] + _0x1f08('56', 'aGPI') + _0x2ef354[0x4];
从这种不直观的表达式来看,明显就是进行了混淆处理,但是混淆的力度不大,算是意思意思混淆一下。而这章的目标就是还原该表达式。
注意:资源网页的网页源代码 保存在 B.html 中。
对整个js文件中,_0xeb9911涉及到的参数及这些参数的赋值,其实就如下图所示的范围
把这些代码拷贝进Notepad++中,我们可以看到一个关键的_0x1f08函数,这个函数的作用可以理解为一个解密函数,把传入的参数经过计算后返回对应的明文。当然这个函数也起到了一定的混淆作用,使到逆向人员不能轻松通过明文关键词来找到相关信息。
在同一个js文件中就能找到这个函数源码
去分析这个函数代码不是不行,但是很费时和精力,作为一个懒人来说,是不可能做这种事。既然网页都能使用F12了,那就直接让浏览器来运行_0x1f08函数,从而把得到的函数返回结果进行回填即可。
在此之前我们要做些准备工作,vod.js文件的全称是vod.js?v=一串随机数字,所以每次刷新网页,vod.js的全称都是不一样的,但每个vod.js的内容是一样的,而浏览器只会加载最新的vod.js,因此在旧的vod.js加断点是没办法进行调试的。
此时第一步要解决的是什么时候把最新的vod.js加载进来?
我们刷新下网页(此时Fiddler仍旧开着),然后不做其他操作,只观察
这时,可以看到vod.js其实是已经加载进来了,说明vod.js生成的时机是比执行(function anonymous(){Function(arguments[0]+"bugger")()})
还要早。所以我们要找个比vod.js更早执行的 js 且是固定名称的 js文件。
按照程序都是从上到下执行的特性,符合条件的是 dplayer.min.js 和 tj_vod.js 这两个文件。
由上图可看出 tj_vod.js 是个空文件,而 dplayer.min.js 是有内容的,所以我们把参考目标设为 dplayer.min.js 。
第二步在参考js下断点,然后进行调试。
在“预览”的代码是无法下断点的,因此要在“来源”面板的代码下断。
如图所示,我选择在 dplayer.min.js 的第一行代码和最后一行代码下断,以便我们快速调试。
下好断点后,直接刷新网页,可以看到程序在 dplayer.min.js 的第一行代码断下来了,且此时(function anonymous({Function(arguments[0]+"bugger")()})
还没执行,“网络”界面中 vod.js 也还没出现。
那我们继续执行脚本(F8),可以看到程序去到 dplayer.min.js 第二断点。
接着点击进入下一个函数调用(F11),此时就去到了dplayer.html?v=1的界面。
把这代码和 B.html 的网页源代码一对比,我们不难发现源代码也有相同的地方。
所以第三步对 B.html 的网页源代码进行修改。
参考dplayer.html?v=1的代码,在 B.html 的网页源代码进行修改。
那vod.js?v=多少呢?使用跳过下一个函数调用(F10)来继续调试程序,直到 vod.js 出现,并观察出现的vod.js叫什么名字。
上图明显可以看出,经过几个js文件出现后,vod.js也出现了,那我们就可以直接复制这个vod.js 文件的名称并对 B.html 的网页源代码进行再一步修改。
修改并保存 B.html 后,把在dplay.min.js中下的断点去掉,然后在
vod.js?v=0.3507995514310325formatted的第一行代码和第351行代码下断点。
接着关闭刚才打开的 js 文件,然后重新刷新网页。
可以看到程序在vod.js?v=0.3507995514310325formatted的断点处停下来了。到此调试前的准备工作已完成。
下面以此代码为例进行调试。
var _0x2ff936 = _0x1f08('45', 'HFRO');
该代码位于第354行,因此把程序运行到第355行,然后即可查看_0x1f08函数返回给 _0x2ff936的值。
依次操作,即可得到以下结果:
然后稍微处理下便可得到下图结果:
从图中的第24行可看出_0xeb9911的表达式已经还原成我们能看懂的样子,是和抓包得到链接地址是一致的。
到此,就已成功还原_0xeb9911。
总结:
1、对于变化名称的 js 文件,要善于寻找参考 js 文件,然后对网页源代码进行修改,使变化名称的目标 js 文件变成固定名称,从而让我们方便调试目标 JS 文件。
2、这个网页的混淆仍算仁慈,还留有可视字符作为关键词进行搜索,但如果把地址全混淆,关键词便会失去作用。你又会如何入手分析?