2000~Vista にある User32.dll のバッファ未チェックのバグ

iTunes を Windows 2000 で動かすと、たまにクラッシュするので、おかしいと思ったら、 user32.dll のマルチプロセッサ処理とマルチスレッドの処理でヌルポインタの処理が抜けているバグがあったので、それを修正するために、KDWのuser32.dllには書き換え用コードが埋め込んであります。

          call    SUB_L77DF3C75
          jmp    L77DF6A14
 L77DF6A01:
          cmp    ecx,[L77E33948]
          ja     L77DF6A0D
          mov    eax,ecx   
          jmp    L77DF6A14
 L77DF6A14:
          mov    [esi],eax
;
          mov    eax,[esi]
          cmp    dword ptr [eax+00000088h],00000000h
          jz     L77DF6BB8
          mov    eax,[eax+00000098h]
          mov    [esi+74h],eax
 L77DF6BB8:

Windows 2000(Code1) これは、実はVistaでも直ってなかったりします。

 L77DF6C23:
          mov    eax,[esi+4Ch]
          and    eax,00000003h
          cmp    eax,00000001h
          jnz    L77DF6C76
          mov    eax,[ebx]
          mov    ecx,[edi+74h]
          mov    [ebp-08h],eax
          mov    eax,[esi]
          cmp    eax,edx

          mov    dword ptr [ebp-18h],00000002h
          mov    [ebp-14h],ecx
          mov    [ebp-0Ch],edx
          mov    [ebp-04h],edx
          jnz    L77DF6C50
          xor    eax,eax
          jmp    L77DF6C52

しかも、後続の処理では SUB_L77DF3C75 の返り値がゼロの時の処理をしてるので謎です(0だった場合、ここに来る前に、赤字の箇所でクラッシュする)

 L77DE8F00:
          mov    esi,[ebp+0Ch]
          cmp    [esi+000000ACh],ebx
          jz     L77DE905E
          mov    ecx,[esi+50h]
          call    SUB_L77DE4301
          test    byte ptr [eax+20h],02h
          jz     L77DE905E

Windows2000(Code2)

 L77D8BFCA:
          cmp    dword ptr [esi+000000B4h],00000000h
          jz     L77D8BFFB
          mov    ecx,[esi+58h]
          call    SUB_L77D6F890
          test    byte ptr [eax+20h],02h
          jz     L77D8BFFB

Vista(Code2)

 SUB_L77E004A4:
          push    ebp
          mov    ebp,esp
          push    ecx
          mov    ecx,[ebp+08h]
          push    ebx
          push    esi
          push    edi
          call    SUB_L77DE4301
          mov    ebx,eax
          mov    eax,[ebx+30h]
          cmp    eax,[L77E33948]
          ja     L77E004C4
          mov    edi,eax
          jmp    L77E004CB

Windows2000(Code3)

 SUB_L77D7BF4B:
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          push    ecx
          mov    ecx,[ebp+08h]
          push    ebx
          call    SUB_L77D6F890
          mov    ebx,eax
          xor    eax,eax
          cmp    ebx,eax
          jz     L77D7BFD5

Vista(Code3)

 L77E05D71:
          mov    ecx,[ebx+50h]
          test    ecx,ecx
          jz     L77E05D89
          call    SUB_L77DE4301
          test    byte ptr [eax+19h],02h
          jnz    L77E05D89
          and    dword ptr [ebp-58h],00000000h
          jmp    L77E05D8F

Windows2000(Code4)

 L77DA0157://Vista
        &
nbsp; mov    ecx,[ebx+58h]
          call    SUB_L77D6F890
          test    eax,eax
          jz     L77DA0109
          cmp    dword ptr [ebx+58h],00000000h
          jz     L77DA0175
          test    byte ptr [eax+19h],02h

Vista(Code4)

 L77E05DAE:
          mov    ecx,[ebx+38h]
          call    SUB_L77DE4301
          mov    ecx,eax
          mov    eax,[ebp+14h]
          mov    edx,eax
          shr    edx,08h
          movzx    edx,dl
          test    [ecx+edx+14h],al

Windows2000(Code5)

L77DA019D:
          mov    ecx,[ebx+38h]
          call    SUB_L77D6F890
          test    eax,eax
          jz     L77DA0109
          mov    ecx,[ebp+14h]
          mov    edx,ecx
          shr    edx,08h
          movzx    edx,dl
          test    [edx+eax+14h],cl

Vista(Code5)

 L77E15375:
          test    esi,esi
          jz     L77E153AB
          mov    ecx,esi
          call    SUB_L77DE4301
          test    byte ptr [eax+19h],02h
          jz     L77E1539C
          test    byte ptr [eax+23h],40h
          jz     L77E1539C
          test    byte ptr [eax+14h],08h
          jnz    L77E153A0
          push    esi
          call    GetParent

Windows2000(Code6)

 L77D9D56F://Vista
          test    byte ptr [eax+19h],02h
          jz     L77D9D58B
          test    byte ptr [eax+23h],40h
          jz     L77D9D58B
          test    byte ptr [eax+14h],08h
          jnz    L77D9D592
          push    eax
          call    SUB_L77D69211
 L77D9D587:
          test    eax,eax
          jnz    L77D9D56F

Vista(Code6)

L77E1C049://2000
          push    ebp
          mov    ebp,esp
          mov    ecx,[ebp+08h]
          call    SUB_L77DE4301
          mov    ecx,[eax+00000098h]
          mov    eax,fs:[00000018h]
          mov    eax,[eax+30h]
          cmp    dword ptr [eax+000001D4h],00000000h
          jz     L77E1C072
          test    byte ptr [ecx+4Dh],10h
          jnz    L77E1C084

Windows2000(Code7)

 L77DA758A://vista
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          mov    ecx,[ebp+08h]
          call    SUB_L77D6F890
          test    eax,eax
          jz     L77DA75E6
          mov    ecx,fs:[00000018h]
          mov    ecx,[ecx+30h]
          cmp    dword ptr [ecx+000001D4h],00000000h
          mov    eax,[eax+000000B0h]
          jz     L77DA75D4
          mov    ecx,fs:[00000018h]
          mov    ecx,[ecx+30h]
          mov    edx,[7FFE02D8h]
          cmp    [ecx+000001D4h],edx
          jz     L77DA75D4
          test    word ptr [eax+4Ch],1000h

Vista(Code7)

ちなみに、Code1 に関するバッファーチェックは 2000 で4か所にあるんですが、Vistaに関しても3か所で直ってなかったりします。

まぁ、こういうのが、月例のセキュリティパッチで直ってるのですが、初歩的なバグですよね|・ω・)

おすすめ

コメントを残す

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