a

よろしくのキワミ

Reversing進捗7

Reversing進捗7

・ImagePrc

動作確認

f:id:toDo:20190107060704p:plain

起動するとwindowが開き空白の部分に絵が描けるようになっている。

f:id:toDo:20190107060954p:plain

ボタンを押すと"Wrong"と表示される。
正しい絵を描くとよさそうですね。

解いていく

動作確認の段階では正しい絵を描く、又はそこを判定している処理を探すことにするつもりだったが絵の判定プログラムがどういう風に組まれているのか想像できなかったため調べるところから始めた。

お勉強

まずは参照している関数を見てみる

f:id:toDo:20190126170752p:plain

すると怪しい名前のBeginPaintという関数を参照していることがわかる。

BeginPaint function

HDC BeginPaint(
  HWND          hWnd,
  LPPAINTSTRUCT lpPaint
);

この関数を呼び出しているあたりを見てみるとすぐ下で別の関数を呼び出している

f:id:toDo:20190126171440p:plain

この二つの関数で検索をかけるとビットマップの描画についての記事がたくさん出てくる
つまりビットマップの描画に関する処理を行っているわけだ

BeginPaint関数を呼び出しているアドレスにブレークポイントを置いて絵を描こうとすると 処理がブレークポイントで止まるため、描画するたびに毎回この処理を読んでいるらしい。

処理の続きを見てみると画像を作成しているであろう関数が呼ばれている。

f:id:toDo:20190126183106p:plain

// CreateCompatibleBitmap function

HBITMAP CreateCompatibleBitmap(
  HDC hdc,
  int cx, // width
  int cy // height
);

引数として画像のサイズを受け取っているのがわかる。
つまりこの画像のサイズは

f:id:toDo:20190126183726p:plain

のようになっているはずだ。

エラーメッセージからさかのぼる

checkボタンを押した際に"Wrong"と表示されることがわかっており、文字列検索に引っかかるためそのあたりの処理から見ていくこと以する。

f:id:toDo:20190126172646p:plain

FindResourceAという関数とLoadResource、LockResourceという関数が見つかる。 この3つの関数で再び検索をかけるとユーザが定義したアプリケーション独自のリソースを使うことができるようになるらしいということがわかった ← ???????

その下では繰り返し処理が行われていて、上記の関数たちで読み込まれたデータと何かのデータを比較しており一致しなければ"Wrong"のメッセージボックスが表示されるようになっている。

つまりプログラムのどこかに画像ファイルが埋め込まれておりそこと比べているのだと思う。

最近ダウンロードしたが使い道が思い浮かばなかったバイナリエディタで中を見てみる。 どれがbitmapのデータだろうか

f:id:toDo:20190126175549p:plain

SlideShare目grepの解説

を見たことを思い出す。
その資料曰くBMPのようなべた画像の場合は繰り返しが見られるとのことだった。
バイナリエディタのビットマップ部分をスクロールすると

f:id:toDo:20190126195208p:plain

となっているのがわかる。
これが繰り返し処理に見えなくもないのでおそらくここの部分を切り出してやれば画像ファイルになるのではないか

というところまでわかったのだが肝心のデータの取り出し方がわからない。
Linuxならobjdumpを使用すればファイルの切り出しができるのだが....
既存のbmpファイルにバイナリデータをコピペすればできるだろうか?

f:id:toDo:20190127033030p:plain

できた

感想

実行ファイル内に含まれる別のファイルの取り出しについて少しわかったが、画像以外のファイルの取り出しだった場合は雑な方法では取り出せないだろう。

もう少しうまい取り出し方を調べようと思う。
(FindResourceについて知ることができたのはよかった)

プライバシーポリシー お問い合わせ