Seaside Laboratory

Posts

KFX 逆汗道中記

KFX を逆アセンブルして解析した時に得られた情報や仮説を述べてみたいと思う。アセンブラや Windows の理解不足による間違いがあるかもしれないので注意すべし。

voice.lst のリソースは静的確保

voice.lst の登録数を増やすことができれば表現の幅も広がるし、安定した KFX 環境になると思ったので、改造にチャレンジしたが登録数を拡張することはできなかった。拡張が行えなかったのは、登録領域が動的 (malloc or new) ではなく静的 (配列) に確保されている可能性が高い。

ヒープ領域を動的に確保しているコードがみつからない

逆アセしたコードはすさまじい量なので、全部のコードを目で追ったわけではないが、怪しいと思われるコードを追ってみたり、確保すべきヒープ領域数で絞り込んだりしたが、それらしきコードは見つからなかった。

バグの再現性

voice.lst で範囲外の領域 (マイナス表記など) を使った際に起こる不具合はなぜ再現性があるのだろうか。例えば、マイナス指定をしたときにスーパーコンボ用の影が出なくなることがあるが、これは影を制御しているシステム領域が上書きされ、破壊されてしまうのが原因と思われる。

マイナス指定によってシステムを破壊。

確実にシステム領域を破壊するには、VOICE 領域と隣接している必要がある。もしプログラムが動的に VOICE 領域を確保していると仮定した場合、この理論は成り立たたなくなる。基本的に、領域の動的確保というのは OS が見つけた空き領域を使うことになっているので、毎回 VOICE 領域が同じ位置になる保証は無い。

前回ロードしたキャラのリソースが使用できる

時々 voice.lst の記述ミスが原因で、前回ロードしたキャラの音声が再生されてしまうことがある。これは、前回のキャラが使用した VOICE 領域を参照したことが原因だと予想がつく。もし、VOICE 領域が動的に確保された場合、毎回前キャラが使った領域を参照できる可能性は低い。