こんにちは お待たせしました
ちは 前回の課題、ややこしかったかな?
ちょっと難しくて苦戦中です
いくつかヒントをあげよう。 まず、参照されていないラベルは削除可能。当たり前だね。
連続したコードについて
if (eax == 0) goto label3;
...CODE...
label3:
は
if (eax != 0) {
...CODE...
}
label3:
に置き換え可能。
if条件を否定して後続ブロックへのif-gotoをifブロックに書き換えられるということだ。
label4:
...CODE...
if (esi != 0) goto label4;
は
do {
label4:
...CODE...
} while (esi != 0);
に置き換え可能。
これは先行ブロックへのif-gotoがdo-whileループになるということだ。
IMM32!DestroyInputContext に 00-asm-parse-06.py を施して
label13はスタック演算を無視するとreturn eaxと書ける。 だから、goto label13;はreturn eax;に置き換え可能。 置き換えた後は、label12とlabel13を連結してlabel13:は削除可能。
label12はreturn 0;となる。label27はreturn 1;となる。 label28はreturn win32k!NtUserDestroyInputContext(edi);となる。
同様にgoto label27を単純化。
label26にjeがあるが、これはZeroFlagに依存する。よって label5のcmpとlabel25のcmpの二通りを考慮しないといけない。
label2のHMValidateHandleで得られるのはPIMC型だ。これは入力コンテキストオブジェクトの実体を指している。 label4:のesi+0x18はオブジェクトのオフセット0x18を参照。 それはIMC.dwClientImcDataだ。
まあ、こういうふうに解釈していって最終的に得られるのは
(逆工学のため、掲載不可)
CtfImmTIMDestroyInputContext関数は、Cicero(現代的なIMEフレームワーク)の一部でややこしいので今は実装しない。
DestroyImeModeSaverは次のようになる:
(逆工学のため、掲載不可)
残るは
- HMValidateHandle
- ImmDestroyIMCC
- ImmLockIMC
- ImmLockImeDpi
- ImmUnlockClientImc
- ImmUnlockIMC
- ImmUnlockImeDpi
- NtUserDestroyInputContext
- PtiCurrent
となる。
この解読結果をもとに、昨日の夜、Imm32DestroyInputContextを修正した。 https://github.com/reactos/reactos/commit/4342b84c9a310006bf521c74a4e65f6020083cbd
【課題】
- ImmDestroyIMCC
- ImmLockIMC
- ImmLockImeDpi
- ImmUnlockClientImc
- ImmUnlockIMC
- ImmUnlockImeDpi
の逆汗を取得せよ。
今日はここまで。
ありがとうございました