第 6 章 新しい Windows への適応性に関する検討 67
6.5 機能評価
ル個別の処理や引数に与えられるデータ構造ごとにWindows 10 x64向けの実装が必 要となる.
6.4.5 WOW64 システムコールのトレース
6.3.4項で述べた2つのケースは,ともに syscall命令でシステムコールを発行する.
そのため,WOW64システムコールのフックは,通常のシステムコールと同様に行え る.また,システムコールの発行元プロセスがWOW64プロセスであることは,プロ セスオブジェクトを確認することで判定できる.これにより,WOW64システムコー ルと通常のシステムコールを区別できる.
前述のケースのうち,ケース(1)のものは,通常のシステムコールと同様に情報の 取得が可能である.一方,ケース(2)では,Win64側のスタブを経由しないため,シ ステムコール番号の上位16ビットが設定されたままシステムコールに至る.そこで,
Alkanet10 でも取得したシステムコール番号の上位16ビットはWOW64で行われた
エミュレーション方法の特定に利用し,下位16ビットを本来のシステムコール番号と して取り扱う.
また,sysret命令の戻り先である CpupSyscallStub は,各システムコール用に用 意されたスタブではないため,スタブを参照する方法ではシステムコール番号を得 ることができない.そこで,スタックに積まれているWOW64への戻りアドレスを
取得し,WOW64側のスタブから番号を取得する.ただし,エミュレーションの過程
で複数回システムコールが呼ばれる場合もあるため,スレッドオブジェクトが持つ
SystemCallNumber を優先して用いる.なお,引数は,エミュレーション関数によっ
て通常のシステムコールと同様にカーネルに受け渡される.したがって,通常のシス テムコールと同様に取得が可能である.
6.5. 機能評価 77 て読み込ませる挙動が観測された.本評価では, Alkanet10で当該検体を実行し,で 上記の挙動が観測できることを確認する.これにより,Windows 10 x64環境を対象 としたシステムコールトレーサが実現できていることを確認する.なお,当該検体は,
32ビットアプリケーションであるため,WOW64上で動作する.
6.5.2 ログエントリ
図6.6は,前述の検体を malware.exe という名前で実行し,プロトタイプにより取 得したログの一部である.ログの最初に記載されている番号は記録されたログの通し 番号である.[ENTER],[EXIT] は,それぞれ syscallフック時のログ,sysretフック時 のログであることを示す.(fcc.f24) malware.exeは,プロセスID,スレッドID, プロセス名を示す.
その後には,システムコールの名前と番号が続く.図6.6 中では,NtCreateFile, NtWriteFile, NtCreateUserProcess の3つのシステムコールについて示している.
NtCraeteFile,NtWriteFile システムコールは,ファイルの作成と書込みを行うシステ ムコールである.NtCreateUserProcess システムコールは,Windows Vista 以降で追 加されたシステムコールであり,新たにプロセスを生成し,そのプロセスの初期スレッ ドも生成する.
Argsは,取得した引数の値を示す.RetVal は,戻り値を示し,sysretフック時の ログのみに記載される.上記の3つのシステムコールの戻り値は,システムコールの 成否を示すNTSTATUSである.図6.6中のログの戻り値は,全てRetVal=0,すなわ
ち STATUS SUCCESS であり,システムコールが成功したことを示している.なお,
ログの通し番号を除き,ログ中の数値はすべて16進数で表記されている.
本評価で用いたプロトタイプには,NtCreateFile, NtCreateUserProcess システム コールの引数を解析する機能を追加している.NtCreateFile システムコールでは,第 3引数 ObjectAttributes に含まれるObjectNameからファイルのパスを取得し,ログ に追記している.また,第1引数 FileHandle が示す作成されたファイルハンドルを sysret 時のログに追記している.NtCreateUserProcess システムコールでは,第9引 数である ProcessParametersに含まれる ImagePathNameとCommandLine を追記し ている.これらは,実行されるファイルパスとコマンドライン引数を示す.また,第 1引数ProcessHandle および第2引数 ThreadHandle から,それぞれ生成されたプロ セスオブジェクトとスレッドオブジェクトを示すハンドルの値を取得し,sysret時の ログに追記している.
図 6.6 bat ファイルのドロップと cmd.exeの起動のログ [60]
6.5.3 評価結果
図6.6の(1)のログ番号295423と(2)の295429の NtCreateFileシステムコールのロ グより,malware.exeは,Tempフォルダに315421.batを作成し,そのファイルハンド ルとして,0x374 という値を得たことを示している.続く(3)のログ番号295432およ び(4)の295436の NtWriteFile システムコールのログでは,第1引数に0x374 が与え られている.NtWriteFileシステムコールの第1引数は,書き込むファイルを示すファ イルハンドルである.すなわち,当該ログは,malware.exe がTemp フォルダに作成 した315421.batに書込みを行ったことを示している.さらに,(5)のログ番号312002, (6)の312011のログより,malware.exe は, NtCreateUserProcess システムコールを 用いて cmd.exeを起動したことがわかる.また, CommandLine から 315421.batが 引数として与えられていることも確認できる.ProcessHandle や ThreadHandle も取 得できているため,ハンドルを解析してオブジェクトを取得する機能を追加すれば,
生成されたプロセスやスレッドの情報も収集することが可能となる.
以上から,確認項目であったマルウェアの動作をAlkanet10でも確認することがで きた.したがって,本プロトタイプは,Windows 10 x64 のシステムコールトレーサ
6.6. 考察 79