什么是 JavaScript 混淆,为什么它是一种威胁?

L84*_*L84 29 malware javascript avg-antivirus

AVG 最近告诉我,由于JavaScript Obfuscation一个网页被阻止。

为什么网页被屏蔽了,这到底是什么意思?

小智 38

混淆是一种“模糊”JavaScript 代码真正含义和意图的方法。一些网站将其用作想要复制/借用其代码的人的障碍。其他站点使用它作为隐藏代码实际意图的手段。

一些形式的遮蔽:

  1. 自动将变量重命名为无意义的短名称,使代码可读性较差且难以理解。
  2. 删除所有额外的空格和换行符,因此代码是一个巨大的长行。
  3. 使部分代码自生成,以便第一遍代码运行以创建实际代码,然后运行该代码以执行预期操作。
  4. 使用字符代码和字符串操作结合 eval 而不是普通的 javascript 代码来构建将运行的实际代码。

遮蔽本身并不是邪恶的,但它可以用来试图隐藏邪恶的意图,这可能是 AVG 所反对的。它检测到如此多的模糊,以至于无法判断 javascript 是否试图做一些它试图阻止的事情。因此,它默认将代码声明为不安全,因为它无法验证代码是否正常。

  • `1` 和 `2` 也由 javascript 压缩器完成。压缩器将代码混淆为副作用,但这不是它们的主要目的;它们的主要目的是使 javascript 更小,以减少带宽。 (9认同)
  • 一些站点使用 js 压缩,因此加载速度更快(几乎所有人),代码看起来很模糊。 (4认同)

Den*_*nis 13

混淆是指隐藏某物的预期含义。

在这种情况下,一个清晰可读的 JavaScript 片段,例如

window.onload = function() { alert("Hello " + username) };
Run Code Online (Sandbox Code Playgroud)

可以替换为

var _0xc5b2=["\x6F\x6E\x6C\x6F\x61\x64",
        "\x48\x65\x6C\x6C\x6F\x20"];window[_0xc5b2[0]]=
    function (){alert(_0xc5b2[1]+username);} ;
Run Code Online (Sandbox Code Playgroud)

甚至

eval(unescape("var%20_0xc5b2%3D%5B%22onload%22%2C%22Hello%20%22%5D%3Bwindow"+
  "%5B_0xc5b2%5B0%5D%5D%3Dfunction%20%28%29%7Balert%28_0xc5b2%5B1%5D+username"+
  "%29%3B%7D%20%3B"));
Run Code Online (Sandbox Code Playgroud)

所有三个代码片段都做完全相同的事情,但只阅读第一个可以让您轻松理解其意图。

显然,AVG 在允许其执行之前尝试了解 JavaScript 代码的目的。当代码被混淆时,AVG 可能会失败。因此警告。

话虽如此,一些网站混淆他们的 JavaScript 并不是出于恶意,而是为了使其难以窃取他们的作品。如果用于此目的,混淆通常是无用的,但关键是混淆并不一定意味着恶意。

  • 虽然正如我经常发现的那样,反混淆代码经常向我展示它隐藏了不值得窃取的恶意编码的 javascript。这表明程序员花更多的时间担心盗窃而不是正确的编程技术,甚至无法正确进行混淆,因此很容易被破解。唯一花时间让代码真正难以去混淆的人是恶意软件程序员,这就是为什么 AVG 将其标记为避开该网站的一个很好的理由。 (3认同)
  • AVG 是一台机器,而不是人。显然,机器可以理解代码,这就是代码如何做同样的事情。此外,人们在冲浪时通常不会看 Javascript。这简直就是一个“联想罪”的案例。一些危险的 Javascript 使用某些混淆模式。因此,其他具有类似模式的 Javascript 是可疑的。 (2认同)