Seaside Laboratory

Posts

KFX ハックの歴史

KFX 進化の裏にハックあり。

各種拡張エンジンを作る上で必要なデータ構造やゲーム仕様の多くは KFX をハックしたときに得られたものである。そんなハックの歴史を忘れないうちに書いておくことにする。

リソース書き変え (1999 年頃)

ゲーム中で使用されている一部の画像データは実行ファイルにリソースとして埋め込まれているので、見た目を変えたいと思ったらリソースを改変しなければならない。この改変作業は専用のツールを必要とするので少々敷居の高いものだったが、改変済みの実行ファイルをパッチという形で配布することで、一般ユーザーでも気軽に見た目を変更できるようになった。

自分がネットを始めた頃には既にいくつか出回っていたので誰がやり始めたのかは知らないが、おそらく初出は SHUN さん作の「KOF 風 KFX」だと思われる。

改変版にもかかわらず KFX 最終バージョンの 1.31 と同じ見た目になっているのは、この改変リソースを公式が取り込んでしまった、という経緯がある。

キャラパターン解析 (2000 年頃)

KFX で使われているデータは bmp や wav といったプレーンなフォーマットが多いので、Windows 標準のアクセサリとキャラ作成の知識さえあればキャラの改造は難しくないが、chara.bmp だけは特殊な形式になっているので自由に改変することができなかった。

キャラの改造や紛失したスプライトを復元したいというニーズは根強く、pattern.pat のフォーマット解析と、その解析データを元にした復元ツール、通称「パターンクラッカー」が作られるのは時間の問題だった。当時の KFX 界隈はプログラマーが多かったこともあり、パターンクラッカーも数種類作られることになるが、自分が知っている限りでは SHUN さん作の「KF-X Character Viewer」が初出だと思われる。

当時、この吸出し行為はタブーとされていたので、親交のあるナックラーだけにこっそりと配られ、一般配布されることはなかった。

実行ファイル書き変え (2000 年)

KFX にはトレーニングモードがないので、当時のキャラ動作テストは少々骨の折れる作業だった。この負担を軽減してくれたのが Ya-Ta さん作の「kfdebug.exe」。

ゲージの減算処理などをバイナリレベルで無効化することによって、疑似的なトレーニングモード状態を作り出す。

例えば、スーパーコンボ発動処理では以下のような変更が加えられている。

sub eax,00000080 ; 元
sub eax,00000000 ; 改変後

スーパーコンボゲージの減算量を 80 (128) から 0 に変えることでゲージが減らなくなり、何度もスーパーコンボが出せるようになる。

メモリ書き変え (2001 年)

疑似トレーニングモードをプログラムの書き変えで作り出していた kfdebug.exe に対し、メモリ書き変えで実現したのが namasan さん作の「KnuckleHacker-X」。

KFX 起動時に常駐させて使用する。

動作原理については特に触れられてはいないが、プログラムの性質や API に WriteProcessMemory が使用されているところからすると、KFX のプロセス空間にあるメモリを書き変えることでゲージ類の操作を行っていると思われる。

変更項目を自由に選択できるのがメモリ書き変え方式の良いところ。

DLL ハイジャック (2002 年)

まず、DLL ハイジャックについてスラドから引用。

Windows には動的ライブラリ (DLL) を相対指定で読み込もうとすると最初にカレントディレクトリから探すという仕様があり、脆弱性の原因はその仕様を考慮しないでソフトウェアが作られたことにある。

DLL ハイジャックを行うと、言葉通りプログラムを「乗っ取る」ことができる。大抵は脆弱性の話でしか使われないネガティブな単語ではあるが、乗っ取りをうまく使えば元のプログラムを改変せずに拡張できるという良い面もある。この手法を使って KFX に機能拡張を施したのが飛龍++さん作の「KFKeyConf」。

KFX は Windows 標準の DLL である user32.dll と winmm.dll を呼び出しているので、これらを乗っ取ってキーコンフィグや MP3 再生を行っている。

KFKeyConf は KFX にパッチを当てることで呼び出し DLL を切り替えているので、厳密に言えば同名の DLL を置くことで乗っ取りを行う DLL ハイジャックとは少々異なる。

実行ファイル書き変え (2002 年)

リソース書き変えによって見た目の改変はできるようになったが、スプライトの表示位置や大きさはプログラム内にハードコーディングされているのであまり自由度は高くない。だからといって、プログラム内に埋まっている値をバイナリエディタで一つ一つ書き変えていくのは大変な作業になる。この書き変え作業を簡単にするために作られたのが拙作の「KnuckleFighter-X PowerTools」。

付属のパッチファイルにはサーチ済みのアドレスが登録されているので、ちょっとした修正であれば簡単にプログラムを書き変えることができる。

「Default FPS Changer」という FPS 変更に特化したツールも存在したが、KFXPT に取り込まれる形で消滅した。

逆アセンブル (2002 年)

KFKeyConf から始まった逆アセンブルによる解析の流れはとどまるところを知らず、最終的には飛龍++さんの手によって KFX の全プログラムが C++ のソースコードとして逆コンパイルされることになる。そのソースコードに手を加え、再度コンパイルしたものが「Knuckle Fighter-X+ (仮)」。

紛らわしい名前になっているが、

解析結果の副産物みたいなもの。
今一番の遊び道具。
先に言っておくけど KFA キャラは動かないぞw
あくまで、KFX+ です。Win 版 KFA ではない。
ベター KFX という言葉がピッタリかな。

と書かれているように、後にリリースされる XPlus とは別物 (方向性が違う) である。

このソースコードは XPlus や KFM のベースとなったが、プログラムの拡張性や著作権の問題もあり全て書き直されている。

上位互換の拡張エンジンが出揃ってからは KFX をハックする意義はなくなり、バイナリーとしての KFX はひっそりと役目を終えることとなった。