我需要一个JavaScript文字语法转换器/反混淆工具。

5

我在谷歌上搜索了一个转换器,但是没有找到任何东西。是否有可用的工具或者我必须制作一个来解码我的混淆JavaScript代码?

我认为有这样的工具,但我没有用正确的关键字在谷歌上搜索。

代码有3页长,这就是为什么我需要一个工具的原因。

以下是代码示例:

<script>([][(![]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]()[(!![]+[])[!+[]+!+[]+!+[]]+(+(+[])+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+!+[]+[+[]]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]])(([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+

谢谢您


1
当您对其进行评估时会发生什么? - maerics
有趣的东西;你能否发布完整代码清单的链接? - maerics
我获得了“无法将未定义的内容转换为对象”的错误。 - Raynos
@Raynos,也许是有人提交了一些奇怪的 JavaScript 代码到 wtfjs 或者其他地方。 - Pointy
Raynos:当我复制脚本时,它带有回车符。这是原始代码的链接 :) https://cours.etsmtl.ca/log619/documents/travaux/lab1/LOG619-Lab1-Boni.html - Francois Valiquette
显示剩余7条评论
2个回答

4
这段代码很有趣,因为它似乎只使用了九个字符(“[]()!+,;”和空格U+0020),但具有一些复杂的功能。它似乎利用JavaScript的隐式类型转换将数组强制转换为各种基本类型及其字符串表示,并使用这些字符串中的字符组成其他字符串,这些字符串键入调用的函数名称。
考虑以下片段,该片段计算出数组筛选函数
([][
   (![]+[])[+[]]               // => "f"
 + ([![]]+[][[]])[+!+[]+[+[]]] // => "i"
 + (![]+[])[!+[]+!+[]]         // => "l"
 + (!![]+[])[+[]]              // => "t"
 + (!![]+[])[!+[]+!+[]+!+[]]   // => "e"
 + (!![]+[])[+!+[]]            // => "r"
]) // => function filter() { /* native code */ }

重构这样的代码既耗时又容易出错,因此自动化解决方案显然是可取的。但是,这段代码的行为与JavaScript运行时密切相关,因此对其进行反混淆似乎需要一个JS解释器来评估该代码。
我没有找到任何适用于此类编码的工具。看起来您必须进一步研究代码并确定其使用模式(例如,依赖于数组方法)并找出如何捕获它们的使用(例如,通过包装高级函数[例如Function.prototype.call]来跟踪代码执行)。

1
这个问题已经有了一个被接受的答案,但我仍然想发帖澄清一些事情。
当这个想法浮出水面时,有人制作了一个生成器以这种方式编码JavaScript。它基于执行[]["sort"]["call"]()["eval"](/* 这里是大量代码的内容 */) 。因此,你可以通过移除sort-call-eval部分(即前1628个字节)轻松解码此编码器的结果。在这种情况下,它会产生:
if (document.cookie=="6ffe613e2919f074e477a0a80f95d6a1"){ alert("bravo"); }
else{ document.location="http://www.youtube.com/watch?v=oHg5SJYRHA0"; }

有趣的是,这段代码的创建者甚至无法正确压缩它并节省一千字节。

还有一个解释为什么这段代码在新的浏览器中不再起作用:他们改变了Array.prototype.sort,所以它不再返回对window的引用。据我记得,这是获取对window引用的唯一方法,所以现在这段代码有点失效了。


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