firefox をVista互換モードで起動するとクラッシュする理由

FirefoxをVista互換モードで動かすとクラッシュする理由を調べてみた

sandboxbroker.dll

          call    [KERNEL32.dll!GetNativeSystemInfo]
          mov    ecx,[esp+14h]
          movzx    eax,cx
          push    00000009h
          pop    edx
          test    eax,eax
          jz     L10006595
          cmp    eax,00000006h
          jz     L1000658C
          cmp    eax,edx
          jnz    L10006599
          mov    dword ptr [esi+1Ch],00000001h
          jmp    L10006599
 L1000658C:
          mov    dword ptr [esi+1Ch],00000002h
          jmp    L10006599
 L10006595:
          and    dword ptr [esi+1Ch],00000000h
 L10006599:
          cmp    dword ptr [esp+3Ch],00000006h // NT 6.x
          mov    eax,[esp+28h]
          mov    [esi+20h],eax
          mov    eax,[esp+30h]
          mov    [esi+24h],eax
          jnz    L10006640
          push    SSZ1002BB7C_GetProductInfo
          push    SWC1002BB00_kernel32_dll
          call    [KERNEL32.dll!GetModuleHandleW]
          push    eax
          call    [KERNEL32.dll!GetProcAddress]
          lea    ecx,[esp+0Ch]
          push    ecx
          push    00000000h
          push    00000000h
          push    [esp+4Ch]
          push    [esp+4Ch]
          call    eax                                // GetProductInfo 強制コール
          mov    eax,[esp+0Ch]
          cmp    eax,0000000Fh
          ja     L1000661A
          cmp    eax,0000000Ch
          jnc    L10006637  //PRODUCT_STANDARD_SERVER_CORE (d)
                                       //
PRODUCT_ENTERPRISE_SERVER_CORE(e)
                                       //
PRODUCT_ENTERPRISE_SERVER_IA64(f)
          cmp    eax,00000001h
          jz     L1000662E // PRODUCT_ULTIMATE(1)
          cmp    eax,00000004h
          jz     L1000662E // PRODUCT_ENTERPRISE(4)
          cmp    eax,00000006h
          jz     L1000662E // PRODUCT_BUSINESS(6)
          jbe    L10006600 // PRODUCT_HOME_BASIC_N(5)
                              //
PRODUCT_HOME_BASIC(2)
                              //
PRODUCT_HOME_PREMIUM (3)
          cmp    eax,0000000Ah
          jbe    L10006637 // PRODUCT_ENTERPRISE_SERVER(a)
                                      // PRODUCT_SMALLBUSINESS_SERVER (9)
                                      // PRODUCT_DATACENTER_SERVER(8)
                                      //
PRODUCT_STANDARD_SERVER(7)
 L10006600:                  // PRODUCT_STARTER(b)

          and    dword ptr [esi+10h],00000000h
 L10006604:
          mov    ecx,[esp+0000015Ch]
          mov    eax,esi
          pop    edi
          pop    esi
          xor    ecx,esp
          call    SUB_L10018D6A
          mov    esp,ebp
          pop    ebp
          retn
;------------------------------------------------------------------------------
 L1000661A:
          cmp    eax,00000011h
          jc     L10006600 // PRODUCT_BUSINESS_N(10)
          cmp    eax,00000012h
          jbe    L10006637 //PRODUCT_CLUSTER_SERVER(12)
      &
nbsp;                               // PRODUCT_WEB_SERVER(11)
          cmp    eax,00000019h
          jz     L10006637 // PRODUCT_SMALLBUSINESS_SERVER_PREMIUM(19)
          cmp    eax,00000030h
          jnz    L10006600
// PRODUCT_PROFESSIONAL
 L1000662E:
          mov    dword ptr [esi+10h],00000001h
          jmp    L10006604

GetProductInfo function (Windows)

Vista専用の関数が遅延ロードなのに、NULLチェックされずにコールされてる
この処理回避すると動くようになった・ω・ 実装すべきかね?

おすすめ

2件のフィードバック

  1. 名無しのプログラマー より:

    また再発するんじゃねーの
    msgbox(“GetProductInfo() unimplemented”); __debugbreak();

  2. 名無しのプログラマー より:

    ttp://hg.mozilla.org/releases/mozilla-release/file/tip/security/sandbox/chromium/base/win/windows_version.cc
    そういわれてみたら、cmp dword ptr [esp+3Ch],6 してるんすね
    そうかーそしたら最小実装かのう

コメントを残す

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