OCRA

参考:

larsch/ocra: One-Click Ruby Application Builder – GitHub

gem

参考:

ocra | RubyGems.org [Official]

使い方

参考:

OCRA を使って Ruby スクリプトを実行ファイル (.exe) に変換して配布する – Qiita

ocra による exe 化 | mirichi.github.io

Ruby 実行ファイルの exe 化 | mebee

ocra による Ruby の EXE 化 | 覚え書き (masamitsu-murase.blogspot.com)

ソースコードを隠蔽する

iseqloader.rb を作成する。

require 'fiddle'

class RubyVM
  class InstructionSequence
    addr = Fiddle.dlopen(nil)['rb_iseq_load']
    fn   = Fiddle::Function.new(
             addr, [Fiddle::TYPE_VOIDP] * 3, Fiddle::TYPE_VOIDP)

    define_singleton_method(:load) do |dat, par=nil, opt=nil|
      fn.call(Fiddle.dlwrap(dat), par, opt).to_value
    end
  end
end

alias old_require_relative require_relative

def require_relative(filename)
  ext = File.extname(filename)
  base = File.basename(filename)

  if ext.empty?
    rbname = filename + ".rb"
    rbcname = filename + ".rbc"
  elsif ext == ".rb"
    rbname = filename
    rbcname = filename + "c"
  else
    old_require_relative(filename)
    return
  end

  if File.exists?(rbname)
    if !File.exists?(rbcname) or File.mtime(rbname) > File.mtime(rbcname)
      open(rbcname, "wb") do |fh|
        Marshal.dump(RubyVM::InstructionSequence.compile_file(rbname).to_a, fh)
      end
    end
  end

  if File.exists?(rbcname)
    open(rbcname, "rb") do |fh|
      RubyVM::InstructionSequence.load(Marshal.load(fh)).eval
    end
  else
    old_require_relative(filename)
  end
end

require_relative 'iseqloader' を実行すると、以降 require_relativeしたコードに対応する .rbc ファイルが生成され、.rb ファイルの代わりに .rbc ファイルからコードをロードできるようになる。

参考:

ソース隠蔽手法 | mirichi の日記

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です