2010-01-23 2 views

risposta

25

Ci sono alcune opzioni, come RubyScript2Exe o AllInOneRuby. Tuttavia, tutti gli offuscatori di lingue interpretate tendono ad avere un grave difetto: di solito non comprendono tecniche di metaprogrammazione più sofisticate.

Che è, non può necessariamente dire che qualcosa di simile foo.send(:bar, ...) è un'invocazione del metodo bar in una libreria completamente diverso, o che eval("require %w{abc def ghi}") significa richiedere tre diverse librerie. Questi sono esempi banali: le cose diventano molto più complesse quando si lanciano method_missing e il suo ilk nel mix.

Quando un obfuscator incontra questo tipo di codice, compilerà diligentemente le istruzioni appropriate, ma potrebbe non sapere di includere anche alcune librerie o altro codice da altrove. Ciò può causare seri problemi, dal momento che il dinamicamente include o require d non sarà disponibile in fase di esecuzione in un eseguibile collegato in modo statico.

Purtroppo, molte gemme e librerie utilizzano sofisticate tecniche di metaprogrammazione. Probabilmente ti troverai nei guai qui se proverai a usare l'offuscamento e prevedi che il tuo programma abbia lo stesso comportamento. Peggio ancora, perché ci sono così tanti livelli di riferimento indiretto, se un bug si verifica nella versione offuscata, non si può mai sapere cosa è successo esattamente o come riprodurlo.

+7

Nota: non si tratta di un commento sull'abilità di RubyScript2Exe o AllInOneRuby in particolare, solo considerazioni generali sull'inadeguatezza degli offuscatori nei linguaggi che dispongono di potenti capacità di riflessione/introspezione. –

3

A seconda di cosa si sta tentando di fare, c'è una gemma che ti permetterà di creare un'estensione C da uno script Ruby che può quindi essere usato come richiesta all'interno della tua app Ruby. Si chiama ruby2cext. Nasconderà tutto il tuo codice in C e potrai richiedere il .so in uno script Ruby separato e funzionerà come un normale script Ruby.

+1

questo progetto sembra buono ... è un peccato che sia abbandonato :(modifica: https://github.com/rdp/crystalizer –