Подтвердить что ты не робот

Рубиновый обфускатор

Есть ли ruby ​​obfuscator или "компилятор"?

4b9b3361

Ответ 1

Есть несколько вариантов, например RubyScript2Exe или AllInOneRuby. Однако все обфускаторы интерпретируемых языков имеют серьезный недостаток: они обычно не понимают более сложные методы метапрограммирования.

То есть они не могут сказать, что что-то вроде foo.send(:bar, ...) является вызовом метода bar в совершенно другой библиотеке или что eval("require %w{abc def ghi}") означает необходимость использования трех разных библиотек. Это тривиальные примеры - все становится намного сложнее, когда вы бросаете method_missing и его ilk в микс.

Когда obfuscator встречает такой тип кода, он будет тщательно компилировать соответствующие инструкции, но он может и не знать, чтобы также включать определенные библиотеки или другой код из другого места. Это может вызвать серьезные проблемы, поскольку динамически include d или require d не будут доступны во время выполнения в статически связанном исполняемом файле.

К сожалению, многие драгоценные камни и библиотеки используют сложные методы метапрограммирования. Вероятно, вы столкнетесь с проблемой, если попытаетесь использовать обфускацию и ожидаете, что ваша программа будет иметь такое же поведение. Хуже того, потому что существует так много уровней косвенности, если в запутанной версии возникает ошибка, вы никогда не узнаете, что именно произошло или как ее воспроизвести.

Ответ 2

В зависимости от того, что вы пытаетесь сделать, есть Gem, который позволит вам создать расширение C из Ruby script, которое затем может использоваться как требование внутри вашего приложения Ruby. Его называют ruby2cext. Он будет запутывать весь ваш код на C, и вы можете потребовать .so в отдельном Ruby script, и он будет функционировать как обычный Ruby script.