ひさしぶりです。
【豆知識】 WinXP/2k3をインストールしたVirtualBoxでF8を押しながら起動すると、 セーフモードにできる。セーフモードで「rundll32.exe syssetup,SetupOobeBnk」を実行すると アクティベーションを延長できる。
さて、検体user32を開いて。
WND構造体が必要なので、win32ss/include/ntuser.h を参考に、いくつか構造体を定義。
まず、HEAD構造体を定義。
typedef struct _HEAD
{
HANDLE h;
DWORD cLockObj;
} HEAD, *PHEAD;
THROBJHEAD構造体を定義。
typedef struct _THROBJHEAD
{
HEAD;
struct _THREADINFO *pti;
} THROBJHEAD, *PTHROBJHEAD;
THRDESKHEAD構造体を定義。
typedef struct _THRDESKHEAD
{
THROBJHEAD;
struct _DESKTOP *rpdesk;
PVOID pSelf;
} THRDESKHEAD, *PTHRDESKHEAD;
struct _THREADINFO *とstruct _DESKTOP *の型情報は現在、必要ないのでPVOIDとする。
THRDESKHEAD構造体のサイズはどうなっていますか? 20バイトなら正解。C_ASSERT(sizeof(THRDESKHEAD) == 20);
WND構造体を定義。
typedef struct _WND
{
THRDESKHEAD head;
DWORD state;
DWORD state2;
DWORD ExStyle;
DWORD style;
HINSTANCE hModule;
DWORD fnid;
// 以下のメンバーは現在必要ないので省略。
//...
} WND, *PWND;
user32プロジェクトを保存。
sdk/include/psdk/winternl.hを参考に、 UNICODE_STRING構造体とOBJECT_ATTRIBUTES構造体を定義する。
typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
typedef struct _OBJECT_ATTRIBUTES
{
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
検体win32kを開き、同様にWND構造体、UNICODE_STRING構造体、OBJECT_ATTRIBUTES構造体を定義し、保存する。
進捗を確認しよう。
キーボードレイアウトのユーザ関数は分かっているだけでこれだけある:
- USER32!GetKeyboardDllName
- USER32!ActivateKeyboardLayout
- USER32!GetKeyboardLayout
- USER32!GetKeyboardLayoutList
- USER32!GetKeyboardLayoutName
- USER32!GetKeyboardType
- USER32!LoadKeyboardLayout
- USER32!UnloadKeyboardLayout
- USER32!OpenKeyboardLayoutFile
- USER32!OpenKeyboardLayoutFileWorker
- USER32!LoadKeyboardLayoutA
- USER32!LoadKeyboardLayoutW
- USER32!LoadKeyboardLayoutWorker
キーボードレイアウトのカーネル側の関数は以下の通り:
- win32k!NtUserActivateKeyboardLayout
- win32k!NtUserCallOneParam
- win32k!NtUserGetKeyboardLayoutList
- win32k!NtUserGetKeyboardLayoutName
- win32k!NtUserGetKeyboardState
- win32k!NtUserLoadKeyboardLayoutEx
- win32k!NtUserSetKeyboardState
- win32k!NtUserUnloadKeyboardLayout
戦略として、今はユーザ側の関数を実装するよりも、土台のカーネル側の関数の実装を優先した方がいいでしょう。 課題は、win32k!NtUserUnloadKeyboardLayoutの解析です。
今日はここまで。