今回はWindowsでのアンチデバッグとして入門的な手法であるint3によるデバッガ検出についてお話しさせていただきます。実際に本質的な部分だけ取り出した原始的なデバッガを作成し、何故int3でデバッガを検出できるのか解説いたします。アンチデバッグとしての実効性はほぼありませんが、デバッガの原理の理解の手助けとなれば幸いです。今回やることint3アンチデバッグを実装したプログラムを簡易デバッガでアタッチして何故検出されるのか考えます。導入まずint3.cppとdebugger.cppをVisualStudioでビルドしてください。プログラムの説明int3.exe1.起動すると自身のプロセスIDを出力。detect!」を出力する。debugger.exe1.入力したプロセスIDのプロセスにアタッチ。2.デバッグイベントが発生するまで待機。3a例外が発生したら例外番号とプロセスID、スレッドIDを出力して実行を再開。この際例外は対象プロセスに渡さない。3b.発生したデバッグイベントが例外でなかったら、対象プロセスにそのまま渡す。実験(1)検知される場合1.int3.exeとdebugger.exeを起動して出力されたint3.exeに出力されたプロセスIDをdebugger.exeに入力してください。2.int3.exeでEnterを押すと「detect!」と出力されデバッガが検知されます。(2)検知されない場合42行目を以下のように書き換え。DBG_EXCEPTION_NOT_HANDLED);debugger.cppを上記のように再度書き換えビルドし、再度1と同じことをしてください。detect!」と出力されると思います。原理デバッガはソフトウェアブレークポイントを設置するとき、x86・x64アーキテクチャの場合int3(0xCC)をメモリの該当アドレスに書き込んで設置します。当該プログラムでint3に処理が移ったとき、例外が発生し処理がデバッガに移ります。デバッガはレジスタやメモリの値を取得するなどした後、ContinueDebugEventの第三引数をDBG_CONTINUEにして実行を再開します。これは捕捉した例外を対象プロセスに渡さずに実行を再開するというものです。これを逆手にとってint3アンチデバッグでは例外が発生する前提でプログラムを実装しておき、本来発生するはずの例外が発生しなかったら検知するというものです。デバッガ自身が設置したソフトウェアブレークポイントのアドレスを保存しておき、自身が設置したものか否かを判断して実験のようにContinueDebugEventに渡す引数を変えれば簡単に回避可能です。まとめデバッガは例外を捕捉してそのまま渡したり無かったことにしたりするなど、イメージ的には通信をインターセプトするプロキシツールのようなことが出来ます。ブレークポイントを設置してのレジスタの取得・操作やプロセスメモリの取得・書き換えなど大変便利なことが可能です。これはそのままアプリケーションやゲームに対する悪意ある攻撃にも利用可能です。弊社ではデバッガの原理を理解し解析や診断に役立てるとともに、悪意ある攻撃に対する対策を施すためにもこういった勉強は継続的に行っています。読者の皆様に置かれましても、今回の記事がそうしたことに少しでも役立てば幸いです。//対象プロセスにアタッチする。//デバッグイベントが発生するまで待機。//例外をなかったことにして実行を再開。//デバッグイベントをそのまま渡して実行を再開。本レポートに記載されている内容を許可されていないソフトウェアで行うと、場合によっては犯罪行為となる可能性があります。そのため、記事の内容を試す際には許可されたソフトウェアに対してのみ実施するようにしてください。はてなブログPro株式会社Ninjastarsではスマートフォン向けゲームを中心としたセキュリティ診断及びチート対策等のサービスを提供しております。(1)このサイトについてプライバシーポリシーはてなブログをはじめよう!Ninjastarsさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。