19,621 views(since 2013/10/08)

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

はじめに

Windows のファイルのアクセスログを取得する方法はいろいろあります。

大まかに考えると以下の方法が考えられます。

  1. Windows 標準のオブジェクト・アクセス監査
    (このデータを集計しているパッケージもいくつかあります。)
    http://itpro.nikkeibp.co.jp/article/COLUMN/20061127/254976/
  2. FileSystemWatcherクラスで取得する方法(詳細なログがとれなさそう)
    http://www.atmarkit.co.jp/fdotnet/dotnettips/281filewatch/filewatch.html
  3. API レベルでファイルI/Oをフックする方法
  4. File System Filter Driverでファイルログを取得する方法(推奨)

まずはAPIレベルでファイルI/Oをフックする方法を見てみます。

APIレベルのほとんどの方法はWidnows64bit OSの制限に引っかかるので、ファイルログをとるのには、後術する、 File System Filter Driver というのをおすすめします。

  1. グローバルフック (Global Hook)
    主な関数 SetWindowsHookEx()
    NtSetInfomaintFIleのフックには使えない
    MSのx64の制限事項になったと思われる。
    Message FIFOをフックしているだけなのでAPIフックには使用できない、
    キーボードや, マウスのフックは有効
    x86では問題なく、サンプルも豊富
  2. ラッパーDLL (Wrapper DLL)
    NTOSKERNL.exeをラッピングするのはやばそう。しないほうがよいかも
    通常はKernel32.dll 等のラッパーを作り、対象のexeファイルレベルでIATテーブルをファイルレベルで変更する。
    x86では問題なく、サンプルも豊富
  3. IATフック (ファイルベース)
    Srv.sys”(windows のファイルサービスのコアモジュール) のリバースエンジニアリング、不正改造にあたるかもしれない
    filelog0010
    ■手順
    ①「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」を準備する。
  4. 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をおきかえればよいと思う。
  5. SSDTフック
    参考:http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035
    MSのx64の制限事項になったと思われる。
    メモリレベルでSSDTテーブル書き換え
    (NTOSKERNL.exeのExportテーブル)
    x86では問題なく、サンプルも豊富
  6. 参考(IDT, SDT, SSDT, KiSystemService)
    http://itpro.nikkeibp.co.jp/article/COLUMN/20070928/283201/

Microsoft OS 64ビットでの規制

  • システム サービス テーブルの変更。(たぶんSSDTのこと)
    割り込みディスクリプタテーブル (IDT) の変更。
    グローバルディスクリプタテーブル (GDT) の変更。
    カーネルによって割り当てられないカーネル スタックの使用。
    (AMD64 システムでのみ検出される) カーネルの任意の部分へのパッチ当て。

File System Filter Driverのサンプルプログラム

参考: http://blogs.msdn.com/b/jpwdkblog/archive/2009/05/13/filesystem-filesystem-filter.aspx
昔はAPIレベルでフックしていたのですが、現在では 標準でファイルシステムへのリクエストをフィルタリングするモジュールを作成することが可能です。

WDK(windows driver kit) の中に MiniSpyというのがあるので、そのサンプルにつきまして解説したいと思います。

Windows Driver Kit 7の場合は以下に入っています。

WinDDK\7600.16385.1\src\filesys\miniFilter\minispy

私のPCはWindows XPなので、以下のメニューから コマンドプロンプトを立ち上げます。
\スタート メニュー\プログラム\Windows Driver Kits\WDK 7600.16385.1\Build Environments\Windows XP\x86 Checked Build Environment

filelog0020

ビルド方法

  1. まずはFile System Filter ドライバーのほうをコンパイルします。
    build “C:\WinDDK\7600.16385.1\src\filesys\miniFilter\minispy\filter\makefile” 
  2. File Filter をコントロールする法をコンパイルします。
    build  “C:\WinDDK\7600.16385.1\src\filesys\miniFilter\minispy\user\makefile”

インストール方法

  1. 以下のbuildで作成された、File System Filter ドライバーを右グリックしてインストールします。
    C:\WinDDK\7600.16385.1\src\filesys\miniFilter\minispy\filter\objchk_wxp_x86\i386\minispy.inf
  2. コマンドプロンプトからドライバーのサービスを起動します。
    net start minispy
    filelog0040

