吉里吉里Z固有のクラッキング対策

吉里吉里2/Zは、その拡張性の高さからクラッキングしようとした時にその糸口となる箇所が複数存在する。
ここでは吉里吉里固有の対策について記述する。

実行ファイル差し替え対策

認証を行う場合、何もチェックがない実行ファイルと差し替えて実行出来てしまうと、何も対策していないに等しい。
入手可能な実行ファイルと差し替えて動かないようする必要がある。
パッチや体験版配布などで公開された実行ファイルへの差し替えでの動作も注意する。
対象のゲームデータ、DLL等が特定の実行ファイルでないと動かないようにする。
暗号化されたxp3の復号化処理を組み込んでしまえば他の実行ファイルでは起動できなくなる。
ただ復号化されたアーカイブを作られれば意味がなくなるので、他に固有の機能を追加するなどもした方が良い。
過去のクラッキングされた実行ファイルが使えないようにするため継続的な開発が必要になる。

自動読み込みプラグインの抑止

tpmの拡張子を持つdllを自動的に読み込む機能があるが、自動読み込みされると組み込みAPI置き換えなど出来てしまうので、出来ないようにする必要がある。
ただし、この対策を行うと組み込み機能のプラグインを使った暗号化が使えなくなる。

自動読み込みスクリプトの抑止

data.xp3内のstartup.tjs等初期にロードされるスクリプトが固定されているので、それを差し替えられると組み込みAPI置き換えなど出来てしまうので、出来ないようにする必要がある。
初期に読み込むスクリプトの場所を1つに固定したり、スクリプトの改竄検出を行ったり、xp3の暗号化を行い読み込み時毎回復号化することで、特定のスクリプト以外の差込をある程度回避できる。
TVP_START_UP_SCRIPT_NAME に任意の文字列を設定してコンパイルすることで任意のスクリプトを初期実行し、-startupオプションでの任意スクリプト実行を抑止する。
TVPSystemSecurityOptions でdata.xp3からの読み込みを強制するなどの指定も可能。

プラグイン差し替え対策

元のプラグインをリネームし同名のプラグインを置くことで任意のプラグインの読み込みが出来る、そのプラグインが公開しているAPIを乗っ取ったり、組み込みAPIの置き換えが可能になる。
krmovie.dll等ファイル読み込みを行うdllを置き換えると、そのdllに渡されるデータを簡単に取得できる(1.3以降ではkrmovie.dllは本体に組み込まれるので、krmovie.dllに関してはこの問題はなくなる)。
krmovie.dllの場合は動画ファイル、KAGParser.dll系ではKAGスクリプト。
これを回避するためにdllの改竄検出をする必要がある。
読み込むdllのハッシュを見たり、電子署名のチェックを行ったり。
ただ、チェックに時間がかかると実行に影響が出るので高速なチェックが出来るものである必要がある。
プラグインを本体に組み込んでしまい、プラグイン自体使えないようにすればその辺り気にしなくてよい。
Extension 機能によって機能追加可能になっているが、プラグインのソースコード変更なしに行うことは現在できない。
ソースコードの変更なしにビルド方法の変更によってスタティックライブラリを作り、それを本体とリンクすることで本体に組み込み可能にすることが目標。

ホットキーによるコントローラ、スクリプトエディタ、監視式、コンソールの抑止

吉里吉里Zでは「コントローラ、スクリプトエディタ、監視式」は削除され、コンソールはコマンドラインとなっている。
削除された機能
これらの機能を無効化する。
吉里吉里Zでは、プラグインでコンソール出力を得られるので、それも抑止する。
コンソール出力自体を無効化すると、少し高速化すると思われる。 TVP_LOG_TO_COMMANDLINE_CONSOLE を付けずにビルドするとコマンドラインにはログが出力されなくなる(公開バイナリはONで出力される)。
コンソール出力を無効化するのなら、OSSライセンスをログに出力するタイプのプラグインもあるので、そのようなプラグインを使用する場合は、licenseが記述されたテキストを別途添付する必要があるので注意が必要。

バイトコード化

TJS2スクリプトがそのままの状態で格納されていると解析が容易なので、スクリプトをバイトコード化する。
バイトコード化はScripts.compileStorageによって可能。
アーカイブが暗号化されていても、そこを突破されることはあるので、スクリプトの解析を困難にしておく意味はある。
また、バイトコードの方がスクリプトよりも高速に読み込める(スクリプトのコンパイルが事前に行われているので)。

バイトコードの難読化

バイトコードの解析を困難にするため難読化する。
難読化は主に可読可能な文字列を置き換えることで処理の類推を困難にする。
組み込みの関数の難読化も同時にできるとより強力である。
現在TJS2バイトコードの難読化ツール等は提供されていない。

アーカイブの暗号化

xp3アーカイブはリリーサーに暗号化dllを渡すことで暗号化することが出来る。
復号化はtpmプラグインを読み込ませることで行う。