如何打败混淆的javascript代码的反混淆?

时间:2016-05-13 18:18:55

标签: javascript obfuscation deobfuscation

这是一般性问题

我在一些被混淆的网站上看过javascript

当您尝试使用标准反混淆器(deobfuscatejavascript.com,jsnice.org和jsbeautifier.org)对代码进行反混淆处理时 ,代码不容易被反混淆

我知道实际上不可能避免反混淆。我想让攻击者非常难以对其进行反混淆

请提出一些我可以实现的方法

我应该编写自己的混淆器,然后使用另一个在线混淆器对输出进行混淆。这会打败它吗?

提前致谢

P.S:我尝试了谷歌闭包编译器,uglifyjs,js-obfuscator和其他一些工具。它们(单独使用或组合使用)都不能击败反混淆器

4 个答案:

答案 0 :(得分:1)

混淆可以在几个复杂程度上完成。

大多数可用的混淆器会加密(缩小?)标识符并删除空格。对代码进行漂亮打印可以恢复出色的缩进;汗水和许多猜测可以用足够的努力恢复合理的标识符名称。所以人们说这是一种弱混淆。他们是对的;有时它就足够了。 [加密不是混淆;这很简单。]

但是人们可以用更复杂的方式来混淆代码。特别是,人们可以利用图灵Tarpit以及在实践中对混淆程序的推理可能很难/不可能的事实。人们可以通过加扰控制流并注入不透明的控制流控制谓词来实现这一点,这些谓词是图灵难以推理的;你可以用各种方式构造这样的谓词。例如,包括基于构造人工指针别名(或数组下标,这是等效的)的测试,对于p和q的形式为“* p == * q”的问题是从凌乱的复杂图形数据结构计算的指针。

这些混淆程序更难以进行逆向工程,因为它们建立在图灵难以解决的问题上。

这是一个example paper that talks about scrambling control flow。这是a survey on control flow scrambling, including opaque predicates

OP想要的是一个在这个更复杂的层面上运作的混淆器。我相信这些可用于Java和C#,因为一旦你有一个程序的字节代码表示而不仅仅是它的文本,构建程序分析器来确定(和利用)控制流是相对容易的。它们不适用于其他语言。可能只是时间问题。

(完全披露:我的公司构建了更简单的混淆器。我们偶尔会考虑那些更有魅力的混淆器,但会被闪亮的物体分散注意力。)

答案 1 :(得分:1)

您列出的公共反混淆使用者只需使用简单的eval(),然后使用美化功能对代码进行反模糊处理。这可能需要多次运行。它的工作原理是因为大多数混淆器完成它们的操作并在最后添加一个函数来对其进行去混淆,以使引擎能够运行它。在大多数情况下,它是一个简单的字符替换(一种Cesar密码),而eval()足以获得一些代码,之后被美化者或多或少地读取。

要回答你的问题:你可以让它变得更加强硬("更强硬"在某种意义上说,只是将它变成一个去混淆器并不再有效)某种加密"它使用代码在第一轮去混淆后从服务器获取的密码,并使用浏览器完成而不是完整路径的相对路径。那需要人工干预。以复杂且非显而易见的方式构建这条路径,并且对普通的脚本小子有威慑力。

一般情况下:您需要对脚本本身不存在的脚本进行反模糊处理。

但请注意:它只会回答您的问题,也就是说,它使得无法通过简单的c& p对其中一个公共去混淆器而不是更多进行去混淆。有关更复杂的内容,请参阅Ira的答案。

请注意混淆代码的原因:

  • 隐藏恶意意图/内容
  • 隐藏被盗代码
  • 隐藏错误代码
  • 一个尖尖的老板/投资者
  • 其他(我知道那是什么,但我太客气了)

现在,如果他们看到你的混淆代码,人们会想到做什么?你的投资者坚持要它给你钱写一个每个人都喜欢的小浏览器游戏吗?

答案 2 :(得分:0)

您的浏览器会根据明文解释JavaScript。如果浏览器可以做到,那么你也可以。这是野兽的本质。还有很多其他编程语言允许你在发布之前编译/黑盒子。如果您一心想保护自己的知识产权,请编译JavaScript使用的服务器端数据提供程序。

答案 3 :(得分:0)

没有JavaScript混淆或保护可以说它使得无法反转一段代码。话虽这么说,有些工具提供了一个非常简单的混淆,很容易逆转,而其他工具实际上将你的JavaScript转变为非常难以逆转的东西。我知道实际上保护您的代码的最先进的产品是Jscrambler。它们具有最强大的混淆技术,并且它们添加了代码锁和反调试功能,可以将检索代码的过程变为完整的地狱。我已经用它来保护我的应用程序并且它有效,值得查看IMO