使用方法

  1. コマンドプロンプトから
    C:\WinDDK\7600.16385.1\src\filesys\miniFilter\minispy\user\objchk_wxp_x86\i386\minispy.exe
    filelog0030
  2. ?コマンドでコマンドがでてきます。
    filelog0050
  3. それでは、ファイルログを出力しましょう。Cドライブを監視するといっぱいでてきますので、USB(Fドライブ)をさしてそれを監視して、監視ログはCドライブに出力する設定をします。
    コマンドプロンプトから
    >/a F:  /f c:\log.txt
    filelog0060
  4. USB(Fドライブにファイルを作成してみます。
    そうすると以下のように”c:\log.txt” にログがでてきます。
    filelog0070
  5. 最後にログ取得を切り離して、サービスを終了させておきます。
    コマンドプロンプトから
    >/d F:
    >exit
    c:\>net stop minispy
  6. Excelで簡単なminispyの構造を書きました。
    minispystruct

その他

  1. もちろん以下のようにWinDBGでデバックできます。
    Windowsカーネルデバックの準備(Virtual PC)

参考URL

HOOK

  1. インサイドMicrosoft Windows 第4版 上
    http://www.atmarkit.co.jp/fwin2k/bookpreview/insidewin4/insidewin4_01.html
  2. Windowsのプロセスツリー
    http://ittechinf.wiki.zoho.com/Windows%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%83%84%E3%83%AA%E3%83%BC.html#Windows%20NT%20Logon%20Application
  3. デバイスドライバー
    http://ruffnex.oc.to/kenji/windriver/
  4. Windows API
    http://msdn.microsoft.com/ja-jp/library/cc429126.aspx
  5. DLLの遅延読み込みをフックする
    http://hikarukaru.jugem.cc/?eid=83
  6. ファイル共有プロトコルSMB/CIFS(その1)
    http://www.atmarkit.co.jp/fwin2k/network/baswinlan020/baswinlan020_01.html
  7. 2.共有ファイルのアクセスを追跡してみる
    http://www.atmarkit.co.jp/fwin2k/network/baswinlan002/baswinlan002_03.html

    1. http://d.hatena.ne.jp/kenjiaiko/20080727/1217108068
    2. http://www.openrce.org/reference_library/win32_call_chains
    3. http://www.openrce.org/reference_library/win32_call_chains/XPSP1/KERNEL32/DeleteFileW
  8. どのシステムコールがどの関数から呼ばれているの?
    1. NtSetInformationFile hook
    2. http://www.rohitab.com/discuss/topic/36500-deletefile-hook/page__st__20
  9. Hook基礎
    http://japan.internet.com/developer/20050830/26.html#section_2
  10. 64bit32bitインジェクション
    http://nazochu.blogspot.com/2011/09/64bit32bitdll-injection.html
  11. trying to hook ntSetInfomationFile, but explorer is crashing
    http://forum.madshi.net/viewtopic.php?t=4992
  12. blocking file execution and movement with NtCreate/Openfile
    http://forum.madshi.net/viewtopic.php?t=4282
  13. http://d.hatena.ne.jp/kenjiaiko/20080728/1217198987
  14.  _FILE_INFORMATION_CLASS
    http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/File/FILE_INFORMATION_CLASS.html
  15. http://hex.pp.ua/nt/NtSetInformationFile.php
  16. http://msdn.microsoft.com/en-us/library/windows/desktop/aa365539(v=vs.85).aspx
  17. http://www.koders.com/c/fid821E16CA3AE274D8F627BCB75E95297371556012.aspx
  18. http://source.winehq.org/source/dlls/ntdll/file.c
  19. http://blog.airesoft.co.uk/code/fileid.cpp
  20. NTSTATUSエラーコード一覧
    http://accelart.jp/blog/NTSTATUSErrMsgJa.html
  21. NT DLL.h
    http://www.koders.com/c/fidD9B5EEE83DE76C7F43FCF6375ED2738BD2695194.aspx
  22. NT DLL.h
    http://webcache.googleusercontent.com/search?q=cache:XTpVoggQSDwJ:www.hackchina.com/en/r/185563/NTDLL.H__html+NtSetInformationFile+ntdll.h&cd=20&hl=ja&ct=clnk&gl=jp
  23. Hook NtSetInfomationFile
    http://read.pudn.com/downloads/2420/HookAPI1.62/DLL/HookAPI.cpp__.htm
  24. madCodeHook
    http://forum.madshi.net/viewtopic.php?f=7&t=26492
  25. 別のプロセスにコードを割り込ませる3つの方法
    http://japan.internet.com/developer/20050830/26.html#section_3
  26. http://www.codeguru.com/cpp/
  27. DLL入門
    http://web.kyoto-inet.or.jp/people/ysskondo/chap11.html
  28. messagebox hook
    http://jackseven.s22.xrea.com/programming/apihook.html
  29. http://ruffnex.oc.to/kenji/text/api_hook/
  30. 別のプロセスへのDLLマッピング
    http://ruffnex.oc.to/kenji/text/dll_inj/
  31. ImageDirectoryEntryToData
    http://dsas.blog.klab.org/archives/50908743.html
  32. http://jackseven.s22.xrea.com/programming/apihook.html
  33. http://keicode.com/windows/win09.php
  34. Kernel64
    http://sgry.jp/pgarticles/64.html
  35. windows cifs 認証 SMBパケット構造がある、ここにユーザID
    http://www.atmarkit.co.jp/fwin2k/network/baswinlan022/baswinlan022_01.html
  36. windows cifs 認証 パケット構造とか全部ある
    http://www.atmarkit.co.jp/fwin2k/network/baswinlan021/baswinlan021_01.html
  37. 開いているファイルの調査
    http://www.atmarkit.co.jp/fwin2k/win2ktips/306openfiles/openfiles.html
  38. ファイルやレジストリにアクセスしているプロセスを調べる@Process Monitor
    http://pnpk.net/cms/archives/298
  39. OpenedFilesView v1.52
    http://www.nirsoft.net/utils/opened_files_view.html
  40. NTWritefile  システムアーキテクチャ
    http://www.atmarkit.co.jp/fwin2k/bookpreview/insidewin4/insidewin4_04.html
  41. srv.sys
    1. http://www.atmarkit.co.jp/fwin2k/bookpreview/insidewin4/insidewin4_07.html
    2. http://ittechinf.wiki.zoho.com/Windows-%E3%82%B5%E3%83%96%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0.html
    3. http://ittechinf.wiki.zoho.com/Windows%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%83%84%E3%83%AA%E3%83%BC.html#Windows%20NT%20Logon%20Application
    4. http://forum.madshi.net/viewtopic.php?t=5292
  42. Filemon ソース
    1. http://forum.madshi.net/viewtopic.php?t=5292
    2. http://www.wasm.ru/baixado.php?mode=tool&id=283
  43. IFSMgr_InstallFileSystemApiHook
    Examining the Windows NTFilesystem
    http://drdobbs.com/windows/184410131
  44. File System Filter Drivers
    http://msdn.microsoft.com/en-us/windows/hardware/gg462968.aspx
  45. srv.sys srvsvc.dll
    1. http://support.microsoft.com/kb/830901/ja
    2. http://srv-sys.file.file-is.com/
  46. ファイルシステムフィルタドライバ ―
    http://www.atmarkit.co.jp/fwin2k/bookpreview/insidewin4/insidewin4_06.html
  47. srv.sys smb
    http://forum.sysinternals.com/virtual-backup-to-cifs-share_topic19797.html
  48. windows driver 開発
    http://www.microsoft.com/japan/powerpro/TF/column/ah_01_1.mspx
  49. Windows Device Driver Programming Part 1
    http://ruffnex.oc.to/kenji/windriver/
  50. DriverObject と DriverEntry
    1. http://blogs.msdn.com/b/jpwdkblog/archive/2009/05/22/driverobject-driverentry.aspx
    2. http://www.devdrv.co.jp/seminar/31-2005.pdf
  51. DDK Download
    http://msdn.microsoft.com/en-us/windows/hardware/gg454513.aspx
  52. WinObj
    http://technet.microsoft.com/ja-jp/sysinternals/bb896657(en-us).aspx
  53. ntoskrnl 4
    http://www.atmarkit.co.jp/fwin2k/win2ktips/236portcheck/portcheck.html
  54. svchost.exe プロセスとは
    http://www.atmarkit.co.jp/fwin2k/win2ktips/400svchost/svchost.html
  55. System Service Dispatch Table (SSDT)
    http://dl.packetstormsecurity.net/hitb04/hitb04-chew-keong-tan.pdf
  56. hook KiServiceTable
    1. http://d.hatena.ne.jp/mayahu32/20111023/1319381614
    2. http://www.codeproject.com/KB/system/lookup.aspx
  57. ZwTerminateProcess()のフック
    http://d.hatena.ne.jp/mayahu32/?of=5
  58. ZwCreateFile()をフックしてファイルの作成とオープンを禁止する
    1. http://d.hatena.ne.jp/mayahu32/
    2. http://d.hatena.ne.jp/mayahu32/20111104/1320391133
  59. ドライバー開発
  60. http://ruffnex.oc.to/kenji/windriver/
  61. http://ruffnex.oc.to/kenji/windriver/driver2.html
  62. http://ameblo.jp/tamanotsuribori/entry-10087249604.html
  63. KeInitializeSpinLock
    1. http://blog.livedoor.jp/blackcat_1973/archives/2005-05.html?p=2
    2. http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%94%E3%83%B3%E3%83%AD%E3%83%83%E3%82%AF

DDK

  1. KeAcquireSpinLock
    処理が終わるまでほかのCPUが変数にアクセスできなくすることができる
    http://blog.livedoor.jp/blackcat_1973/archives/2005-05.html?p=2
  2. KeReleaseSpinLock
    ビジーウェイト状態を発生させる
    http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%94%E3%83%B3%E3%83%AD%E3%83%83%E3%82%AF
  3. InterlockedIncrement
    指定された変数の値をインクリメント
  4. InterlockedDecrement
    指定された変数の値をデクリメント
  5. InterlockedOr
  6. ExAllocateFromNPagedLookasideList
    http://msdn.microsoft.com/en-us/library/windows/hardware/ff544601(v=vs.85).aspx
  7. InterlockedExchange
    http://msdn.microsoft.com/ja-jp/library/cc429230.aspx
  8. ROUND_TO_SIZE
  9. RtlCopyMemory
    http://nadia.kabe.to/bluewater/techniq/
  10. KeQuerySystemTime
    http://support.microsoft.com/kb/239818/ja
  11. InsertTailList
    http://keicode.com/windows/list-entry.php
  12. RemoveHeadList
  13. InitializeListHead
  14. InsertHeadList
  15. InsertTailList
  16. IsListEmpty
  17. RemoveTailList
  18. InitializeObjectAttributes
    http://support.microsoft.com/kb/891805/ja
  19. ZwOpenKey
    http://blog.livedoor.jp/blackcat_1973/archives/20918953.html
  20. ZwQueryValueKey
  21. ZwClose
  22. FltGetFileNameInformation
  23. FilterConnectCommunicationPort
  24. CreateSemaphore
    http://msdn.microsoft.com/ja-jp/library/cc429076.aspx
  25. WaitForSingleObject
  26. IoIs32bitProcess
    http://blogs.msdn.com/b/jpwdkblog/archive/2009/06/24/9801511.aspx
  27. FltCreateCommunicationPort
    http://msdn.microsoft.com/en-us/library/windows/hardware/ff541931(v=vs.85).aspx
  28. http://support.microsoft.com/kb/262305/ja
  29. 未使用引数の注意文出力を回避するには
    UNREFERENCED_PARAMETER
  30. メモリを節約  #pragma alloc_text INIT
    http://i-web.i.u-tokyo.ac.jp/edu/training/ss/msprojects/kernel.html
  31. メモリ領域を節約 #pragma alloc_text PAGE
  32. 勉強 基礎サイト
    http://i-web.i.u-tokyo.ac.jp/edu/training/ss/msprojects/kernel.html
  33. DriverEntry(
    DriverObject ドライバオブジェクトへのポインタ.
    RegistryPath ドライバのレジストリキーを示すユニコード文字列
  34. ミューテックス
    相互排他制御に用いる
  35. NtCancelIoFile
    http://i-web.i.u-tokyo.ac.jp/edu/training/ss/msprojects/data/02-WindowsDriverModel.pdf
  36. FltGetRoutineAddress
    http://msdn.microsoft.com/en-us/library/windows/hardware/ff543140(v=vs.85).aspx
  37. MmGetSystemRoutineAddress
    http://msdn.microsoft.com/ja-jp/windows/hardware/gg463187
  38. カーネル モード ドライバーで DLL を呼び出す
    http://msdn.microsoft.com/ja-jp/windows/hardware/gg463187
  39. FltRegisterFilter
  40. FltBuildDefaultSecurityDescriptor
  41. FltCreateCommunicationPort
  42. FltFreeSecurityDescriptor
  43. RtlInitUnicodeString
  44. ExInitializeNPagedLookasideList
    http://blog.livedoor.jp/blackcat_1973/archives/20897723.html
  45. ドライバロード設定と動作手順
    http://d241445.hosting-sv.jp/community/report/report19.html
  46. 64ビット版ドライバのデジタル署名について
    http://www.wdddc.net/node/117
  47. Winqual と LogoPoint
    http://www.wdddc.net/node/107
  48. ユーザー モード ドライバー フレームワーク (UMDF
    http://msdn.microsoft.com/ja-jp/windows/hardware/gg463294
  49. ファイルシステムフィルタードライバー
    http://www.wdddc.net/node/43
  50. 64bit版ドライバのインストールとテスト
    http://www.devdrv.co.jp/windows/#64bihttp://www.devdrv.co.jp/windows/#64bi
  51. イベントログ出力
    http://blogs.msdn.com/b/jpwdkblog/archive/2011/05/31/10169819.aspx
  52. Windows Device Driver Programming Part 2
    http://ruffnex.oc.to/kenji/windriver/driver2.html
  53. 新しいファイル I/O キャンセル API
    http://msdn.microsoft.com/ja-jp/library/aa480216.aspx
  54. DDK:ドライバからの非同期イベントの通知
    http://support.microsoft.com/kb/117308/ja
  55. 64ビットデバイスドライバーのデジタル署名
    http://social.technet.microsoft.com/Forums/ja/w7itprohardwareja/thread/14bbc011-2402-48d8-a796-f9c5c7e7579e
  56. [NT DDK] ZwCreateFile()によるファイルのオープン方法
    http://support.microsoft.com/kb/891805/ja
  57. サンプル
    C:\WinDDK\7600.16385.1\src\general\ioctl\kmdf\sys\nonpnp.c
  58. ドライバからのファイルアクセス
    http://blog.livedoor.jp/blackcat_1973/archives/20955624.html
  59. PsCreateThread svn/ trunk/ kernel/ inc/ ddk/ ps.h
    http://code.google.com/p/gr8os/source/browse/trunk/kernel/inc/ddk/ps.h?spec=svn49&r=49
  60. http://blog.livedoor.jp/blackcat_1973/archives/2005-05.html?p=2
  61. ファイル ハンドルの取得
    1. http://support.microsoft.com/kb/891805/ja
    2. http://d.hatena.ne.jp/i53/20101202/1291284611
  62. Nt vs. Zw
  63. zwcreatefile asynchronous
    http://social.msdn.microsoft.com/Forums/en-US/wdk/thread/26b7e937-fcbc-4fb5-b473-ce4d815c7025/
  64. ZwCreateFile for Asynchronous handle
    1. http://www.mofeel.net/31-microsoft-public-development-device-drivers/22331.aspx
    2. http://www.techtalkz.com/microsoft-device-drivers/262761-zwwritefile-buffer-reuse.html
    3. http://social.msdn.microsoft.com/Forums/en-US/wdk/thread/0b5cd10a-5011-4bc4-acea-5bc0ed3b9a3d
  65. PsCreateSystemThread
    http://www.hackchina.com/en/r/149028/log.c__html
  66. カーネルスレッド
    http://blog.livedoor.jp/blackcat_1973/archives/22269616.html
  67. FltCreateFile
    http://www.osronline.com/showThread.CFM?link=214635
  68. ZwCreateFile
    http://support.microsoft.com/kb/891805
  69. ZwCreateFile
    http://www.codeguru.com/forum/showthread.php?t=512314
  70. RtlStringCbPrintfA
    http://www.osronline.com/DDKx/kmarch/safestrings_7zua.htm
  71. FltRegisterFilter
  72. FltBuildDefaultSecurityDescriptor
  73. FltCreateCommunicationPort
  74. FltFreeSecurityDescriptor
  75. FltStartFiltering
  76. “FltRegisterFilter Teardown FilterDetach”
    http://win32.blog80.fc2.com/blog-category-1.html
     

Filed Under: Windows Driver Kit

Tags:

About the Author

野呂清二(ご連絡はこちらまで (http://www.exceedone.co.jp/inquiry/)

Leave a Reply




If you want a picture to show with your comment, go get a Gravatar.