Windows 2000 の EXPLORER.EXE のバグ
SUB_L004094E1:
push ecx
push ebx
push ebp
push esi
push edi
push 0000002Ch
push 00000040h
mov dword ptr [esp+18h],00000001h
call [KERNEL32.DLL!LocalAlloc]
mov esi,eax
xor ebx,ebx
cmp esi,ebx
jz L0040EE64
push [L0041B2C8]
mov edi,[esp+1Ch]
push 0000012Fh
push edi
call SUB_L00409633
mov ebp,eax
push esi
cmp ebp,ebx
jz L0040EE5E
push ebx
push edi
call [USER32.DLL!SetWindowLongW]
or dword ptr [esi+14h],FFFFFFFFh
push ebx
mov [esi],edi
mov [esi+08h],ebp
push [L0041B2C8]
push ebx
push edi
push ebx
push ebx
push ebx
push ebx
push 56000B4Ch
push ebx
push SWC0040BBDC_ToolbarWindow32
push 00000080h
call [USER32.DLL!CreateWindowExW]
mov edi,[USER32.DLL!SendMessageW]
push ebx
push 00000014h
push 0000041Eh
push eax
mov [esi+04h],eax
call edi
push ebx
push ebx
push 00000423h
push [esi+04h]
call edi
push 00000001h
push 00000001h
push FFFFFFF0h
push eax
call [SHLWAPI.DLL!SHLWAPI.165]
push 00020002h
push ebx
push 00000457h
push [esi+04h]
call edi
push ebx
push ebx
push 0000043Ch
push [esi+04h]
call edi
push ebx
push 00000005h
push 00002007h
call edi
push 00000020h
push 00000020h
push 00000454h
push [esi+04h]
call edi
cmp [L0041B328],ebx
jz L004095D4
push [esi+04h]
call SUB_L00406615
test eax,eax
jnz L0040EE6C
L004095D4:
push 00000001h
push ebx
push [esp+18h]
push 00000032h
call SUB_L00403DB4
push eax
push 00000031h
call SUB_L00403DB4
push eax
call [COMCTL32.DLL!ImageList_Create]
cmp eax,ebx
mov [esi+0Ch],eax
jz L0040EE64
push eax
push ebx
push 00000430h
push [esi+04h]
call edi
push 0000000Fh
call [USER32.DLL!GetSysColor]
push eax
push [esi+0Ch]
call [COMCTL32.DLL!ImageList_SetBkColor]
push esi
push ebx
push L0040398A
push [esi+04h]
call jmp_COMCTL32.DLL!COMCTL32.410
xor eax,eax
L0040962B:
pop edi
pop esi
pop ebp
pop ebx
pop ecx
retn 0004h
|
これ、Windows 2000 SP4 の システムトレイの呼び出し部分のプロシージャーコールである。
Shell_TrayWnd:TrayNotifyWnd が呼ばれると飛んでくるのだが、とんでもないことに気づいた
赤字の部分なのだが、ECXのスタックレジスター領域を破壊して 1 を入れる処理になってる。
つまり、プロシージャーコールで TrayNotifyWnd が呼ばれるたびにECXが破壊されて1になるのだ。
ちなみに、システムトレイのカラー化パッチを当てるとここが1以外の値になるためさらに不安定になる可能性がある( ˘ω˘)
(((((・ω・)))) 何これ怖い。もしかして、 user32.dll で 原因不明のECXレジスタの破壊が起こってたのはこれのせいかしら?
次の拡張カーネルに EXPLORER.EXE のパッチ当てるつもりだったので、混ぜてみる予定です
Comments