SigChecker リファレンス 概要: SigChecker は、署名されたファイルが破損、書き換えられていないか 調査し、結果を返すプラグインである。 使い方: まず、前提プラグインとして sigcheck.dll が必要。吉里吉里 2.32 のソース コードはあるけれど、なぜかバイナリは頒布してないんですよな。 https://sv.kikyou.info/trac/kirikiri/browser/kirikiri2/trunk/kirikiri2/src/plugins/win32/sigcheck/ 普通はここにあるはずなんだけど…。 https://sv.kikyou.info/trac/kirikiri/browser/kirikiri2/trunk/kirikiri2/bin/win32/plugin/ このプラグインを plugin/ ディレクトリに放り込んだ後、 scenario/Override.tjs 上で以下のように読み込む。 Plugins.link('sigcheck.dll'); あとは first.ks の先頭などで以下のようにすれば、SigCheckerの機能が 使えるようになる。 [call storage="SigChecker.ks"] 加えて、トップディレクトリに SigChecker.dat というテキストファイルを 作成、配置すること。内容は以下。公開鍵pubkeyと除外ファイルリスト exceptsを持つ辞書配列。 # cat SigChecker.dat %[ pubkey: "-----BEGIN PUBLIC KEY----- MIGJAoGBAMKX4YmxqqtWKVUbHGPNrZnGz4jr1znl0EGUM3EjlHa1AVDzSXzERVtj dGkiPl1l2J2TFjFkn5jYbkSQYVXbArs2r54E/MDFs/Updwl5M3smR3tG5TJcOVSI 0Vr5z8SO6cX3L7lIo3lPZXcsOHHyxd8+3iVnb5Zmrx32qIlMRqnbAgMBAAE= -----END PUBLIC KEY-----", excepts: [ "savedata/", "savedata2/" ] ]; チェックをするには以下を実行する。これだと全ファイルの処理が終わるまで ここで待つが、非同期にもできる。 [sigcheck wait=true] [if_sigcheck_failed] [eval exp="System.inform('ファイルが破損してます')"] [eval exp="kag.closeByScript(%[ask:false])"] [endif] タグリファレンス for KAG: ================================================ [sigcheck wait= storage= path=] 説明: 署名チェックを開始する。 krkr.exe のあるディレクトリ以下の全てのファイルが対象となる。 除外する場合は、指定するファイル(def=SigChecker.dat)のexceptsに ファイル・ディレクトリ名を追加する必要がある。 実行前に前回までに実行した全ての署名チェックは終了している必要が あることに注意。 引数: wait=true|false(def) 終了までここで待つかどうか。署名チェックのためには全ての ファイルを読み込まなければならないため、大きいゲームだと かなり時間がかかる。このため、wait=false ではバックグランドで 署名チェックを開始し、後の [sigcheck_wait] でその終了を 待つという動作をデフォルトとしている。 storage=SigChecker.dat(def) 前述の公開鍵と除外ファイルが書き込まれたデータファイル。 path=&System.exePath(def) 上のstorageを読み込むパス。 [sigcheck_wait] 説明: 署名チェックの終了を待つ。待つものがなければ即終了する 引数: なし [sigcheck_cancel] 説明: 実行中の署名チェックをキャンセルする キャンセル時にもonSigCheckDone(false)が呼び出される、はず。 引数: なし [if_sigcheck_failed] 説明: KAGで [sigcheck] が成功したかどうかを調べる。[if exp=...]と同等。 引数: なし TJSリファレンス ================================================ global.sigchecker_obj.getFileInfo(datfile="SigChecker.dat",path=System.exePath); pathの場所から、署名チェック対象ファイルを検索して 内部にファイルリストを作る。同時にSigChecker.datを読み込み、 ファイルリストから不要なファイルを削除、publickeyを覚えておく global.sigchecker_obj.startSigCheck() getFileInfo()で集めたファイルリストを対象に、署名チェックを開始する。 この関数はすぐに戻る global.sigchecker_obj.isAllChecked() 全ての署名チェックがエラーなく終了したかどうかをtrue/falseで返す 未チェックのものはエラーとみなす。 global.sigchecker_obj.getErrorFiles() 署名チェックがエラーだったファイルの配列を返す。未チェックのファイルも エラーとみなす。 global.sigchecker_obj.getCheckedFiles() 署名チェックが正常終了したファイルの配列を返す SigCheckerクラスのコンストラクタが以下のように定義されていて、二つの ユーザ定義のコールバック関数が指定できる。 function SigChecker(win, onSigCheckProgress, onSigCheckDone) onSigCheckProgress(percent1, filename, percent2); 署名チェック中に現在の状況を設定して、適当な間隔で呼ばれる。必ずしも 呼ばれるとは限らない。 percent1: 処理済ファイル数のパーセンテージ filename: 現在処理中のファイル名 percent2: そのファイル中の処理済みパーセンテージ onSigCheckDone(flg) 署名チェックが全て終了した時に呼ばれる。 flg: true=署名チェックが全て正常終了した、false=一つでもエラーがあった 四方山: ・この仕組みは破損を防止するだけであり、改竄を防止することはできない。  例えば、ユーザが新たにpublickey/secretkeyを作成し、それらで全ての  ファイルを再署名し、SigChecker.dat を適当に作って書名してしまうと、  改竄をを発見することはできなくなる。 ・ホントは、こういう仕組みを xp3dec.dll みたいなデコードプラグインの  中にブチ込んで、署名つきのファイルじゃなきゃデコードせずエラー、  みたいにしとけば、改竄や割れを防ぐことが簡単になるんだけど。  機能的に分離できないし。 ・割るのはまぁいい(※先日よくなくなったけどね)んだ。でも、割った後の  データを流出させちゃダメなんだ。