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
  push [esi+04h]
  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 のパッチ当てるつもりだったので、混ぜてみる予定です

おすすめ

コメントを残す

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