news 2026/7/21 1:25:52

Chrome 49 在 ReactOS 上 c0000005 崩溃的修复过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Chrome 49 在 ReactOS 上 c0000005 崩溃的修复过程

Chrome 49 在 ReactOS 上 c0000005 崩溃的修复过程

概述

Chrome 49 (Chrome_V49) 在 ReactOS 上启动时立即崩溃,异常代码c0000005(访问违例),EIP=0。本文档详细记录了从问题分析到修复的完整过程。


1. 启用 Chrome 专用崩溃调试日志

修改文件

  • dll/win32/kernel32/client/except.c

修改内容

UnhandledExceptionFilter调用的PrintStackTrace函数中,添加进程名判断,仅当当前进程为Chrome.exe时才打印详细的崩溃调试信息。

关键代码 - 进程名判断:

staticBOOLIsChromeProcess(VOID){CHAR szPath[MAX_PATH];CHAR*pName,*pSlash;if(!GetModuleFileNameA(NULL,szPath,sizeof(szPath)))returnFALSE;/* Extract filename from full path */pName=szPath;pSlash=strrchr(szPath,'\\');if(pSlash)pName=pSlash+1;pSlash=strrchr(szPath,'/');if(pSlash&&pSlash>pName-1)pName=pSlash+1;/* Convert to lowercase for comparison */for(pSlash=pName;*pSlash;pSlash++){if(*pSlash>='A'&&*pSlash<='Z')*pSlash+='a'-'A';}return(strcmp(pName,"chrome.exe")==0);}

调试日志输出(10 步):

步骤内容说明
Step 1Exception Basic Information异常代码、标志、地址
Step 2Access Violation Details读/写/执行类型、目标地址
Step 3Stack Data DumpESP 附近栈数据(定位调用参数)
Step 4Wine Stub Check缺失函数检查
Step 5CPU Registers Dump所有寄存器值
Step 6Crash Location Analysis崩溃所在的模块名、基址、偏移
Step 7Call Stack Trace帧回溯(最多 128 帧)
Step 8All Loaded Modules所有已加载 DLL 列表
Step 9Instruction at EIP崩溃位置的 16 字节机器码
Step 10Debug Summary异常类型、崩溃位置摘要

2. 第一次崩溃分析:EIP=0 的 NULL 指针调用

崩溃日志摘要

ExceptionCode: c0000005 (ACCESS_VIOLATION) ExceptionAddress: 00000000 Operation: READ Faulting Address: 00000000 Registers: EAX: 00000000 EBX: 00000000 ECX: 0012fce4 EDX: c0000001 EBP: 0012fe14 ESI: 0015b0d0 ESP: 0012fca0 EDI: 00400000 EIP: 00000000 Call Stack (3 frames): Frame[0]: <Chrome.exe:0x1078f> (base=00400000) Frame[1]: <Chrome.exe:0x63e1a> (base=00400000) Frame[2]: <kernel32.dll:0x12535> (base=7C5E0000)

分析过程

  1. 调用栈过短(仅 3 帧)→ 崩溃发生在 Chrome.exe 的非常早期初始化阶段
  2. EIP=0→ CPU 试图执行地址 0 处的代码 → 通过 NULL 函数指针调用
  3. Frame[0]=0x1078f→ 单例构造函数返回后的地址

反汇编 Chrome.exe 构造函数

使用 hex dump + objdump 反汇编 Chrome.exe:

关键代码段(RVA 0x104C0 ~ 0x1078f):

; Chrome 单例对象构造函数 (size 0x4C = 76 bytes) ; === 第一次 API 动态解析 === 0x104EE: call [GetCurrentProcess] ; 获取当前进程句柄 0x10504: call [GetModuleHandleW] ; GetModuleHandleW("kernel32.dll") 0x1050B: call [GetProcAddress] ; GetProcAddress(hMod, "IsWow64Process") 0x10513: test eax, eax 0x10515: je SKIP ; 如果 NULL 则跳过 ... 0x1052C: call *%eax ; 调用 IsWow64Process ; === 第二次 API 动态解析 === 0x106B9: push "GetProductInfo" ; 函数名 0x106BE: push "kernel32.dll" ; 模块名 0x106C3: call [GetModuleHandleW] ; GetModuleHandleW("kernel32.dll") 0x106C9: push eax ; hModule 0x106CA: call [GetProcAddress] ; GetProcAddress(hMod, "GetProductInfo") ... 0x106E7: call *%eax ; 调用 GetProductInfo ← CRASH HERE!

根因定位

寄存器 + 栈数据综合分析:

ESP at 0x0012FCA0: 0x0012FCA0: 004106E9 00000006 00000000 00000000

ESP 顶部值0x004106E9对应call *%eax指令后的返回地址(RVA 0x106E9),指令本身在RVA 0x106E7

call *%eax的分析:

  • GetProcAddress(hKernel32, "GetProductInfo")→ EAX
  • 如果 EAX=0(函数未找到),则call *%eax→ EIP=0 → 崩溃

根因确认

ReactOS 的kernel32.spec文件将GetProductInfo定义为转发器:

@ stdcall GetProductInfo(long long long long ptr) ntdll.RtlGetProductInfo

ntdll.dll 并没有导出 RtlGetProductInfo

