RubyEncoder:Ruby 混淆器和代码保护

  • Mirko Stocker
  • 贾晓楠

2008 年 10 月 29 日

话题:RubyRuby on Rails安全语言 & 开发架构

RubyEncoder 通过编译和加密来保护 Ruby 和 Ruby on Rails 文件。经过加密的脚本由 RubyEncoder 的加载器来运行。RubyEncoder 是由Inovica Ltd开发的。他们还为 PHP 做了一个类似的东西:SourceGuardian

RubyEncoder 还能保护工程的一部分,允许明文的 Ruby 代码和配置文件的存在;还可以把程序限制在特定主域上,或设定一个期限来创建试用版(详见RubyEncoder FAQ 部分)。

InfoQ 采访了 RubyEncoder 的领衔开发者 Alexander Belonosov,从技术的角度来谈谈该项目。

InfoQ:编码和加载 / 运行是如何进行的?

首先把 Ruby 源代码编译成内部的中间格式,然后进行加密。一旦编码之后,源代码就不在被保护的脚本里了。你需要安装 RubyEncoder 加载器来运行被保护的脚本。加载器实际上是一个 Ruby 扩展,用来解码和运行被保护的脚本。被保护的脚本是与平台无关的,这点很重 要,你可以在所有支持的平台上运行它。不同的操作系统和平台的加载器是不同的。我们支持以下平台:OSX、Linux、FreeBSD,以及我们最近才开 始支持的 Solaris x86。我们还打算近期加入对 Windows 和其他 UNIX 的支持。

InfoQ:源代码会被转换为一种中间格式。你们有没有自己的解释器来运行它,还是需要还原成原始的 Ruby 代码?

原始的 Ruby 代码是不可能还原出来的。我们使用内部的中间格式。[..] 它是内部的、二进制的、可执行的,并且绝不可能还原出原始代码。

InfoQ:要是你们有自己的解释器,它如何支持元编程(metaprogramming)以及 Ruby 的其他动态特性?或者说,难道没有什么限制吗?

目 前,加载器会把代码的内部表示返回给 Ruby 来执行。这让我们拥有最大的兼容性,并保持 Ruby 代码的动态本质。但是,我们仍在寻找其他办法,在产品的下 一个版本来改变或者实现一个新的方案。不管怎样,使用 RubyEncoder 来保护产品将会对终端用户是透明的,而且 Ruby 开发者会得到更高级的、更高 效的编码器。

InfoQ:我们可以使用 ParseTree gem 包访问一个类或一个方法的解析树。RubyEncoder 会影响到它吗?

ParseTree 是个很棒的扩展,可以用来研究 Ruby 内部以及代码优化等。如果你是想问我们是否限制使用 ParseTree,那么答案是不会。当你使用 ParseTree 之类的工具时,你必须知道需要把什么从 Ruby 内部提取出来,以及如何发现它。我认为你还必须思考其原因,消耗的时间,以及最终的结果 是什么:-)

InfoQ:你们是否打算支持其他 Ruby 实现版本,比如 JRuby?有没有可能把加载器移植到 Java 上来运行 JRuby 代码?

目前我们仅支持标准 Ruby。JRuby 是个很棒的项目,并且在日益成长。不过针对的市场会有一点不同。

InfoQ:使用 JRuby 和编译过的 Ruby 源码,ByteCode 混淆器是不是也能达到跟 RubyEncoder 同样的效果?

使用 JRuby 和经过编译的 Ruby 源码也许能得到很高的保护等级。但是它面对的是 Java 环境。而我们的初衷是保护本地 Ruby 和 Ruby on Rails 工程,将来也许会决定加强或者扩展我们的产品。

InfoQ:RubyEncoder 是用什么语言写的?用 Ruby,然后自己加密自己?

不是,我并不是说 Ruby 元编程不好 :-) 但 RubyEncoder 和加载器是用 C 写的。

RubyEncoder 是一个商用产品,这里提供一个30 天试用版

你曾使用过这样的代码保护工具吗?有没有什么经验来分享?

查看英文原文:RubyEncoder: Obfuscation and Code Protection for Ruby

RubyRuby on Rails安全语言 & 开发架构