是否有ruby混淆器或“编译器”?
答案 0 :(得分:26)
有一些选项,例如RubyScript2Exe或AllInOneRuby。然而,所有解释性语言的混淆者往往都有严重的缺陷:他们通常不了解更复杂的元编程技术。
也就是说,它们不一定能说明foo.send(:bar, ...)
之类的东西是完全不同的库中bar
方法的调用,或者eval("require %w{abc def ghi}")
意味着需要三个不同的库。这些都是微不足道的例子 - 当你把method_missing
之类的东西放到混合中时,事情变得复杂得多。
当混淆器遇到这种代码时,它将尽职尽责地编译适当的指令,但它可能不知道还包括来自其他地方的某些库或其他代码。这可能会导致严重问题,因为动态include
d或require
d在运行时将无法在静态链接的可执行文件中使用。
不幸的是,许多宝石和图书馆使用复杂的元编程技术。如果您尝试使用模糊处理并期望程序具有相同的行为,那么您可能会遇到麻烦。更糟糕的是,因为间接层次太多,如果混淆版本中出现错误,您可能永远不会知道究竟发生了什么或如何重现它。
答案 1 :(得分:3)
根据您要做的事情,有一个Gem允许您从Ruby脚本创建C扩展,然后可以在Ruby应用程序中将其用作需求。它叫做ruby2cext。它会将您的所有代码混淆为C,并且您可以在单独的Ruby脚本中使用.so,它将像普通的Ruby脚本一样运行。
答案 2 :(得分:0)
RubyScript2Exe - http://www.erikveen.dds.nl/rubyscript2exe/