在此之前,我一直都在研究JavaScript相关的反调试技巧。但是当我在网上搜索相关资料时,我发现网上并没有多少关于这方面的文章,而且就算有也是非常不完整的那所种。以在这篇文章中,我打算跟大家总结一下关于JavaScript反调试技巧方面的内容。值得一提的是,其中有些方法已经被网络犯罪分子广泛应用到恶意软件之中了。
对于JavaScript来说,你只需要花一点时间进行调试和分析,你就能够了解到JavaScript代码段的功能逻辑。而我们所要讨论的内容,可以给那些想要分析你的JavaScript代码的人增加一定的难度。不过我们的技术跟代码混淆无关,我们主要针对的是如何给代码主动调试增加困难。
本文所要介绍的技术方法大致如下:
1。检测未知的执行环境(我们的代码只想在浏览器中被执行),
2。检测调试工具(例如DevTools);
3。代码完整性控制;
4。流完整性控制;
5。
反模拟; 引用>简而言之,如果我们检测到了”不正常”的情况,程序的运行流程将会改变,并跳转到伪造的代码块,并“隐藏“真正的功能代码。
<强>一、函数重定义强>
这是一种最基本也是最常用的代码反调试技术了。在JavaScript中,我们可以对用于收集信息的函数进行重定义,比如说,console.log()函数可以用来收集函数和变量等信息,并将其显示在控制台中。如果我们重新定义了这个函数,我们就可以修改它的行为,并隐藏特定信息或显示伪造的信息。
我们可以直接在DevTools中运行这个函数来了解其功能:
console.log (“HelloWorld”); var假=function () {}; 窗口(“控制台”)(“日志”)=假; 控制台。日志(“你看不见我!”);运行后我们将会看的到:
VM48:1 Hello World 引用>
你会发现第二条信息并没有显示,因为我们重新定义了这个函数,即“禁”用了它原本的功能。但是我们也可以让它显示伪造的信息。比如说这样:
console.log (“Normalfunction”);//首先我们保存引用原来的控制台。对数函数 原来var=窗口(“控制台”)(“日志”);//下一个我们创建假的函数//基本上我们检查参数,如果匹配与otherparam我们称之为原始的函数。//如果没有匹配原始函数传递参数 var假=函数(参数){ 如果(参数===癒a0labs”) { 原始(“欺骗!”); 其他}{ 原始(参数); } }//现在我们重新定义控制台。日志作为我们假的函数 窗口(“控制台”)(“日志”)=假;//然后我们称之为控制台。日志与任何争论 控制台。日志(“这是不变的”);//现在我们应该看到其他文本控制台不同“Ka0labs” console.log (“Ka0labs”);//Aaaand一切还好的 console.log(“再见!”);如果一切正常的话:
正常功能
VM117:11拜拜! 引用>
VM117:11这是一成不变的
VM117:9欺骗!
实际上,为了控制代码的执行方式,我们还能够以更加聪明的方式来修改函数的功能,比如说,我们可以基于上述代码来构建一个代码段,并重定义eval函数。我们可以把JavaScript代码传递给eval函数,接下来代码将会被计算并执行。如果我们重定义了这个函数,我们就可以运行不同的代码了:
//正常eval eval (“console.log (‘1337’)”);//现在我们遣返回国… 原始var=eval; var假=函数(参数){//如果代码评估contains1337…… 如果(argument.indexOf (“1337”) !==1) {//颐侵皇侵葱胁煌拇? 原始(”(i=0;我& lt;10;我+ +){console.log (i);} "); } 其他{ 原始(参数); } } eval=假; eval(“控制台。日志(“我们看到这个…”)”);//现在我们应该看到一个for循环的执行,而不是期望是什么 eval(“控制台。日志(Too1337 !)”);运行结果如下:
1337
VM146:1We应该看到这…
VM147:10
VM147:11
VM147:12
VM147:13
VM147:14
VM147:15
VM147:16
VM147:17
VM147:18js经验分享JavaScript反调试技巧