Category: Windows Driver Kit

Windows Sever のファイルログを取る方法 (WDK; Windows Driver Kit)

はじめに Windows のファイルのアクセスログを取得する方法はいろいろあります。 大まかに考えると以下の方法が考えられます。 Windows 標準のオブジェクト・アクセス監査 (このデータを集計しているパッケージもいくつかあります。) http://itpro.nikkeibp.co.jp/article/COLUMN/20061127/254976/ FileSystemWatcherクラスで取得する方法(詳細なログがとれなさそう) http://www.atmarkit.co.jp/fdotnet/dotnettips/281filewatch/filewatch.html API レベルでファイルI/Oをフックする方法 File System Filter Driverでファイルログを取得する方法(推奨) まずはAPIレベルでファイルI/Oをフックする方法を見てみます。 APIレベルのほとんどの方法はWidnows64bit OSの制限に引っかかるので、ファイルログをとるのには、後術する、 File System Filter Driver というのをおすすめします。 グローバルフック (Global Hook) 主な関数 SetWindowsHookEx() NtSetInfomaintFIleのフックには使えない MSのx64の制限事項になったと思われる。 Message FIFOをフックしているだけなのでAPIフックには使用できない、 キーボードや, マウスのフックは有効 x86では問題なく、サンプルも豊富 ラッパーDLL (Wrapper DLL) NTOSKERNL.exeをラッピングするのはやばそう。しないほうがよいかも 通常はKernel32.dll 等のラッパーを作り、対象のexeファイルレベルでIATテーブルをファイルレベルで変更する。 x86では問題なく、サンプルも豊富 IATフック (ファイルベース) Srv.sys”(windows のファイルサービスのコアモジュール) のリバースエンジニアリング、不正改造にあたるかもしれない ■手順 ①「srv.sys」 をコピーして 「srvExone.Sys」を用意する。 ②「srvExone.sys」 ファイルのIATテーブルを置き換え 「NTOSKERNL.exe!NtSetInfomationFile」 ↓ 「FSM.sys!NtSetInfomationFile」 ③registoryのservice の 「srv.sys」 から「srvExone.Sys」に変更する ■事前に以下を準備 ①FMS.sys にexportとして「FSM.sys!NtSetInfomationFile」を準備する。 IATフック (メモリベース) 参考: http://keicode.com/windows/win09.php srv.sysはカーネルモードで動作するのでユーザモードからIAT書換不可 IATは標準でメモリプロテクト状態(書換時メモリプロテクト例外でシステムダウン) ■検証方法 ①fms.sysという自前デバイスドライバーを作って、カーネルモードで動作させる。 ②fms.sysからIATテーブル書き換え x86-IAT書き換え成功 方法->CPU CR0 Memory WriteProtect check bitを1にして メモリプロテクトチェック外し書き着替える。x64-IAT書き換えが不明 方法1–>CPUのWriteProtectbitがどれか不明、–>調査必要 ※また、x64コンパイラーから インラインアセンブラが使用付加となったため、 MASMで書く必要がある。–>未調査方法2–>自作関数でメモリ自体のプロテクトを外す–>調査必要 ユーザモード用意されている、メモリプロテクトを外す関数 kernel32.dll!ProtectVirtualMemroy ntdll.dll!NtProtectVirtualMemroy ※カーネルモードでは ntoskernl.exeで作らないといけない③IATが実行する関数 NtWriteProcessMemoryでsrv.sysに関数を追加するか必要があるが未検証 おそらく NTOSKERNL.exe にNtWriteProcessMemoryないので、 fms.sys をエクスポートして、それの関数名でIATをおきかえればよいと思う。 SSDTフック 参考:http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035 MSのx64の制限事項になったと思われる。 メモリレベルでSSDTテーブル書き換え (NTOSKERNL.exeのExportテーブル) x86では問題なく、サンプルも豊富 参考(IDT, SDT, SSDT, KiSystemService) http://itpro.nikkeibp.co.jp/article/COLUMN/20070928/283201/ Microsoft OS 64ビットでの規制 システム サービス テーブルの変更。(たぶんSSDTのこと) 割り込みディスクリプタテーブル […]

Windows Driver kit のサンプルをデバック(WinDbg)してみよう

