Reversing進捗7
Reversing進捗7
・ImagePrc
動作確認
起動するとwindowが開き空白の部分に絵が描けるようになっている。
ボタンを押すと"Wrong"と表示される。
正しい絵を描くとよさそうですね。
解いていく
動作確認の段階では正しい絵を描く、又はそこを判定している処理を探すことにするつもりだったが絵の判定プログラムがどういう風に組まれているのか想像できなかったため調べるところから始めた。
お勉強
まずは参照している関数を見てみる
すると怪しい名前のBeginPaintという関数を参照していることがわかる。
BeginPaint function HDC BeginPaint( HWND hWnd, LPPAINTSTRUCT lpPaint );
この関数を呼び出しているあたりを見てみるとすぐ下で別の関数を呼び出している
この二つの関数で検索をかけるとビットマップの描画についての記事がたくさん出てくる
つまりビットマップの描画に関する処理を行っているわけだ
BeginPaint関数を呼び出しているアドレスにブレークポイントを置いて絵を描こうとすると 処理がブレークポイントで止まるため、描画するたびに毎回この処理を読んでいるらしい。
処理の続きを見てみると画像を作成しているであろう関数が呼ばれている。
// CreateCompatibleBitmap function HBITMAP CreateCompatibleBitmap( HDC hdc, int cx, // width int cy // height );
引数として画像のサイズを受け取っているのがわかる。
つまりこの画像のサイズは
のようになっているはずだ。
エラーメッセージからさかのぼる
checkボタンを押した際に"Wrong"と表示されることがわかっており、文字列検索に引っかかるためそのあたりの処理から見ていくこと以する。
FindResourceAという関数とLoadResource、LockResourceという関数が見つかる。 この3つの関数で再び検索をかけるとユーザが定義したアプリケーション独自のリソースを使うことができるようになるらしいということがわかった ← ???????
その下では繰り返し処理が行われていて、上記の関数たちで読み込まれたデータと何かのデータを比較しており一致しなければ"Wrong"のメッセージボックスが表示されるようになっている。
つまりプログラムのどこかに画像ファイルが埋め込まれておりそこと比べているのだと思う。
最近ダウンロードしたが使い道が思い浮かばなかったバイナリエディタで中を見てみる。 どれがbitmapのデータだろうか
を見たことを思い出す。
その資料曰くBMPのようなべた画像の場合は繰り返しが見られるとのことだった。
バイナリエディタのビットマップ部分をスクロールすると
となっているのがわかる。
これが繰り返し処理に見えなくもないのでおそらくここの部分を切り出してやれば画像ファイルになるのではないか
というところまでわかったのだが肝心のデータの取り出し方がわからない。
Linuxならobjdumpを使用すればファイルの切り出しができるのだが....
既存のbmpファイルにバイナリデータをコピペすればできるだろうか?
できた
感想
実行ファイル内に含まれる別のファイルの取り出しについて少しわかったが、画像以外のファイルの取り出しだった場合は雑な方法では取り出せないだろう。
もう少しうまい取り出し方を調べようと思う。
(FindResourceについて知ることができたのはよかった)