読者です 読者をやめる 読者になる 読者になる

プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

iphone上でLuaのバイトコードを生成する

cocos2d-xで使うLuaバイトコードへ変換する方法を探ってみた。
バイトコードへ変換するとロード速度が上がる。また、難読化にも繋がる。


一般的な方法ではバイトコードの生成にluacを使う。
コマンドをたった1行打つだけでLuaバイトコードを生成することができる。

# luac -o script.out script.lua

しかし、Macで生成したバイトコードiphoneで動かせない。

Bad header in precompiled chunk.


そこで、iphone上でバイトコードを生成することにした。
lua_dumpまたはluaU_dumpを使うとバイトコードを作れるので、共有ディレクトリに吐き出してみる。
次にiTunesからバイトコードを取り出し、元のスクリプトと差し替えてビルドする。・・・動いた。


それからiOSシミュレータ上で生成してビルドしてみると、これもiphone上で動かすことが出来た。※ipadは未確認。
Macで直接生成できる方法を見つけるまではシミュレーター上で生成することにする。


lua_dumpのソースを少し読んでみたところ、ヘッダで数値型のサイズ等を出力していた。
数値型のサイズは環境によって異なるため、Macで動かなかった原因はその辺りにあると思う(おそらく構造体のデータや数値型のリテラル等も環境に合わせたサイズでバイナリを吐いている)
この辺りは後日バイトコードをバイナリで比較して確認してみる予定。
推測が当たっていれば、数値型のサイズ周りを手動で設定できるluacを作ることで、Macでもiphone用のバイナリコードが吐けるかもしれない。
※全く見当違いな可能性も否めない。


バイトコードへ変換しても関数名はファイル内に残るので、エディタ等で見ることができる。
復号化する方法もあるようだけど結構難しいらしいし、主要な関数はC++で書いておけばソースを見られても心配する必要は無さそう。

どんな形式であれ解析しようと思えば可能なので、あまり神経質になっても仕方ない。
どうしても気になるようであれば独自に暗号化・復号化のプログラムを組み込むのが最善の策だろう。