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 |
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にはない事が判明…事件は振出しに戻ってしまった ・ω・;
Comments