usbview.exe を使ってDebugの説明をします。※Windows Driver kit のインストール(WDK) を参考のこと WinDbgを起動します。※WinDbgについてはWindowsカーネルデバックの準備(Virtual PC)  を参考のこと ソースファイルと、exeファイルを開きます。※ビルド時にexe ファイル内にpdbの位置情報とタイムスタンプのようなものがありそれが無効である場合は、exeと同じディレクトリにpdbがないか確認します。 ※されにpdb内にはexeとソースファイルを紐づける役割もしますので、ソースレベルでデバックが可能になります。 ソースファイルをひらきます。WinDbgメニュー\File\Open Sorce Fileソース C:\WinDDK\7600.16385.1\src\usb\usbview exeファイルを開きますWinDbgメニュー\File\Open Executableexe C:\WinDDK\7600.16385.1\src\usb\usbview\objchk_wxp_x86\i386\usbview.exe ※exeがひらいたあとは、exeがDLLを読み込んだ後、止まっている状態です。 ブレイクポイントを設定します。以下のコマンドを入力してEnterを押すbp WinMain ブレークポイントが設定されているので以下のコマンドをいれてEnterを押して、exeを継続させます。 g     WinMainで止まっていますのでF10等を押すとシングルステップしてきます。

Windows Driver kit のインストール(WDK)

Windwos Driver Kit (WDK)を入手してインストールします。 以下のサイトより最新のWDKを入手します。 最新のものは最新のOSに対応していますので必ず最新のものをダウンロードしましょう。 http://msdn.microsoft.com/ja-jp/windows/hardware/gg487463 ダウンロードしたものをインストールします。 以下のパスにインストールしました。 C:\WinDDK\7600.16385.1 メニューからマイクロソフトのサンプルをビルドしてみます。 ※今回実験で使用するパソコンはXP+SP3です。 以下のメニューより ビルド環境を立ち上げます。 スタート メニュー\プログラム\Windows Driver Kits\WDK 7600.16385.1\Build Environments\Windows XP\x86 Checked Build Environment※Windows XP Build環境には以下の2つがあります。 x86 Checked Build Environment –>最適化等されないので、デバックをするときにはこちらでビルドしましょう。 x86 Free Build Environment –>本番環境へリリースする場合はこちらでビルドしましょう。 この画面に “build makefile”  と入力します。 ビルド環境を立ち上げると、Launching OACR monitor を起動してきます。 タクストレイに常駐してビルド(コンパイル)時に不適切なコードがあると警告をしてくれます。 サンプルがたくさんあるのですが、usbviewういのを を実行してみましょう。 ※ビルドするだけですので、簡単に説明するために sys ファイルでないものでやってみます。(カーネルドライバーでない。) ※このサンプルの説明とテスト方法は以下にあります。 C:\WinDDK\7600.16385.1\src\usb\usbview exeをビルドします。 >cd C:\WinDDK\7600.16385.1\src\usb\usbview >build ——- 中省略 ——- Compiling resources – usbview.rc Compiling – usbview.c Compiling – display.c Compiling – enum.c Compiling – debug.c Compiling – devnode.c Compiling – dispaud.c Compiling – generating code… Linking Executable – objchk_wxp_x86\i386\usbview.exe BUILD: Finish time: Tue Dec 20 16:46:33 2011 BUILD: Done 9 files compiled – 1 Warning – 6,364 LPS 1 executable built ビルド後以下のフォルダーに[usbview.exe]が作成されます。 […]

WinDbgのコマンド一覧(command list)

Windowsカーネルデバックの準備(Virtual PC) でカーネルデバックを開始します。 コマンドを入れる場合にはまず、CTRL+BreakでOSを停止させます。 レジスターの内容をみるには 以下のようにコマンドを入力してEnterを押す。kd>r プロセス一覧をみるには以下のようにコマンドを入力してEnterを押す。kd>!process 0 0 よく使うコマンド カテゴリ 概要 コマンド(kd>) 基本(basic) コマンドHelp (Command help) ? OSを止める (Stop OS) ctrl+Brake OSを起動する (Start OS) g レジスタ レジスタ内容確認 r プロセス プロセス一覧 !process 0 0 プロセスアタッチ .process /r /p “アドレス” プロセス環境ブロック(PEB) dt nt!_PEB -r @$peb モジュール モジュールの一覧 lm モジュールの一覧(マークアップ付) lmD モジュールの詳細表示 lm vm ntdll アドレス一覧取得 !address 関数一覧 dt nt!_PEB dt ntdll!_PEB dt nt!_PEB -r @$peb dt nt!_TEB ブレークポイント ブレイクポイント設定 bp モジュール名!関数名+アドレス ブレイクポイント無効化 bd ブレイクポイント番号 ブレイクポイント消去 bc ブレイクポイント番号 ブレイクポイント一覧 bl メモリ メモリ表示(ダブルワード) dd メモリ表示(Ascii文字) da メモリ表示(UNICODE) du メモリ内容とシンボル dds メモリ内容とシンボルと既知のシンボル ddp その他 トレースしている場所 t 逆アセンブル u “アドレス” カレントスレッドのコールスタック K ヒープヘルプ !heap -?

