Skip to content

Latest commit

 

History

History
102 lines (66 loc) · 3.47 KB

2022-04-07.md

File metadata and controls

102 lines (66 loc) · 3.47 KB

2022-04-07

逆汗のときに「Flow analysis was incomplete, some code may be missing」とメッセージが出たら、アドレスを手動で探る必要があるので注意する。

Flow analysis...とは出たのですが ぎゃくあせんぶるのけっかはせいじょうにでているようにみえます でもretがないことから考えると全部は出てない...?

ImmDestroyContext関数を呼ぶhello12.exeを使ってみては? ブレークポイント設定して止まれば全部吐くよ。

00-asm-parse-05.py:少し賢くなりました。関数呼び出しが読みやすく。

https://git.reactos.org/?p=reactos.git;a=summary このページの右上で「grep」を選んで文字列を入力してEnterキーを押すとreactosを丸ごとgrepできます。早いよ。

step実行を軽くしたら消えました お騒がせしました

こんにちは

ImmDestroyContext 解析の続き

IMM32!ImmDestroyContextの汗に00-asm-parse-05.pyを施して下さい。

改良に改良を重ねたので、読みやすくなったと思います。 IMM32!gpsiの型はPSERVERINFOです。これをさっきのページでgrepします。

win32ss/include/ntuser.hにあることがわかります。クリックすると 構造体の最初のメンバーがDWORD dwSRVIFlagsです。 ここでbyte ptr [eax]というのはどういう意味でしょうか。

eaxの値をアドレスとして1バイト取ってくる というものです

そうです。だからdwSRVIFlagsの最初のバイトを取ってくるわけです。 x86はリトルエンディアンだからDWORDの最初のバイトは最下位のバイトです。

でそのフラグの特定の値を調べて フラグ次第では処理をしないわけですね

単純化すると:

def IMM32!ImmDestroyContext(ARGV[1])
{
    if (gpsi == NULL || !(gpsi->dwSRVIFlags & 4))
        return 0;

    esi = win32k!NtUserQueryInputContext(ARGV[1], 1);
    eax = kernel32!GetCurrentThreadId();
    if (esi != eax)
        return 0;

    eax = user32!GetKeyboardLayout(0);
    eax = IMM32!DestroyInputContext(ARGV[1], eax, 0);
    return eax;
}

では答え合わせをしましょう。ImmDestroyContextをdll/win32/imm32でgrepして

お、正しそうですね 一部マクロがありますが

間違いはありませんか?

はい

IMM32!DestroyInputContextの解析

次はIMM32!DestroyInputContextですね。同様に汗を処理して下さい。 あらかじめヒントを言いますが、WinのHMValidateHandle関数はReactOSのUserGetObjectに相当します。

pData = HMValidateHandle(hMem, TYPE_...);
--> pData = (...)UserGetObject(gHandleTable, hMem, TYPE_...);

IMM32!PtiCurrent()はPTHREADINFO型のスレッド情報を返す関数です。ReactOSではGetW32ThreadInfo()に相当します。

IMM32!ImmLockImeDpiはPIMEDPI型を返します。

dword ptr fs:[0x18]は、PTEB型を返すNtCurrentTeb()関数の呼び出しと同じであると考えて下さい。

構造体のオフセットからメンバーを調べるには

_Static_assert(offsetof(TEB, Win32ClientInfo[5]) > 0x6E0, "");
_Static_assert(offsetof(TEB, Win32ClientInfo[5]) < 0x6E0, "");

のようなコードをdll/win32/imm32/imm.cに追加して再ビルドして確かめるといいでしょう。

【課題】IMM32!DestroyInputContextを翻訳しなさい。

わかりました

今日はここまで。

ありがとうございました


戻る | 次へ