Skip to content

Latest commit

 

History

History
129 lines (101 loc) · 3.17 KB

2022-07-23.md

File metadata and controls

129 lines (101 loc) · 3.17 KB

2022-07-23

ひさしぶりです。

【豆知識】 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の解析です。

今日はここまで。


戻る | 次へ