さて。今日はいよいよカーネル空間に入ります。
よろしくお願いします
時間を戻して、スナップショットを復元して、管理者権限で「bootcfg /debug ON /PORT COM1 /ID 1」を実行、Ghest Addtionsをインストール。WinDBGでカーネル待ち。再起動。
hello12を起動。BreakPoint()で止まるから、そこでプロセス一覧取得「!process 0 0」。
HELLO12.EXEのプロセスアドレスを指定してプロセスのアタッチ「.process 81d01c20」。
「.reload /user」でユーザモードのシンボルをロード。
「LM」でモジュール一覧。「IMM32」が読み込まれている。
「x IMM32!ImmCreate*」でシンボル確認。
「uf IMM32!ImmCreateContext」で関数を逆汗。
(...逆汗のため、転載不可...)
「call IMM32!ImmLocalAlloc」 と 「call IMM32!NtUserCreateInputContext」 が見える。 よってImmCreateContextはこの二つの関数を呼んでいることがわかる。 ついでに「uf IMM32!ImmLocalAlloc」「uf IMM32!NtUserCreateInputContext」してみる。 (省略)
win32k!NtUserCreateInputContextはカーネル関数だが、IMM32!NtUserCreateInputContextはwin32k!NtUserCreateInputContextを呼び出すためのトランポリンになっている。
ついでに「uf win32k!NtUserCreateInputContext」する。
「IMM32!NtUserCreateInputContext」の中身を見ると「mov eax,1154h」「SharedUserData!SystemCallStub」などが見える。これはシステムコールだ。「1154h」というのは「0x1154」ということで、https://github.com/j00ru/windows-syscalls/tree/master/x86 ここを見ると確かにNtUserCreateInputContextになっている。
ついでに「uf win32k!NtUserDestroyInputContext」「uf win32k!DestroyInputContext」を実行する。
逆汗のコードは転載できないものがあるので注意してほしい。
【課題】IMM32!CreateContext, IMM32!DestroyContext, IMM32!GetContext, win32k!NtUserCreateInputContext, win32k!CreateInputContext, win32k!NtUserDestroyInputContext, win32k!DestroyInputContextの逆汗をufコマンドで取得し、それぞれをファイルに保存して下さい。
今日はここまで。
わかりました ありがとうございました