Chrome の上位バージョンで Windows 2000が即時クラッシュする理由を調査

Windows 2000 で Chrome 51 な度の上位バージョンを動作させると起動させる前にクラッシュするので調査してみました。

でも、なぜかデバッガ上で動かすとクラッシュしない…

という訳で、トレース!

 SUB_L00422A80:
          call    SUB_L00426700
          test    al,al
          jnz    L00422A8B
          int3
          retn

これが原因ポイ?

chromium/src/base//logging.h

#if defined(__clang__)
#define IMMEDIATE_CRASH() ({__asm int 3 __asm ud2 __asm push __COUNTER__})
#else
#define IMMEDIATE_CRASH() __debugbreak()
#endif  // __clang__

#if defined(OFFICIAL_BUILD) && defined(NDEBUG)
// Make all CHECK functions discard their log strings to reduce code bloat, and
// improve performance, for official release builds.
//
// This is not calling BreakDebugger since this is called frequently, and
// calling an out-of-line function instead of a noreturn inline macro prevents
// compiler optimizations.
#define CHECK(condition) \
  UNLIKELY(!(condition)) ? IMMEDIATE_CRASH() : EAT_STREAM_PARAMETERS

これっぽい感じ

直前のログ

[0823/102747:FATAL:scoped_handle.cc(184)] Check failed: 0U != (flags
& 0x00000002) (0 vs. 0)

void ActiveVerifier::StartTracking(HANDLE handle, const void* owner,
                                   const void* pc1, const void* pc2) {
  if (!enabled_)
    return;
  // Grab the thread id before the lock.
  DWORD thread_id = GetCurrentThreadId();
  AutoNativeLock lock(*lock_);
  Info handle_info = { owner, pc1, pc2, base::debug::StackTrace(), thread_id };
  std::pair<HANDLE, Info> item(handle, handle_info);
  std::pair<HandleMap::iterator, bool> result = map_.insert(item);
  if (!result.second) {
    Info other = result.first->second;
    base::debug::Alias(&other);
    base::debug::Alias(&creation_stack_);
    CHECK(false);  // Attempt to start tracking already tracked handle.
  }
}

これに近いように見える

Windows 7などで見てみた所、そもそも、こんな処理のスレッドに飛んでこないようだ ・ω・;
という訳で、対策は int3 を nopでつぶすくらいしか対策が無さそう

BoxedApp Packer API Changelog

FIX: a packed application built using atom/electron framework crashes with output: "[384:0112/143143:FATAL:scoped_handle.cc(184)] Check failed: 0U != (flags & 0x00000002) (0 vs. 0)"

ググったらこんなのあった

とりあえず、バイナリエディタで
84C07502CCC3 を見つけたら C3907502C3C3  に書き換えてよさそう ・ω・

おすすめ

コメントを残す

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