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か所で直ってなかったりします。
まぁ、こういうのが、月例のセキュリティパッチで直ってるのですが、初歩的なバグですよね|・ω・)
Comments