如何击败混淆 javascript 代码的反混淆?
How to defeat deobfuscation of obfuscated javascript code?
这是一个通用问题
我在一些被混淆的网站上看到 javascript
当您尝试使用标准去混淆器(deobfuscatejavascript.com、jsnice.org 和 jsbeautifier.org)对代码进行去混淆处理时
, 代码不易反混淆
我知道避免去混淆几乎是不可能的。我想让攻击者很难对其进行反混淆
请提出一些我可以实现的方法
我是否应该编写自己的混淆器,然后使用另一个在线混淆器对输出进行混淆。这能打败它吗?
提前致谢
P.S:我尝试了 google 闭包编译器、uglifyjs、js-obfuscator 和许多其他工具。 None 其中(单独使用或组合使用)能够击败反混淆器
JavaScript 由您的浏览器从明文中解释。如果浏览器可以做到这一点,那么您也可以。这是野兽的本性。有许多其他编程语言允许您在分发前 compile/black 装箱。如果您执意要保护您的知识 属性,请编译您的 JavaScript 使用的服务器端数据提供程序。
混淆可以在多个复杂级别上完成。
大多数可用的混淆器会打乱(缩小?)标识符并删除空格。漂亮地打印代码可以恢复漂亮的缩进;汗水和大量的猜测可以通过足够的努力恢复合理的标识符名称。所以人们说这是弱混淆。他们是对的;有时就足够了。
[加密不是混淆;它被简单地颠倒了。
但是可以用更复杂的方式混淆代码。特别是,人们可以利用 Turing Tarpit 以及关于混淆程序的推理在实践中可以 hard/impossible 这一事实。可以通过扰乱控制流并注入 opaque 控制流控制谓词来做到这一点,这些谓词很难进行图灵推理;您可以通过多种方式构建此类谓词。例如,包括基于构造“*p==*q”形式的人工指针别名(或等效的数组下标)问题的测试,因为 p 和 q 是从杂乱复杂的图形数据结构计算得到的指针。
此类混淆程序更难逆向工程,因为它们建立在图灵难以解决的问题之上。
这是一个 example paper that talks about scrambling control flow. Here's a survey on control flow scrambling, including opaque predicates。
OP 想要的是一个在这个更复杂的级别上运行的混淆器。这些可用于 Java 和 C#,我相信,因为一旦您拥有程序的字节代码表示而不仅仅是其文本,构建程序分析器以确定(和利用)控制流就相对容易了。它们不适用于其他语言。可能只是时间问题。
(完全披露:我的公司构建了一种更简单的混淆器。我们偶尔会考虑更高级的混淆器,但经常会被闪亮的物体分散注意力)。
您列出的 public 反混淆器仅使用简单的 eval()
后跟美化程序来反混淆代码。这可能需要几个 运行。它之所以有效,是因为大多数混淆器都在做他们的事情,并在末尾添加一个函数来对其进行足够的反混淆,以允许引擎 运行 它。在大多数情况下,它是一个简单的字符替换(一种 Cesar 密码),eval()
足以获得一些代码,之后美化器或多或少可读。
回答你的问题:你可以通过使用某种"encryption" 使用代码在第一轮去混淆后从服务器获取的密码,并使用浏览器完成的相对路径而不是完整路径。那将需要人工干预。以复杂且不明显的方式构建该路径,并且您对普通的脚本小子有威慑力。
总的来说:您需要一些东西来对不在脚本本身中的脚本进行去混淆处理。
但请注意:它只会回答您的问题,也就是说,它不可能通过简单的 c&p 去混淆成其中一个 public 去混淆器 而不是更多。有关更复杂的内容,请参阅 Ira 的回答。
请注意混淆代码的原因:
- 隐藏恶意intent/content
- 隐藏被盗代码
- 隐藏错误代码
- 一头尖头发boss/investor
- 其他(我知道那是什么,但我太客气了,不敢说)
现在,如果人们看到您的混淆代码,他们会做什么?你的投资者坚持要给你钱,让你写那个人人都喜欢的小网页游戏?
没有 JavaScript 混淆或保护可以说它使得无法逆向一段代码。话虽这么说,有些工具提供了一种非常简单且易于逆转的混淆,而其他工具实际上会将你的 JavaScript 变成极其难以逆转且不可行的东西。据我所知,真正保护您的代码的最先进产品是 Jscrambler。他们拥有最强大的混淆技术,并添加了代码锁和反调试功能,将检索代码的过程变成了地狱。我用它来保护我的应用程序并且它有效,值得一试 IMO
这是一个通用问题
我在一些被混淆的网站上看到 javascript
当您尝试使用标准去混淆器(deobfuscatejavascript.com、jsnice.org 和 jsbeautifier.org)对代码进行去混淆处理时 , 代码不易反混淆
我知道避免去混淆几乎是不可能的。我想让攻击者很难对其进行反混淆
请提出一些我可以实现的方法
我是否应该编写自己的混淆器,然后使用另一个在线混淆器对输出进行混淆。这能打败它吗?
提前致谢
P.S:我尝试了 google 闭包编译器、uglifyjs、js-obfuscator 和许多其他工具。 None 其中(单独使用或组合使用)能够击败反混淆器
JavaScript 由您的浏览器从明文中解释。如果浏览器可以做到这一点,那么您也可以。这是野兽的本性。有许多其他编程语言允许您在分发前 compile/black 装箱。如果您执意要保护您的知识 属性,请编译您的 JavaScript 使用的服务器端数据提供程序。
混淆可以在多个复杂级别上完成。
大多数可用的混淆器会打乱(缩小?)标识符并删除空格。漂亮地打印代码可以恢复漂亮的缩进;汗水和大量的猜测可以通过足够的努力恢复合理的标识符名称。所以人们说这是弱混淆。他们是对的;有时就足够了。 [加密不是混淆;它被简单地颠倒了。
但是可以用更复杂的方式混淆代码。特别是,人们可以利用 Turing Tarpit 以及关于混淆程序的推理在实践中可以 hard/impossible 这一事实。可以通过扰乱控制流并注入 opaque 控制流控制谓词来做到这一点,这些谓词很难进行图灵推理;您可以通过多种方式构建此类谓词。例如,包括基于构造“*p==*q”形式的人工指针别名(或等效的数组下标)问题的测试,因为 p 和 q 是从杂乱复杂的图形数据结构计算得到的指针。
此类混淆程序更难逆向工程,因为它们建立在图灵难以解决的问题之上。
这是一个 example paper that talks about scrambling control flow. Here's a survey on control flow scrambling, including opaque predicates。
OP 想要的是一个在这个更复杂的级别上运行的混淆器。这些可用于 Java 和 C#,我相信,因为一旦您拥有程序的字节代码表示而不仅仅是其文本,构建程序分析器以确定(和利用)控制流就相对容易了。它们不适用于其他语言。可能只是时间问题。
(完全披露:我的公司构建了一种更简单的混淆器。我们偶尔会考虑更高级的混淆器,但经常会被闪亮的物体分散注意力)。
您列出的 public 反混淆器仅使用简单的 eval()
后跟美化程序来反混淆代码。这可能需要几个 运行。它之所以有效,是因为大多数混淆器都在做他们的事情,并在末尾添加一个函数来对其进行足够的反混淆,以允许引擎 运行 它。在大多数情况下,它是一个简单的字符替换(一种 Cesar 密码),eval()
足以获得一些代码,之后美化器或多或少可读。
回答你的问题:你可以通过使用某种"encryption" 使用代码在第一轮去混淆后从服务器获取的密码,并使用浏览器完成的相对路径而不是完整路径。那将需要人工干预。以复杂且不明显的方式构建该路径,并且您对普通的脚本小子有威慑力。
总的来说:您需要一些东西来对不在脚本本身中的脚本进行去混淆处理。
但请注意:它只会回答您的问题,也就是说,它不可能通过简单的 c&p 去混淆成其中一个 public 去混淆器 而不是更多。有关更复杂的内容,请参阅 Ira 的回答。
请注意混淆代码的原因:
- 隐藏恶意intent/content
- 隐藏被盗代码
- 隐藏错误代码
- 一头尖头发boss/investor
- 其他(我知道那是什么,但我太客气了,不敢说)
现在,如果人们看到您的混淆代码,他们会做什么?你的投资者坚持要给你钱,让你写那个人人都喜欢的小网页游戏?
没有 JavaScript 混淆或保护可以说它使得无法逆向一段代码。话虽这么说,有些工具提供了一种非常简单且易于逆转的混淆,而其他工具实际上会将你的 JavaScript 变成极其难以逆转且不可行的东西。据我所知,真正保护您的代码的最先进产品是 Jscrambler。他们拥有最强大的混淆技术,并添加了代码锁和反调试功能,将检索代码的过程变成了地狱。我用它来保护我的应用程序并且它有效,值得一试 IMO