ソースの圧縮をする微妙なBimyoモジュール
手段がバレバレになるので見ようと思えばちょっとした細工ですぐ見れるわけだが。
画像とかもそうで、簡単に見れないようにするためにはソース非公開でバイナリの拡張ライブラリを作るほうがよい。
とりあえず参考までに。
このような微妙なモジュールを作る。
require 'zlib' module Bimyo @files = {} @startflag = false def self.load(filename) open(filename, "rb") do |fh| @files = Marshal.load(Zlib.inflate(fh.read)) end @startflag = true end def self.bmrequire(filename) if @startflag if @files.has_key?(filename) eval(@files[filename], TOPLEVEL_BINDING) @files.delete(filename) end else open(filename, "rb") do |fh| @files[filename] = fh.read end require filename end end def self.save(filename) open(filename,"wb") do |fh| fh.write(Zlib.deflate(Marshal.dump(@files))) end end end
こう使う。
require './bimyo' Bimyo.load 'test.dat' Bimyo.bmrequire './sample_flash.rb' #Bimyo.save('test.dat')
Bimyo.loadは圧縮ファイルを読み込む処理で、Bimyo.saveは保存する処理。loadはBimyoモジュールを読み込んだ直後、saveはプログラムが終了する直前に使う。基本的にどっちかをコメントアウトする。圧縮ファイルを作りたいときはsaveだけ、圧縮ファイルで動かしたいときはloadだけ、という感じ。
相対パスで指定する自分のスクリプトをrequireするときはBimyo.bmrequireを使うようにする。いまのところ拡張子の省略は不可。中身はevalなのでRubyのソース以外も不可。トップのファイルはこのような形にして、メインのファイルをbmrequireすればソースのすべてを圧縮ファイルにできる。
これでまあ、ソースについてはZLibで圧縮されたファイル1つにまとまる。ダブルクリックしても読めない。Bimyo.rbはそのまま残るから意味がわかる人なら展開して読むこともできる。
Bimyo.rbとトップのファイルを難読化すればもうちょっとマシになるかもしれない。
たいしたテストはしてないのでバグがあるかもしれない。