逆汗のときに「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実行を軽くしたら消えました お騒がせしました
こんにちは
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ですね。同様に汗を処理して下さい。 あらかじめヒントを言いますが、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を翻訳しなさい。
わかりました
今日はここまで。
ありがとうございました