こんいちは!
こんにちは!
前回は、DLLインジェクションを学んだ。
今日は、バイナリハックとAPIフックについて演習を行う。
katahiromz/GameCheat https://github.com/katahiromz/GameCheat
これをダウンロードしてRosBEで普通にビルドしてくれ。
game1は得点を表示するだけのプログラムだ。 game1を起動すると「Your score is 123456.」と表示される。
【演習1】 game1.exeに対してバイナリエディタを使って、この123456を999999に変更せよ。 ただし、ソースを変更してはならない。
ヒント:Windows電卓で「123456」を16進に変更してリトルエンディアンに直す。バイナリエディタでバイト列を検索。
game2はチェックサムをチェックする以外はgame1と同じ。 checksumはEXEファイルのチェックサムを変更するプログラムだ。
【演習2】 game2.exeに対して同様にバイナリエディタを使って、この123456を999999に変更せよ。 ただし、ソースを変更してはならない。
game2.exe変更後に「checksum.exe --add game2.exe」を実行すればチェックサムを更新できる。
【演習3】 game3.exeに対してRisohEditorを使って犬(dog.bmp)のイメージを抽出せよ。
【演習4】 game3.exeに対してRisohEditorを使って犬(dog.bmp)のイメージをタヌキ(tanuki.bmp)に置き換えよ。 ただし、ソースを変更してはならない。
【演習5】 game3.exeをgdbでデバッグを試みよ。
(入力例)
cd GameCheat\build
gdb game3.exe
(gdb) run
(gdb) quit
【演習6】 バイナリエディタを使って、game3.exeの「IsDebuggerPresent」を「SwitchToThread」に変更し、 再びgame3.exeをgdbでデバッグを試みよ。SwitchToThreadの後ろにヌルバイトを置くことを忘れずに。
kernel32!IsDebuggerPresentは、デバッガがアタッチされているかどうか確認する関数だ。 これを使えば、デバッガによる解析をある程度妨害することができる。 しかし演習6のように突破は容易だ。 他には、条件ジャンプ命令をnopで埋めたり、条件ジャンプの条件を変えるというテクもある。
さて、次はAPIフック。
katahiromz/ApiHook https://github.com/katahiromz/ApiHook
こちらをRosBEで普通にビルドしてくれ。
katahiromz/InjectDLLと同じようにDLLインジェクションを行って、 payloadモジュールでdoHookAPI関数を呼び出してAPIをフックしている。 これによりメッセージボックスのメッセージを変更できる。
今回は、メインモジュールのみをフックしている。 DLLが付属するアプリでは、payload以外のDLLモジュールに対してもフックしないと効果がない。
【演習7】 ApiHookのinjectorとstarterの動作を確認せよ。
APIフックを使うとAPI関数の動作を自由に置き換えることができる。 ゲームチートで悪用される技術だが、停止できないサーバーの保守や、レジストリを使うアプリをポータブル版にするのにも使われている。 ゲームの改造品や改造に関するツールのことをMOD (modification)と呼ぶ。
念のために言っておくが、市販のゲームのMODを販売目的で所持していたら著作権違反で捕まるからな。 まあ、気を付けることだ。
今日はここまで。
わかりました