まめ知識

MessageBoxのテキストは Ctrl+C でコピーできる

こんな感じ。それにしてもエラーメッセージをテキストコピーできないGUIは勘弁して欲しい。

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: ...K\6001.17051\project\HookDetector\user\Debug\HookDetector.exe
File: c:\winddk\6001.17051\project\hookdetector\user\hookdetector\result_code.h
Line: 61

Expression: 0

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
Abort   Retry   Ignore   
---------------------------

一度ログインするまでリモートデスクトップ接続できない

Terminal Service が「手動」だと一度コンソールログインするまで、ターミナルサービスが起動しない。そのためリモートデスクトップ接続できない。「自動」にしてあげればOK。ちなみに 2003SP1 だと自分で設定してあげないと「手動」が基本なので引っかかりやすい。

カーネルモジュールのシンボル名取得

やっとできたものの、モノにするまで作りこむ気力がないので方法の概要だけ。

  1. シンボル名を解決したいシステム空間のアドレスを用意
    • たとえば 0x81DBC716
  2. SymLoadModule64でカーネルモジュールのシンボルテーブルをロード
    • たとえば C:\Windows\system32\ntoskrnl.exe
  3. IMAGEHLP_SYMBOL64構造体を用意
  4. 「システム空間のアドレス + SymLoadModule64の戻り値 - ntoskrnl.exeのべースアドレス」の値を計算
    • たとえば「0x81DBC716 + 0x00400000 - 0x81C04000」
    • システムモジュールのべースアドレスはEnumDeviceDriversで取得
  5. 計算した値でSymGetSymFromAddr64
  6. (゚Д゚)ウマー
    • たとえば _NtAcceptConnectPort@24(゚Д゚)ウマー

そのうちに、HookDetectorに実装しようかと思ってます。思ってますが、飽きてるのでやらない予感!

05/02 追記

システム空間のアドレス - SymLoadModule64の戻り値 - ntoskrnl.exeのべースアドレス
って書いてました。間違いなので修正しました。

Featherweight Virtual Machine (FVM)

OSレベルの仮想化ソフトウェア「FVM 1.0」が公開という記事を読み、とりあえずDL*1。詳細はFeather-weight Virtual Machineに。じっくり読みたい。

ドキュメントを眺めてみるとSSDTフックをしているらしいので FvmDrv - hooksys.c - FVM_HookServices を眺めてみると激しい激しい。

_asm cli

// Turn off the page write protection
__asm {
	push eax
	mov eax, cr0
	and eax, not 10000h
	mov cr0, eax
	pop eax
}
/*
	ここから怒涛のAPIフック
*/
__asm {
	 push eax
	 mov eax, cr0
	 or eax, 10000h
	 mov cr0, eax
	 pop eax
}
_asm sti

その数44API(たぶん)。ちなみに前後のアセンブラ以前に紹介したCR0 Trickですね。最初にEAXレジスタをpushしているので元の値が破壊されないですね。なる。

環境はVC9だったがUI以外は問題なくビルドできた。しかしUIにはMFCが使われているため、Expressではビルドできない。そこで VC8 Standard で小一時間ほど頑張ってみたが、実行時エラー "Failed to create empty document." を解消できない。どうもMDI子ウィンドウの生成時に使用されるウィンドウクラスの名前が正しくないらしいが、正直MFCの中のことなのでわからんです。英語版のDLLが必要とかそういう話なのかな?

Detectしてみた

SDTが真っ赤っか!

それにしてもGUIないと使い方がよくわからん。

隠すのではなく捏造する

そうすれば確かに仮想環境になるわけだ。FVMはRootkitとは正反対のアプローチといえる。
ところで会社で何人かに話題をふってみたが皆さんあまり関心をお持ちで無いようでした。。。。

*1:Vistaには対応してない