Windowsシステムの下でexeはwin 32 kをロードする.Sysプロセスの詳細
Windowsオペレーティングシステムの初期化
Windowsオペレーティングシステムの再初期化の過程で、カーネルが完全に初期化され、各コンポーネントも準備すると、ユーザープロセスsmssがロードされる.exe(セッションマネージャ)は、次にNtSetSystemInformationを呼び出し、SystemRegistryAppendStringInformation==38パラメータでwin 32 kをロードする.Sysというモジュールは、win 32 kを呼び出す.SysのDriverEntry入口です。続いてexeはWindowsサブシステムプロセスcsrssを起動する.exe。
win32k.Sys ShadowSSDTテーブルのロード
smss.exeはwin 32 kをロードする.Sysモジュールの後、win 32 k.Sysこのモジュールは、モジュールエントリDriverEntryを実行し、AddSystemServiceTableを実行してシステムにShadowSSDTテーブルを追加します。私たちはsmssでexeはwin 32 kをロードしたばかりです。Sysはntoskrnl.exeから導出KeAddSystemServiceTableはEAThookに与えられ、我々自身のMyKeAddSystemServiceTable()でロードテーブルのベースアドレスがwin 32 kであるか否かを判断する.Sysモジュールのアドレス範囲では、証明が正しいShadowSSDTテーブルでない場合。
win 32 kについてSysが存在するアドレスの有効性の問題
win32k.SysにはShadowSSDTテーブルが含まれており、スレッドでGUI関数を呼び出すと、最後にShadowSSDTテーブルのサービスが呼び出されます。しかし、GUIスレッドだけがwin 32 kを使うわけではない.Sysはメモリにロードされ、参考教主の投稿はwin 32 kです。Sysモジュールのロードはセッションに関係するので、Systemとsmssでない限り.exe(セッションマネージャは任意の継承に属さない)プロセス他の任意のプロセスはwin 32 kをロードする.sys。
Systemプロセスでwin 32 kを見てみましょう。Sysモジュールのアドレスは、確かに無効であることがわかりました。
カーネルでwin 32 kを変更したい場合はSysモジュール(IAT_hook)は、現在のプロセスコンテキストがSystemおよびsmssにないことを保証する必要がある.exeでは、すなわち、プロセスコンテキストを2つのプロセスを除く任意のプロセスアドレス空間に切り替える必要がある。
< Handles->csrssを取得する.ExceプロセスのPIDIATが必要になったらHOOKwin32k.Sysモジュールの場合、アドレス空間をcsrssに切り替えることができる.exeプロセスアドレス空間では、その前にcsrssを取得する必要があります。exeプロセスのPIDは、その後、そのPIDによって対応するEPROCESSが得られ、その後、対応するプロセスアドレス空間に切り替わる。csrssを得る.exeの方法は、システム内のすべてのハンドルを列挙し、「WindowsApiPort」というALPC portハンドルを探して対応するプロセスPIDを取得することです(csrss.exeプロセスでは、「WindowsApiPort」というALPC portオブジェクトが作成されます)。
typedef struct _SYSTEM_HANDLE_INFORMATION_EX { ULONG NumberOfHandles; SYSTEM_HANDLE_INFORMATION Information[1]; }SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;
NumberOfHandles; i++)
typedef struct _SYSTEM_HANDLE_INFORMATION { ULONG ProcessId; UCHAR ObjectTypeNumber; UCHAR Flags; USHORT Handle; PVOID Object; ACCESS_MASK GrantedAccess; }SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
{