ソースコードの難読化

スクリプトソースコードを読めなくすることを考えてみる。[ruby-list:40979]

まず、他の言語に変換することでソースコードを読めなくする方法がある。brubyのアプローチと言えるだろう。これは、適当な言語を考えるのが難しい。機械語のような低レベルな言語に変換するのは難しいし、Rubyと一対一に対応が取れる言語に変換したとしても容易に復元が可能である。

では、ソースコードを一度暗号化してrubyインタプリタに食わせる方法はどうだろうか。Exerbにはそういうオプションがあるらしい。あるいは復元を行う拡張ライブラリを*.soで用意しておいて、

Obfuscator.load("obfuscated.rb")

とか書くようにして、あらかじめ暗号化しておいたobfuscated.rbの中身を複合してevalするようにしたりもできるかもしれない。

それはそれで置いておいて、もうちょっとライトにソースコードに出てくる識別子を機械的に置換することによって難読化する方法を考えてみる。

スクリプト中で新しく定義された識別子から、新しく生成した(意味の無い)識別子に変換してやれば良いような気がするが、実際には標準ライブラリとの整合性を取る必要がある。例えば、IO#writeと互換性を持つように定義され、なにかの出力に使われているメソッドをdfabv12とか変名するわけにはいかないのだ。データフロー解析見たいのが必要になるということである。

あるいは、文字列の中に出現する識別子をどう処理するかという問題も無いわけではない。

evel("Foo.new().bar")

のような文字列はFoo#barの書き換えに伴って適切に書き換えてやる必要がある。

というところまで考えて、簡単ではなさそうだとわかった。がんばってそういうプログラムを作ったとしても、GoogleAjaxが解読されていることからもわかるよう、ちょっとがんばれば結局は復元されてしまうのだから、あまり意味は無い。もっと高級なプログラム変換を繰り返して、わかりにくくすることはできるだろうけど、そこまでやる気はないからなあ…

というわけで、結局なんにもやらず。