解码 JavaScript:反混淆指南
在早期的 Web 开发过程中,您学到的最有趣的事情之一就是如何通过简单地从开发人员工具页面复制源代码来复制网站。许多开发人员发现这很有用,但对于创建这些网站的开发人员和网站所有者来说情况并非如此。
这些网站所有者通常担心他们的客户端(HTML、CSS 和 JavaScript)代码被盗。这让他们只有一个选择:寻找解决方案来阻止未经授权复制或滥用他们的源代码。
满足这些网站所有者需求的解决方案之一是 JavaScript 混淆技术。简单来说,**JavaScript 混淆** 就是将人类可读的 JavaScript 代码转换为人类难以理解的复杂格式。
正如事物都有两面性,**JavaScript 混淆** 也有其对应物,即 JavaScript 反混淆。从其名称就可以看出,它是 JavaScript 混淆的反面行为,从而将已经混淆的 JavaScript 代码转换为人类可读的格式。
**注意**:在大多数情况下,JavaScript 反混淆不会将混淆后的代码恢复为原始形式,尽管有时您会得到原始形式。可以肯定地说,JavaScript 反混淆并不保证您得到原始的 JavaScript 代码,而是保证您可以阅读和理解的代码。
JavaScript 反混淆和混淆的实用解释
通过练习我们可以学得更好,因此让我们探索本指南简介部分中所有理论解释的实践方面。
要测试这些技术,您需要 JavaScript 代码。话虽如此,让我们创建一个简单的 JavaScript 代码,定义一个变量并根据 for 循环运行的次数输出一个字符串。
const no_loop_cycle = 5 for (let i = 0; i < no_loop_cycle; i++) { console.log("String ", i) }
现在您已经有了用于测试的 JavaScript 代码,请转到 JavaScript Obfuscator Tool,这是一个用于混淆 JavaScript 代码的免费工具。
将示例 JavaScript 代码粘贴到工具中,然后单击“混淆”按钮。
以下是您将得到的输出:
function _0xb78f(_0x2224cc,_0x217706){const _0x44095f=_0x4409();return _0xb78f=function(_0xb78f5c,_0x2ff516){_0xb78f5c=_0xb78f5c-0xd3;let _0x60ee28=_0x44095f[_0xb78f5c];return _0x60ee28;},_0xb78f(_0x2224cc,_0x217706);}const _0x5f75f2=_0xb78f;(function(_0x2c5162,_0x14873c){const _0x4e4ef7=_0xb78f,_0x5a8a62=_0x2c5162();while(!![]){try{const _0x1b7f08=parseInt(_0x4e4ef7(0xdb))/0x1*(-parseInt(_0x4e4ef7(0xdc))/0x2)+parseInt(_0x4e4ef7(0xdd))/0x3+-parseInt(_0x4e4ef7(0xd9))/0x4*(parseInt(_0x4e4ef7(0xd4))/0x5)+-parseInt(_0x4e4ef7(0xde))/0x6+parseInt(_0x4e4ef7(0xd6))/0x7*(-parseInt(_0x4e4ef7(0xd3))/0x8)+parseInt(_0x4e4ef7(0xd5))/0x9+parseInt(_0x4e4ef7(0xd7))/0xa;if(_0x1b7f08===_0x14873c)break;else _0x5a8a62['push'](_0x5a8a62['shift']());}catch(_0x153236){_0x5a8a62['push'](_0x5a8a62['shift']());}}}(_0x4409,0x71eba));const no_loop_cycle=0x5;for(let i=0x0;i将这段混淆后的代码粘贴到代码编辑器中并运行以验证其准确性。您将看到它给出与原始代码相同的输出。
现在您已经了解了 JavaScript 混淆的实际效果,尝试 JavaScript 反混淆也同样令人愉快。复制上面的混淆代码并将其粘贴到此免费反混淆工具中。
使用该反混淆工具将为你提供以下代码:
for (let i = 0x0; i < 0x5; i++) { console.log("String ", i); }反混淆后返回的代码与原始 JavaScript 代码类似,但略有不同。这证实了您通常不会获得实际的 JavaScript 代码,而是可以理解的可读格式的代码。
为什么 JavaScript 反混淆很重要?
大多数网站严重依赖嵌入技术来阻止未经授权的用户,主要是在 JavaScript 代码中,因为它负责基本的用户交互(大多数需要您与网站交互的事情都是使用 JavaScript 实现的)。
这些技术大多是 JavaScript 混淆,而 JavaScript 反混淆正是其中发挥作用的地方。它有助于解决此类情况,尤其是在网页抓取时。
JavaScript 反混淆有助于使代码更具可读性,使您能够更好地理解脚本,模拟您的交互,并正确地抓取预期的数据。
JavaScript 混淆甚至带来了更多的反爬取机制,例如反机器人安全、Cloudflare 等候室和一系列 CAPTCHA 谜题。尽管存在这些挑战,但 JavaScript 反混淆仍然能够成功,因为它有助于绕过和逆向工程这些挑战。
JavaScript 反混淆的工作原理
JavaScript 反混淆采用以下过程:
识别 JavaScript 混淆:要识别 JavaScript 混淆,您需要识别一些模式,如变量重命名、控制流最小化、十六进制值、编码字符串等。随着您不断研究,您会发现更多模式。 访问混淆代码:现在您已经发现了混淆代码,下一步是使用 Chrome 的开发人员工具访问代码以进行更好的分析。找到文件后,您也可以保存它。 格式化代码:Prettier 或 JavaScript 美化器等工具可以格式化混淆的代码。 执行代码来验证它是否没有错误。 最后,提取功能逻辑(隐藏内容生成或令牌验证的代码)。 JavaScript 反混淆的解决方案
JavaScript 反混淆的完美解决方案是解决问题的技能、识别混淆代码中的模式的能力以及使用技术工具的能力的结合。
如果您拥有格式化代码的必要工具、用于访问和分析混淆代码的 Chrome DevTools、用于解析和压缩代码的外部第三方库(如 uglify-js)和调试工具,您就可以看穿任何 JavaScript 混淆实例。
为了加快速度,您可以使用任何 JavaScript 反混淆工具或本指南中使用的工具。