如何打败混淆的JavaScript代码的反混淆技术?

5

这是一个通用问题

我在一些网站上看到了JavaScript代码的混淆

当你试图使用标准的反混淆工具(deobfuscatejavascript.com,jsnice.org和jsbeautifier.org)反混淆代码时,代码并不容易被反混淆

我知道实际上很难避免反混淆。我想让攻击者很难反混淆它

请建议我一些方法来实现这个目标

我应该编写自己的混淆器,然后再用另一个在线混淆器混淆输出。这样行吗?

谢谢提前

P.S:我尝试过Google Closure Compiler,UglifyJS,JS-Obfuscator和一堆其他工具。无论是单独使用还是组合使用,都不能打败反混淆工具。


1
攻击者是什么意思?因为如果你的代码容易受到攻击(例如,你是否在客户端存储密码),那么混淆JS并不能起到帮助作用。 - Andy
2
你试图防御什么?混淆器只有在防止代码盗窃方面才有用... - Eugene Sh.
1
这真的必要吗?在我看来,缩小代码是混淆JS代码唯一有效的用法。就像你自己说的,你无法避免反混淆。如果你试图防止人们“窃取”你的源码,那么停止为Web开发或使你的客户端网站静态化,并将所有重要逻辑放在服务器上。最后,作为Web开发人员,或者真的作为程序员,我们必须意识到,我们都不是特别的雪花。许多程序员和公司(包括微软现在!)故意发布甚至他们的编译代码。 - Michael L.
2
想要隐藏代码吗?将其保留在服务器端。 - Paul S.
1
您可能会对Programmers SE上的“代码混淆的理由?”感兴趣。那里的答案基本上与这里的人们说的一样:您可以减慢试图阅读您的JavaScript的人的速度,但您无法使其不可能被阅读。 - BSMP
1
现在的问题是:你的代码真的那么有趣吗?如果它被混淆了,人们会尝试去反混淆它吗? - Eugene Sh.
4个回答

2
混淆可以在几个不同的复杂程度上实现。
大多数可用的混淆器会混淆(缩短?)标识符并删除空格。代码的漂亮打印可以恢复良好的缩进;通过付出努力和许多猜测,可以恢复有意义的标识符名称。因此,人们说这是弱混淆。他们是对的;有时这已经足够了。 [加密不是混淆;它很容易被反转]。
但是,可以以更复杂的方式混淆代码。特别是,可以利用图灵陷阱以及关于混淆程序的推理在实践中可能很难/不可能的事实。可以通过混淆控制流并注入不透明的控制流控制谓词来做到这一点,这些控制谓词在图灵难以推理; 可以使用多种方法构造这样的谓词。例如,包括基于构建人工指针别名(或等效的数组下标)问题的测试,形式为“*p == *q”,其中p和q是从混乱的复杂图数据结构计算出的指针。
这种混淆程序要难得多,因为它们建立在难以解决的图灵问题上。
这里有一篇关于混淆控制流的示例论文。 这里还有一份关于控制流混淆的调查报告,包括不透明谓词
OP想要的是在更复杂的层面上运行的混淆器。我认为这些在Java和C#中是可用的,因为构建程序分析器来确定(并利用)控制流相对容易,一旦你有了程序的字节码表示,而不仅仅是它的文本。它们在其他语言中并不常见。可能只是时间问题。
(全面披露:我的公司建立了更简单类型的混淆器。我们偶尔会考虑更高级的混淆器,但经常会被闪亮的东西分心)。

Jscrambler的新版本已经实现了JavaScript控制流和不透明谓词的混淆。据我所知,他们是JavaScript中唯一这样做的人。 - rmribeiro

1
您列出的公共反混淆器不过使用了简单的eval()和美化器来反混淆代码,可能需要多次运行。这是因为大多数混淆器会在最后添加一个函数来反混淆它,使引擎能够运行它。在大多数情况下,这是一种简单的字符替换(一种凯撒密码),而eval()足以获取一些代码,之后再通过美化器使其更易读。
回答您的问题:您可以使用某种“加密”来增强它的难度(“难度”指的是将其复制粘贴到反混淆器中不再有效),该加密使用服务器在第一轮反混淆后从密码中获取的代码,并使用浏览器完成的相对路径而不是完整路径。这需要手动干预。以复杂和非显而易见的方式构建该路径,就可以阻止普通的脚本小子。
总的来说:您需要一些不在脚本本身中的东西来反混淆脚本。
但要注意:它只回答您的问题,也就是说,将其简单地复制并粘贴到其中一个公共反混淆器中变得不可能,而不能更多。请参见Ira的答案以获取更复杂的内容。
请注意混淆代码的原因:
- 隐藏恶意意图/内容 - 隐藏窃取的代码 - 隐藏糟糕的代码 - 朝气蓬勃的老板/投资者 - 其他(我知道那是什么,但我太有礼貌了,不想说)
现在,如果人们看到您的混淆代码,他们会怎么想?您的投资者坚持这样做是为了让您写出每个人都非常喜欢的小型浏览器游戏?

“混淆代码的原因”很有趣。同意。 - Stack

0

JavaScript是由您的浏览器从明文解释的。如果浏览器可以做到,那么您也可以。这就是它的本质。还有很多其他编程语言可以让您在分发之前进行编译/黑盒处理。如果您非常想保护自己的知识产权,请编译JavaScript使用的服务器端数据提供程序。


1
我觉得你把“执行”和“理解”搞混了。你的CPU执行二进制代码,它并不了解程序的预期功能。 - Ira Baxter
@Ira Baxter,您的评论让我感到困惑。我既没有提到“执行”也没有提到“理解”,也没有提到CPU...请解释一下。 - Stack
如果你的浏览器可以做到,那么你也可以。你隐含地将浏览器视为执行引擎,例如某种CPU。你暗示能够执行程序就意味着能够理解它,这纯属无稽之谈。对程序内容进行推理的能力可能最终会让你理解它。执行不等于“推理”。 - Ira Baxter
我发现了你所指的产品 https://www.semanticdesigns.com/Products/Obfuscators/JavaObfuscator.html?Home=JavaTools - Java != JavaScript - Stack
解释并不意味着执行,现代浏览器在执行之前会进行编译。V8 在执行 JavaScript 之前将其编译为本机机器码,而不是使用更传统的技术,如解释字节码或将整个程序编译为机器码并从文件系统中执行。源代码混淆技术基本相同,你说得很对。 - Stack
显示剩余4条评论

0
没有JavaScript混淆或保护能够说它使代码无法逆向。话虽如此,有一些工具提供了非常简单的混淆,容易被逆向,还有一些工具可以将你的JavaScript转化为极其困难和不可行的形式进行逆向。我知道的最先进的产品是Jscrambler。他们拥有最强大的混淆技术,并添加了代码锁和反调试功能,使得检索代码的过程变得非常困难。我使用它来保护我的应用程序,它有效果,值得一试。

1
他的高贵之人已经发表了讲话。 - Dominic Cerisano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接