Skip to content

Latest commit

 

History

History
96 lines (63 loc) · 3.6 KB

2022-05-22.md

File metadata and controls

96 lines (63 loc) · 3.6 KB

2022-05-22

こんいちは!

こんにちは!

前回は、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フック

さて、次は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を販売目的で所持していたら著作権違反で捕まるからな。 まあ、気を付けることだ。

今日はここまで。

わかりました


戻る | 次へ