自信がない場合は本記事下部のおまけを参考にする。WinDBGをつかってメモ帳をデバッグしてみるWindowsで使えるデバッガは色々あり、OllyDebugなんかはUIがユーザフレンドリで使いやすく多くのユーザに使われている。一方で、WinGDBはユーザビリティが良いとは言えないものの、Microsoft公式のデバッガであり、64bitアプリケーションのデバッグにも使える。今回は、WinGDBをつかってメモ帳のデバッグを行う。環境準備Windows環境を用意するmodern.IEから評価用Windowsをダウンロードして仮想化ツール、Virtualboxで起動する。Win7、VirtualBoxを選択してインストールする。CenterからWinDBGをダウンロードする。Toolsだけを選択すればWinDGBのみをインストールできる。cmd.exeからWinDBGを実行できるように以下の環境変数を設定する。データ型などのプログラムの情報を格納しているファイルであり、デバッグに必要な情報(シンボル)が含まれたファイルのこと。デバッガとシンボルファイルリンクさせることで、デバッグでより詳細な情報を確認できる。パッケージのダウンロードから行う。filesを参考に環境変数にシンボルへのパスを設定する。環境変数名:_NT_SYMBOL_PATH値:SRV*c:\Symbols*http://msdl.microsoft.com/download/symbolsWinDBGでメモ帳をデバッグするプロセスにデバッガをアタッチするまずはnotepad.exeにWinDBGをアタッチする。notepad.exeよりプロセスにデバッガをアタッチするプロセスにデバッガをアタッチするとはじめはエントリポイントでブレーク状態になる。プロセスを動かしたいときはgを入力してブレーク状態を解放する。デバッガでプロセスの情報を確認したい場合は、WinDBGのBreakボタンをクリックする。この繰り返しがライブデバッグの基本的な流れとなる。notepadに入力した文字列がメモリのどこに格納されているか確認するnotepadに入力した文字列はファイルに保存しないとデータとしては残らないと思われがちがだが、実際にはキーボードから入力した瞬間からメモリに展開される。これを確認するには、notepadeに”hello”という文字列を入力した後に以下のコマンドを実行する。h.e.l.l.o.......notepadeが読み込まれているメモリを確認するプログラムが展開されているメモリをかくにんするにはlmfコマンドを使う。C:\Windows\system32\notepad.exeレジスタの値を確認する現在のレジスタの値を確認するにはrコマンドを実行する。eaxeax=7ffdd000メモリの中身を確認するダブルワードでメモリを確認するにはdd、ASCIIで確認するにはdaコマンドを使う。"h"コールスタックを確認する現在トレースしている場所を確認するにはtコマンドを使う。retまた、コールスタックを確認する場合はKを入力する。アドレスを指定しない場合はeipが指すアドレスからディスアセンブル結果を表示する。[edx+4],ediおまけ:最低限のバイナリ関連の知識を身に付けるいきなりWinDBGを触っても良いが、バイナリ関連の基礎を身に付けた上でWinDBGでのデバッグにつなげて行きたい。読んだが、以下だけ実施すればとりあえずOK。あとは実践形式で学習していく。Step1:レジスタ周辺の用語に慣れるはじめは用語もわからないのでスタックやレジスタに纏わる単語を理解する。用語になれた所で体系的に基礎を身につけるためにバイナリ周辺知識について体系的にまとめている書籍を幾つか読む。Linuxを対象にバイナリ関連の知識を身に付けられる。時間が無い時は2章だけ読む。Windowsが対象。