JavaScript奇技淫巧:反Eval调试

JavaScript奇技淫巧:反Eval调试

Eval的正规用法是执行一段JS代码。

但它做为代码分析者的手段,也经常被用于调试分析:用eval运行某些函数,获得返回值、了解代码执行结果。

如何反eval调试、防止代码被eval执行?

我们可以在函数中抛出一个错误并捕获其堆栈跟踪,进而来检查调用栈中是否包含eval,便可识别是否是被eval调试,并可做出相应的操作。

例程:

执行效果:

实际使用中,为了防止反Eval的代码逻辑被看到,当然不会使用console.log提示,可以换作return错误的值之类。还要将代码进行混淆加密,比如用JShaman进行JS代码混淆后,上面的示例可以变成难以阅读和理解的代码形式:

注意:

这个方式,可用于浏览器或Node.JS中检测eval。但在某些特殊的运行环境中,例如:微信、支付宝等H5小游戏中的代码,是不可以使用的,因为这些场景中经常也是使用eval来执行代码的,阻止了eval执行会导致错误。如下图:

但这似乎也说明用此方式反eval确实是够强大的。

本文节选自开源电子书《JavaScript奇技淫巧》

https://github.com/w2sft/JavaScript-diabolic-tricks-and-wicked-craft

《JavaScript奇技淫巧》目录

看一段js是否存在流氓行为或漏洞?反混淆出场,建议收藏

当开发者或安全研究人员想了解一个web应用下的js是否存在漏洞,流氓行为,以及是否由侵权及不合规问题时,往往发现遇到的js已经被混淆加密了,非常难以阅读,甚至看起来像天书。这个时候要么放弃,要么作为有追求的大佬可能想到将这个js代码进行反混淆,目的是让代码重新变得容易阅读。网上人们所说的Javascript DeObfuscator 都是指对JavaScript 代码混淆并消除混淆的描述。 就如前面所说的一样,它对 JavaScript 混淆代码进行重新编码,将其恢复为原始代码。

一个简单但功能强大的反混淆器,用于消除常见的 JavaScript 混淆技术和工具,它主要采取以下原理:

1.解压包含文字(字符串、数字等)的数组并替换对它们的所有引用

2.删除简单代理函数(调用另一个函数)、数组代理函数和算术代理函数(二进制表达式)

3.简化算术表达式

4.简化字符串连接

5.重命名不可读的十六进制标识符(例如 _0xca830a)

6.将计算转换为静态成员表达式并美化代码

deobfuscate.io反混淆

反混淆过程中支持:特征检查 ,字面量可视化, 简化重复值, 控制流复原, 删除死代码, 强制删除死代码等多种处理模式和选项。

JAVASCRIPT 混淆及反混淆代码工具

在我们开始学习反混淆之前​,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。

混淆是一种技术,用于使脚本更难以被人类阅读,但从技术角度来看,它可以发挥相同的功能,尽管性能可能会较慢。这通常是通过使用混淆工具自动实现的,该工具将代码作为输入,并尝试以更难以阅读的方式重写代码,具体取决于其设计。

例如,代码混淆器通常将代码转换成代码中使用的所有单词和符号的字典,然后在执行期间尝试通过引用字典中的每个单词和符号来重建原始代码。以下是一个简单的 JavaScript 代码被混淆的示例:

开发人员考虑混淆代码的原因有很多。一个常见的原因是隐藏原始代码及其功能,以防止在未经开发人员许可的情况下重复使用或复制它,从而使对代码的原始功能进行逆向工程变得更加困难。另一个原因是在处理身份验证或加密时提供安全层,以防止对代码中可能发现的漏洞进行攻击。

​必须注意的是,不建议在客户端进行身份验证或加密,因为这样代码更容易受到攻击。​​

然而,混淆最常见的用途是用于恶意行为。攻击者和恶意行为者通常会混淆其恶意脚本,以阻止入侵检测和防御系统检测其脚本。

