Skip to content

Latest commit

 

History

History
119 lines (81 loc) · 2.61 KB

2022-04-08.md

File metadata and controls

119 lines (81 loc) · 2.61 KB

2022-04-08

こんにちは お待たせしました

ちは 前回の課題、ややこしかったかな?

ちょっと難しくて苦戦中です

いくつかヒントをあげよう。 まず、参照されていないラベルは削除可能。当たり前だね。

コードの置き換え

連続したコードについて

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

の逆汗を取得せよ。

今日はここまで。

ありがとうございました


戻る | 次へ