DLL导出 RtlGetProductInfo
ntdll.dll
ntdll_vista.dll✅ (Ordinal 2)

Chrome 通过GetProcAddress(GetModuleHandleW("kernel32.dll"), "GetProductInfo")查找函数 → 转发器指向ntdll.RtlGetProductInfo→ ntdll 中没有此函数 → 返回 NULL → Chrome 调用 NULL 指针 → 崩溃。


3. 修复:修改 kernel32.spec 转发器

修改文件

  • dll/win32/kernel32/kernel32.spec

修改内容

- @ stdcall GetProductInfo(long long long long ptr) ntdll.RtlGetProductInfo + @ stdcall GetProductInfo(long long long long ptr) ntdll_vista.RtlGetProductInfo

修复原理

  1. Chrome 在 Vista 兼容模式下运行(LdrpInitializeProcessCompat: Found guid for winver 0x600
  2. Vista 兼容 shim DLLntdll_vista.dll会被自动加载
  3. ntdll_vista.dll确实导出了RtlGetProductInfo
  4. 修改转发器指向ntdll_vista.RtlGetProductInfo后,GetProcAddress能正确解析

4. 修复验证

修复前

ExceptionCode: c0000005 ExceptionAddress: 00000000 Call Stack: 3 frames (Chrome.exe → Chrome.exe → kernel32)

修复后

ExceptionCode: 80000003 (BREAKPOINT) ExceptionAddress: 021D7BCB (chrome.dll 内有效地址) Call Stack: 20 frames (全部在 chrome.dll 内) EIP Bytes: cc c3 6a 01 e8 05 2d ec 00 cc ...

结论

  • c0000005NULL 指针崩溃已完全修复
  • ✅ Chrome 通过了单例构造函数阶段
  • ✅ Chrome 进入了chrome.dll 的主初始化代码
  • ⏳ 新的80000003断点异常是 Chrome 内部断言失败,需要进一步分析

5. 文件变更汇总

文件变更类型说明
dll/win32/kernel32/client/except.c新增调试代码添加IsChromeProcess()和 10 步调试日志
dll/win32/kernel32/kernel32.spec修复GetProductInfo转发器从ntdll改为ntdll_vista

6. 编译与部署流程

# 编译ninja-C output-MinGW-i386 kernel32# 停止 VME:\VirtualBox\VBoxManage.exe controlvm"ReactOS-Test-New"poweroff# 部署到 VDIvdi_tool.exe add output-MinGW-i386\ReactOS-Test.vdi ^ output-MinGW-i386\dll\win32\kernel32\kernel32.dll ^/ReactOS/system32/kernel32.dll# 清除串口日志 + 启动 VMRemove-Itemoutput-MinGW-i386\serial_output.log E:\VirtualBox\VBoxManage.exe startvm"ReactOS-Test-New"# 查看日志Select-String-Path"output-MinGW-i386\serial_output.log"-Pattern"CHROME-DBG"
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 1:24:55

安卓修改大师官网深度解析:从入门到精通的全能APK定制神器

安卓修改大师官网深度解析&#xff1a;从入门到精通的全能APK定制神器 一、官网概览&#xff1a;www.apkeditor.cn 背后的技术生态 当我们打开安卓修改大师的官方网站 www.apkeditor.cn&#xff0c;首先映入眼帘的是一句简洁而有力的定位语&#xff1a;“首款定制任何安卓应用…

作者头像 李华
网站建设 2026/7/21 0:50:36

4.29华为OD机试真题 新系统 - 日志文件异常检测 (JavaPyCC++JsGo)

日志文件异常检测 2026 华为OD机试真题 4月29日华为OD上机新系统考试真题 100 分题型 点击查看华为 OD 机试真题完整目录&#xff1a;2026最新华为OD机试新系统卷 双机位C卷 真题题库目录&#xff5c;全覆盖题库 逐点算法考点详解 题目描述 在某系统的日志监控服务中&#…

作者头像 李华
网站建设 2026/7/21 0:25:46

手把手构建多智能体应用:基于LangGraph的投资组合分析系统

项目背景与目标 管理投资组合是一项复杂任务,需要持续关注市场趋势、资产表现和风险敞口。许多个人投资者和财务顾问难以手动分析海量数据来做出明智决策。本教程将使用LangGraph构建一个多智能体系统,自动分析用户持有的投资组合(以JSON文件表示),结合金融市场实时信息,…

作者头像 李华
网站建设 2026/7/21 0:25:34

GBase 8s数据库物理存储单元Page与Chunk简介

理解存储结构是掌握数据库原理的关键一步。本文系统介绍南大通用GBase 8s数据库&#xff08;gbase database&#xff09;从物理存储单元到逻辑存储单元的层次关系&#xff0c;并与 Oracle 存储结构进行对照。二、物理存储单元&#xff1a;Page 与 Chunk2.1 数据页&#xff08;P…

作者头像 李华
网站建设 2026/7/21 0:14:00

基于C++实现人脸过渡(大作业报告)

♻️ 资源 大小&#xff1a; 826KB ➡️ 资源下载&#xff1a;https://download.csdn.net/download/s1t16/87453222 人脸过渡大作业报告 基本功能介绍 此次大作业实现了从一张人脸照片到另一张人脸照片的过渡。 使用程序流程&#xff1a; 选取控制点&#xff08;特征点&a…

作者头像 李华