みなさん、こんにちは。ネットエージェント株式会社、研究開発部の長谷川です。
「ネットエージェントのブログに書いてあることは難しいことばかりだ」という声を頂きましたので、今回はWindowsにおけるUSBメモリの調査方法に関して、レジストリに関する基礎的なトピックスを取り上げることにします。
-----
■USBメモリの初回使用日の把握
みなさんご存知のように、WindowsはユーザーがUSBデバイスをマシンに初めて挿入したときに、対応するデバイスドライバのインストールを自動的に行ってくれるのですが、実はこのとき、Windowsはインストールされたデバイスドライバの情報を日付や時刻とともにログファイルに記録します。よって、このログファイルを調べることで、そのマシン上で初めてデバイスを使用した日時をあとから追跡することができます。
一般的なUSBメモリのデバイスドライバがインストールされたときのログファイルの場所は、Windows XP と Windows Vista および Windows 7 とでそれぞれ異なり、XP では %SystemRoot%\setupapi.log に、Vista および 7 では %SystemRoot%\Inf\setupapi.dev.log になります(%SystemRoot%は一般的なPCでは C:\Windows を指しています)。
以下は、手元の Vista マシンでの setupapi.dev.log の一部です。
>>> [Device Install (Hardware initiated) -
USBSTOR\Disk&Ven_IO_DATA&Prod_USB_Flash_Disk&
Rev_4.50\06C0834150310167&0]
>>> Section start 2008/01/08 13:23:21.448
ump: Creating Install Process: DrvInst.exe 13:23:21.448
(中略)
dvi: Created Driver Node:
dvi: HardwareID - GenDisk
dvi: InfName - C:\Windows\System32\DriverStore\
FileRepository\disk.inf_e0b0b355\
disk.inf
dvi: DevDesc - ディスク ドライブ
dvi: DrvDesc - ディスク ドライブ
dvi: Provider - Microsoft
dvi: Mfg - (標準ディスク ドライブ)
これより、I/Oデータ製のUSBメモリを2008年1月8日にインストールした、すなわちこの日に初めてこのUSBメモリを使用した、ということが見て取れます。
■USBメモリの最終使用日の把握
Windowsでは、USBメモリなどのストレージデバイスがマウントされドライブレターが割り当てられると、レジストリの
HKEY_USERS\<ユーザSID>\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2および
HKEY_USERS\<ユーザSID>\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\CPC\Volume
以下にデバイスごとの接続情報が記録されます。
右図のうち、例えば {4dad2e2a-d14e-11dd-82f9-005056c00008} というキーをさらにレジストリエディタで検索してみると HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices の下に \\?\Volume{4dad2e2a-d14e-11dd-82f9-005056c00008} というバイナリデータが保存されているのを発見できます。
このバイナリデータの中身を見てみると、「Disk&Ven_I-O_DATA&Prod_USB_Flash_Disk&Rev...」というUnicode文字列を見つけることができます。これは、前節で述べたI/Oデータ製のUSBメモリですので、このUSBメモリをマウントしたときの情報が HKEY_USERS\<ユーザSID>\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{4dad2e2a-d14e-11dd-82f9-005056c00008} に記録されているということになります。
さて、あまり知られていないのですが、レジストリはキーごとに最終書き込み日時のタイムスタンプを保持しています。ですので、この HKEY_USERS\<ユーザSID>\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{4dad2e2a-d14e-11dd-82f9-005056c00008} というキーのタイムスタンプを調べれば、このI/Oデータ製USBメモリを最後にマウントした日時も把握できる、ということです。
レジストリのタイムスタンプは、RegEnumKeyEx や RegQueryInfoKey といったAPIを使用すれば取得することができますので、これらのAPIを使った小さなプログラムを作成し、実際にレジストリキーのタイムスタンプを取得してみました。
このように、8月20日の夕方に該当のUSBメモリを使用したということが追跡できます。
また、このレジストリは HKEY_USERS\<ユーザSID> の下に書きこまれますので、特定のUSBメモリの最終使用日時はユーザごとに把握できる、ということになります。
■より簡単に
さて、このようにUSBデバイスを使用した際に利用されるレジストリを把握・調査することにより、(1)USBメモリの初回使用日時、(2)USBメモリの最終使用日時、(3)USBメモリの最終使用者 のような使用履歴がある程度追跡できることがおわかり頂けたと思います。とはいえ、実際にUSBメモリの使用履歴を調査しなければならないような現場では、レジストリエディタでこのような作業を行うことは現実的ではありませんので、様々なツールを使うことになります。
弊社が扱っている「USB関所守」という製品にもこれらの機能が含まれており、リモートレジストリ経由で接続することで、各クライアントPCへのエージェント等のソフトウェアのインストールを行うことなく、管理者は各クライアントPCで使用されたUSBメモリの使用履歴を追跡することができます。
今回は、USBメモリとレジストリの基本的な部分に的を絞ってみましたがいかがだったでしょうか。弊社の技術が皆様のお役に立てることを願っています。