代码混淆通常不是手动完成的,因为有许多针对各种语言的工具可以自动进行代码混淆。尽管许多恶意行为者和专业开发人员开发了自己的混淆工具以使反混淆变得更加困难,但许多在线工具都可以这样做。

明文示例

让我们以下面这行代码为例,尝试对其进行混淆:

明文运行打印出来是:

Hello JavaScript Deobfuscation

混淆示例

现在,让我们混淆我们的代码行,使其更加晦涩难懂。首先,我们将尝试使用BeautifyTools来混淆我们的代码:

混淆输出

我们发现我们的代码变得更加混乱且难以阅读。我们可以将此代码复制到https://jsconsole.com,以验证它仍然执行其主要功能:

虽然加壳器在降低代码的可读性方面做得很好,但我们仍然可以看到它的主要字符串以明文形式编写,这可能会揭示它的一些功能。这就是为什么我们可能想要寻找更好的方法来混淆我们的代码。

到目前为止,我们已经能够使我们的代码变得模糊并且更难以阅读。但是,该代码仍然包含明文字符串,这可能会揭示其原始功能。我们将尝试一些工具,它们应该完全混淆代码并隐藏其原始功能的任何残留。

有一个在线的混淆工具:JavaScript Obfuscator Tool

一个免费且高效的 JavaScript 混淆器(包括对 ES2022 的支持)。使您的代码更难复制,并防止人们窃取您的工作。这个工具是一个由Timofey Kachalov创建的优秀(和开源) javascript-obfuscator@4.0.0的Web UI。

让我们访问https://obfuscator.io。在单击 之前obfuscate​​,我们将更改为:[Strings Transformations]->[String Array Encoding​​]->Base64​​如下所示:

现在,我们可以粘贴代码并单击obfuscate​​:

这段代码显然更加混乱,我们看不到原始代码的任何残余。我们现在可以尝试在https://jsconsole.com中运行它,以验证它是否仍然执行其原始功能。尝试使用https://obfuscator.io中的混淆设置来生成更多混淆代码,然后尝试在https://jsconsole.com中重新运行它以验证它仍然执行其原始功能。

现在我们应该清楚地了解代码混淆是如何工作的。代码混淆工具仍然有很多变体,每种工具对代码的混淆方式都不同。

我们可以尝试在JSF中使用相同的工具来混淆代码,然后重新运行它。我们会注意到,代码可能需要一些时间才能运行,这表明代码混淆如何影响性能,如前所述。

明文代码:

混淆代码:

使用 jjencode 进行实际攻击并不是一个好主意。它轻松解码。jjencode 不是功利性的混淆,只是一个编码器。太有特色了。很容易被发现。取决于浏览器。该代码无法在某些类型的浏览器上运行。

aaencode – 将任何 JavaScript 程序编码为日式表情符号 (^_^) 方式进行混淆,挺有意思的

明文代码:

混淆代码:

然而,此类混淆器通常会使代码执行/编译速度非常慢,因此不建议使用它,除非有明显的原因,例如绕过网络过滤器或限制。

现在我们了解了代码混淆的工作原理,让我们开始学习反混淆。正如有自动混淆代码的工具一样,也有自动美化和反混淆代码的工具。

我们可以找到许多优秀的在线工具来反混淆 JavaScript 代码并将其转换为我们可以理解的东西。JSNice是一个很好的工具。让我们尝试复制上面的混淆代码并通过单击Nicify JavaScript​​按钮在 JSNice 中运行它。

示例

如之前代码:

使用JSNice进行反混淆得到结果:

尽管到目前为止,这些工具在将代码清理成我们可以理解的内容方面做得很好,但一旦代码变得更加模糊和编码,自动化工具清理它就会变得更加困难。如果使用自定义混淆工具对代码进行混淆,则尤其如此。

我们需要手动对代码进行逆向工程,以了解它是如何被混淆的以及它在这种情况下的功能。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。