Windowsカーネルデバックの準備(ローカルPC)

Windows XP にWinDbgをインストールします。※今回は 6.11.1404をインストールします。http://msdn.microsoft.com/en-us/windows/hardware/gg463016.aspx Previous Release version 6.11.1.404 – March 27, 2009 Install 32-bit version 6.11.1.404 [16.9 MB] ※  最新バージョンはWindows SDKに含まれます。   SDK(Windows SDK)     http://msdn.microsoft.com/ja-jp/windows/hardware/gg463009 msconfig にてOSをDebugモードにします。 システム環境変数にシンボル情報を設定してダウンロードするようにします。OS再起動します。 フォルダーを作成します。 c:\NTSYMBOL システムプロパティの環境変数に以下の値を設定します。 変数名=「_NT_SYMBOL_PATH」 編数値=「srv*c:\NTSYMBOL*http://msdl.microsoft.com/download/symbols」 Windoesスタートから、WinDbgを起動します。 WinDbgのメニューから「FIle」「Kernel Debug」を選びますと以下のダイアログが表示されます。  Local タブを選んでOKをおしますと以下の画面が表示されます。 

Windowsカーネルデバックの準備(Virtual PC)

Windows XP をメインマシンにします。 メインマシン上に Virtula PC 2004 SP1をインストールします。 http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=6D58729D-DFA8-40BF-AFAF-20BCB7F01CD1 WinDbgをインストールします。 ※今回は 6.11.1404をインストールします。 http://msdn.microsoft.com/en-us/windows/hardware/gg463016.aspx Previous Release version 6.11.1.404 – March 27, 2009 Install 32-bit version 6.11.1.404 [16.9 MB]※  最新バージョンはWindows SDKに含まれます。 SDK(Windows SDK) http://msdn.microsoft.com/ja-jp/windows/hardware/gg463009 メインマシンのVirtual PCにデバックOSをインストールします。 Windows2000Server (Virtual PC)の場合。 インストール後、デバックOSの「c:\Boot.ini」を以下のように書き換えます。 [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINNT [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINNT=”Microsoft Windows 2000 Server” /fastdetect multi(0)disk(0)rdisk(0)partition(1)\WINNT=”Microsoft Windows 2000 Server” /fastdetect /debugport=com1 /baudrate=57600※ baudrate を早くするとつながらない場合があります デバックOSシャットダウンします。 Windows XP (Virtual PC) の場合 msconfig にてOSをDebugモードにします。 Boot.INIオプションに以下を入力する。 メインマシン(Windows XP)のシステム環境変数にシンボル情報を設定してダウンロードするようにします。メインマシン(Windows XP)からViertual PC の COMポートの情報を変更します。 フォルダーを作成します。 c:\NTSYMBOL システムプロパティの環境変数に以下の値を設定します。 変数名=「_NT_SYMBOL_PATH」 編数値=「srv*c:\NTSYMBOL*http://msdl.microsoft.com/download/symbols」 名前付きパイプ=「\\.\pipe\com1」 メインマシン(Windows XP)からDosコマンドで以下を入力してWindbguを起動します。 >C:\WinDDK\7600.16385.1\Debuggers\windbg.exe -k com:port=\\.\pipe\com1,pipe ※もしくはWinDbg画面をメニューから起動して以下の操作をする。 メニュー「File」-[Kernel Debug] [COM]タブにて Pipe=チェック, Reconect=チェック, Baud Rate=57600, Port=\\.\pipe\com1 Virtual PCのデバックOSを起動します。 メインマシンのWinDbgに以下の画面が起動されたら成功です。 他に自作したDDKプログラム(sys, exe等)があって、デバックしたい場合はWinDbgのメニューからpdbフォルダーのパスを通してください。bpコマンドでブレークポイントを設定するとそのプログラムのソースデバックも可能になります。 pdbにexeとのバージョン確認情報やプログラムソース位置情報がありますので、ソースの位置を変更しないでください、また、プログラムソースとpdbとexeのバージョンが異なるとうまく動作しませんので注意してください。 パスを追加する方法WinDbgのメニューから[File]-[Symbol File Path]複数指定する場合はセミコロン(;)で仕切ってください