CF-J10 への NT5.x のインストールについて解析 その2

CF-J10 への NT5.x のインストールについて解析 その1

続きです。

IoSetPartitionInformation
IoWritePartitionTable について

SP2GDR(5.1.2600.2670)
SP2QFE(5.1.2600.2622)
の場合

 L0053B31A:
          push    62747346h
          push    00001000h
          push    00000004h
          mov    [ebp-1Ch],esi
          mov    [ebp-28h],esi
          mov    [ebp-24h],esi
          mov    byte ptr [ebp-02h],01h
          mov    [ebp-10h],esi
          call    ExAllocatePoolWithTag
          cmp    eax,esi
          mov    [ebp-14h],eax
          jnz    L0053B34C
          mov    eax,C000009Ah
          jmp    L0053B524

SP2QFE(5.1.2600.2670)

           mov    eax,00001000h
        cmp    [ebp-08h],eax

          mov    [ebp-1Ch],esi
          mov    [ebp-28h],esi
          mov    [ebp-24h],esi
          mov    byte ptr [ebp-02h],01h
          mov    [ebp-10h],esi
          jc     L0053B3C3
          mov    eax,[ebp-08h]
 L0053B3C3:

          push    62747346h
          push    eax
          push    00000004h
          call    ExAllocatePoolWithTag
          cmp    eax,esi
          mov    [ebp-14h],eax
          jnz    L0053B3E1
          mov    eax,C000009Ah
          jmp    L0053B5B9

大きな違いはここ、2つの関数はほぼ同じなんですが、[ebp-08h]は直前で edx が代入されていることから、__msfastcallの第二パラメータ 、『SectorSize』であることが分かります。セクタサイズが 1000h(4096バイト)を超える場合、次に呼び出す、ExAllocatePoolWithTag のバッファサイズが 1000h固定だとオーバーしてしまいますね。これはまずい ・ω・;

IoReadPartitionTable についても基本的に同じです。

ところが、Windows 2000にはこの関数ないんです ・ω・;
HAL DLLの中にあるこの関数を経由して、再び ntoskrnlに制御が戻るというややこしいことをしています。

で、Windows 2000の MS10-021 を確認してみたのですが、この修正は既に実装済みでした。

次は、 呼び出し場所が変わっているという例

SP2QFE(5.1.2600.2622)

 L005D0E1E:
          mov    esi,[ebp+08h]
          push    esi
          call    SUB_L005D4B4C

          push    0000000Ah
          push    SSZ005D0E74_ramdisk_0_
          push    [esi+34h]
          call    SUB_L004398ED
          add    esp,0000000Ch
          test    eax,eax
          jz     L005E22DE
 L005D0E41:
          cmp    byte ptr [ebp-01h],00h
          jnz    L005E22F3

          push    esi
          call    SUB_L005CBB57
          test    al,al
          jz     L005E2313
          cmp    [L004815FC],edi
          mov    byte ptr [L00481416],01h
          mov    [ebp-10h],edi
          jbe    L005CC08C
          xor    eax,eax
          jmp    L005D0EA2

SP2QFE(5.1.2600.2670)

 L005D381A:
          mov    esi,[ebp+08h]
        
        
          push    0000000Ah
          push    SSZ005D3842_ramdisk_0_
          push    [esi+34h]
          call    SUB_L004398ED
          add    esp,0000000Ch
          test    eax,eax
          jz     L005E231E
 L005D3837:
          cmp    byte ptr [ebp-01h],00h
          jnz    L005E2333

          push    esi
          call    SUB_L005D4C64        

 L005D0DB0:
          push    esi
          call    SUB_L005D0C45
          test    al,al
          jz     L005E2353
          cmp    [L004815FC],edi
          mov    byte ptr [L00481416],01h
          mov    [ebp-10h],edi
          jbe    L005CBF1C
          xor    eax,eax
          jmp    L005D0DF6

黄色はWindows 2000に不要な処理です。

一方 Windows 2000

 L005545E0:
          push    [ebp+08h]
          call    SUB_L0055337E

          push    [ebp+08h]
          call    SUB_L00554C52
          test    al,al
          jnz    L005545FB
 L005545F4:
          xor    al,al
          jmp    L005546CD
 L005545FB:
          xor    eax,eax
          mov    byte ptr [L0047EFD8],01h
          cmp    [L0047F5E4],eax
          mov    [ebp-0Ch],eax
          jbe    L005546C0

分かりにくいですがWindows 2000はこの不具合の影響を受けないことが分かりました。

つまり、この差分についての影響は Windows 2000にはない事が判明…事件は振出しに戻ってしまった ・ω・;

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です