制作日記

こういうの作った方が、逃げにくいじゃない

キー

追記 escキーの位置が間違ってました、実際には0x4B6981
    申し訳ないです


実際のとこ、これはどういう実装してんだろうという疑問

MUGENの開発言語はC、コンパイラはおそらくVC++

まともなプログラミングなんてここ数年してないし、WinAPIはさっぱり

逆アセして解析したわけでもなし、9割がた推測で書いてる適当な考察

1.はじめに
 この考察では各キーの押下がどのように記録され、各キーに対応する動作はどのように制御されているかを考える。

2.各キーの変数
 各キーごとにBYTE型の変数が用意されており、対応しているキーが押下されていれば1、そうでなければ0が格納される。ただし、PauseとCapsLockのみトグルになっており、押下される毎に格納されている値が1と0で切り替わる。各変数のアドレスなどの詳細は最後に図を載せている。
 各キーの状態を調べる方法として、WM_KEYDOWNとWM_KEYUP、GetKeyboarState()、GetKeyState()がある。同時押しの判別が必要であること、キーの状態を格納している変数の並びがGetKeyboarState()で取得できる配列の並びと異なること。この2点からGetKeyState()を利用していると推測できる。
 
3.各キーに対応した処理への分岐
 処理の分岐条件をif(byte key != 0 && GetkeyState())とする。byte keyへの値の代入は分岐先の処理内で行う。メモリ上の変数を書き換えただけでは各キーに対応した処理が行われないことから、これに近い条件であることは間違いない。ここで問題となるのはメモリ書き換えで実際に各キーに対応した処理が行われるPause、F3、Spaceである。実際の動作から、これらのキーの分岐条件はif(byte key)である。
 まず、Pauseについて考える。前述したように、PauseとCapsLockのみ押下さているかどうかではなく、押下される毎に変数の値が切り替わっている。つまり、この2つのキーに関してのみ、キー入力の記録方法が異なっている。トグル形式にした理由はPauseの処理自体の特異性にある。他のデバッグキーの処理が押下された際に1回実行されるだけで以後試合が続行されるのに対し、Pauseは1度押下された際には試合の処理が停止し、もう一度Pauseが押下されるまで再開しない。つまり、試合の停止という1つの処理を2度の押下で制御している。実際にこの処理を実装するならば、ソースコードの可読性や利便性を考慮して、変数に格納する値をトグル形式にすることはあり得る。そして、変数の値がトグル形式ならば、分岐条件にGetStateKey()は必要ない。以上から、上述の分岐条件だと推測した。
 F3とSpaceも同様に変数が分岐条件だと推測できる。F3とSpaceの分岐条件が異なる理由は、ラウンドリセットなど他のデバッグキーの処理は連続で実行されないのに対し、ゲージMAX処理は毎フレームごとに行う必要があるからである。つまり、押下されたフレームだけでなく、押下さているフレームも処理を行う。これだけでは、他のデバッグキーと分岐条件は異なるがその条件が変数のみであるとは言えない。しかし、実際の動作から、GetKeyState()が条件に含まれていないのは明らかである。Pause同様、他のデバッグキーと処理と分岐条件が異なることから、条件をPauseと同一にした可能性がある。
 以上から、変数が分岐条件となるキーは、対応する処理が複数フレーム連続で行われる処理の場合である。

4.まとめ
いろいろ考えたけど、適当だよと。
F1とかのデバッグキーの処理をメモリ書き換えで実行させるのは困難。
一応、No_Limit_patch版ならコードを書き換えれば可能、条件分岐のとこを書き換えるか、関数呼び出しを書き換えるか。
mugenplusは無理、メモリ上での属性の問題でコードの書き換えが不可能。毎フレームGetKeyState()なりGetKeyboardstate()なりで変数に値が代入されるから事前に変数を書き換えても無駄、そもそも分岐条件に使わないと思うから書き換えても無駄。F3とかなら分岐条件のおかげでそこらへんの処理が違うからなんとかなったんだろうけど。

最後にメモリ上に各キーの変数がどういう風に並んでるか載せとく。
変な略語使ってたりするけど、気にしない。NはNum、RHTはRIGHT、LSHはLSHIFT、NENはNumEnter、PASはPauseね。
mugen_key

※注釈
CAPS LOCKとPAUSEはトグル
ACTはアクティブ、非アクティブを表す

このすぐ下、"高位"のアドレスにもキーの状態が記録されている。
並びもこれと異なっていて、どういう規則で並べているのかわからん。
pauseキーがなかったり、F3書き換えても動かなかったりで何のためにあるのかすらわからん。

追記
工夫は必要だけどキー入力のログから実行できるのね、盲点だった。

更に追記
この記事はキーログの存在を知る前に書いた記事だからね?
上の追記は誤解与えそうだけど、実はキーログの存在しらなかったんだ
だからキーマップだけで処理してること前提に書いてるから間違ってるとこ結構あるよ

コメントの投稿

非公開コメント

プロフィール

Author:drab
霊夢改変キャラ
「12 3 ! {V} [_]」
公開中
L霊夢でもl_reimuでも好きなように読んでください

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク