Building MirageVM: A Java 实战教程

发布于 5 小时前  1 次阅读


关于Building,网上资料比较零散,这里做个相对完整的总结。

Found this helpful? Share it with your team and leave a comment below!

正文

构建MirageVM :用于代码混淆的JavaScript虚拟机

现代Web应用程序面临着持续的挑战:绕过传统安全措施的自动攻击。验证码农场和人工智能工具使得区分合法用户和恶意机器人变得越来越困难。

可以解决许多商业上可用的验证码,而人工智能工具使复杂的脚本能够以模仿人类行为甚至解决验证码的方式与网页进行交互。

虽然响应增加了CAPTCHA挑战的复杂性,但这些往往使合法用户感到沮丧,而没有有效地阻止坚定的攻击者。安全措施和绕行技术之间的军备竞赛不断升级,导致许多人寻求替代方法。

Google的CAPTCHA实现很有趣:他们使用自定义JavaScript虚拟机来混淆其CAPTCHA逻辑。它们不发送可读的JavaScript代码,而是发送在自定义虚拟机中执行的字节码。这种技术隐藏了抽象层背后的实际实现,使得逆向工程更具挑战性。

构建虚拟机的概念让我兴奋得足以尝试构建类似的东西。最初作为“概念验证”实验的东西很快发展成为一个为期数月的项目。

用于混淆的JavaScript虚拟机通过将标准JavaScript替换为自定义字节码来工作。您不是将可读代码发送到浏览器,而是发送只有您的自定义虚拟机才能执行的低级指令。每个高级操作可能需要多个VM指令,类似于单行C代码转换为多个汇编指令的方式。

这种方法创造了多层保护。首先,攻击者必须了解虚拟机如何解释被严重混淆的字节码。其次,他们需要对指令集进行逆向工程。最后,他们必须将低级操作映射回高级逻辑。这就像尝试通过读取汇编代码来理解程序,只是这种语言及其运行时完全是自定义的,没有文档记录。

全局R0//将全局对象加载到寄存器R0

GET R0, R0, "Date"//从globalThis访问Date属性

EXEC R1, R0, "now"//从Date对象调用now方法

这种低级方法增加了逆向工程工作的复杂性,因为攻击者必须破译多个指令才能理解甚至基本的功能。

MirageVM的核心是读取和执行字节码指令的状态机。该实现遵循传统的CPU架构模式,具有用于数据存储的寄存器和用于管理函数调用和局部变量的堆栈。

虚拟机通过几个核心组件保持其状态:

:加载到虚拟机中的字节码指令数组

更多内容

除了上面提到的内容,还有几个点值得注意。首先是浏览器的兼容性,不同浏览器对Web Crypto API的支持程度有所不同。其次是性能问题,加密操作在大量数据时可能会影响用户体验。最后是密钥管理,如何安全地存储和传输密钥也是一个需要考虑的问题。

本文首发于JSVMP博客,转载注明出处。后续会持续更新更多相关内容。

Reference: Building MirageVM: A JavaScript Virtual Machine for Code ...


点击体验一键VMP加密 |下滑查看JSVMP相关文章