当前位置: 首页 > article >正文

异常的登记(一)

一、windows的异常分类异常Exception可以按“产生源”分为两大类1.CPU 硬件产生的异常2.软件主动触发/模拟产生的异常二、CPU 硬件产生的异常以除0异常#DE为例我们从一个最简单、最典型的 CPU 异常 #DEDivide Error 入手当逆向 Windows 7 x86 内核对异常的处理路径并以此为入口分析 nt!KiTrap00。2.1 _EXCEPTION_RECORD结构体nt!_EXCEPTION_RECORD0x000ExceptionCode:Int4B0x004ExceptionFlags:Uint4B0x008ExceptionRecord:Ptr32 _EXCEPTION_RECORD0x00cExceptionAddress:Ptr32 Void0x010NumberParameters:Uint4B0x014ExceptionInformation:[15]Uint4B1️⃣ExceptionCode异常类型编号。例如0xC0000005 → 内存访问错误Access Violation0xC0000094 → 整数除0Divide by zero0x80000003 → 断点异常INT32️⃣ExceptionFlags异常的状态标志。// 表示这是一个“不可继续执行”的异常。 // 如果某个异常带有这个标志那么异常处理函数不能返回 // ExceptionContinueExecution继续执行否则系统会再次抛出 // STATUS_NONCONTINUABLE_EXCEPTION。#define EXCEPTION_NONCONTINUABLE 0x1// 表示当前正在进行异常展开unwind。 // 也就是说系统已经不再是“找谁来处理异常” // 而是开始沿着栈逐层回退执行清理逻辑比如 __finally。#define EXCEPTION_UNWINDING 0x2// 表示当前是“退出式展开exit unwind”。 // 一般表示线程/流程正在退出系统正在做整条异常链的展开清理。#define EXCEPTION_EXIT_UNWIND 0x4// 表示当前异常对应的栈状态无效。 // 常见场景包括SEH 链节点超出线程栈范围、未按要求对齐等。 // 一旦置位说明异常链/栈结构已经不可信。#define EXCEPTION_STACK_INVALID 0x8// 表示发生了“嵌套异常调用nested exception handler call”。 // 即某个异常处理函数在执行过程中又触发了新的异常 // 导致系统进入更深一层的异常分发流程。#define EXCEPTION_NESTED_CALL 0x10// 表示正在向目标帧target frame展开。 // 常见于系统为了到达某个指定的异常处理目标 // 正在逐层展开中间的栈帧。#define EXCEPTION_TARGET_UNWIND 0x20// 表示发生了“冲突展开collided unwind”。 // 即在栈展开过程中又遇到了新的展开请求 // 导致原本的展开流程和新的展开流程发生冲突。 // 这是异常处理里比较复杂的一种情况。#define EXCEPTION_COLLIDED_UNWIND 0x403️⃣ExceptionRecord指针指向“前一个异常记录”。用于异常嵌套异常在异常处理过程中再次发生形成一个链表。4️⃣ExceptionAddress发生异常的指令地址EIP。例如除0时这里就是 idiv 那条指令地址。这是非常重要的字段。5️⃣NumberParameters6️⃣ExceptionInformationNumberParameters表示 ExceptionInformation[] 数组中 有效参数的个数0~15。处理器/内核在构造异常记录时会填它。ExceptionInformation[15]存放异常的 附加参数具体每个参数的含义取决于 ExceptionCode。只有前 NumberParameters 个元素有效后面不看。2.2 KiTrap00.text:0043EFC0 _KiTrap00 proc near;DATA XREF:INIT:_IDT↓o.text:0043EFC0.text:0043EFC0 var_2word ptr-2.text:0043EFC0 arg_4dword ptr8.text:0043EFC0.text:0043EFC0;FUNCTION CHUNK AT.text:0043ED6B SIZE00000021BYTES.text:0043EFC0.text:0043EFC0 push0.text:0043EFC2 mov[esp4var_2],0.text:0043EFC9 push ebp.text:0043EFCA push ebx.text:0043EFCB push esi.text:0043EFCC push edi.text:0043EFCD push fs.text:0043EFCF mov ebx,30h;0.text:0043EFD4 mov fs,bx;换成内核fs.text:0043EFD7 assume fs:nothing.text:0043EFD7 mov ebx,large fs:_KPCR;ExceptionList.text:0043EFDE push ebx.text:0043EFDF sub esp,4;跳过4字节.text:0043EFE2 push eax.text:0043EFE3 push ecx.text:0043EFE4 push edx.text:0043EFE5 push ds.text:0043EFE6 push es.text:0043EFE7 push gs.text:0043EFE9 mov ax,23h;#.text:0043EFED sub esp,30h;跳过48字节.text:0043EFED;esp直接指向_KTRAP_FRAME开始部分.text:0043EFF0 mov ds,ax.text:0043EFF3 assume ds:nothing.text:0043EFF3 mov es,ax;替换内核es.text:0043EFF6 assume es:nothing.text:0043EFF6 mov ebp,esp.text:0043EFF8 test[esp_KTRAP_FRAME.EFlags],20000h;判断vm位.text:0043F000 jnzshortV86_kit0_a;如果是虚拟8086模式跳转.text:0043F002.text:0043F002 loc_43F002:;CODE XREF:V86_kit0_a25↑j.text:0043F002 mov ecx,large fs:_KPCR.PrcbData.CurrentThread.text:0043F009 cld.text:0043F00Aand[ebp_KTRAP_FRAME.Dr7],0.text:0043F00E test[ecx_KTHREAD.Header.___u0.__s3.DebugActive],0DFh;该线程当前是否正在“被调试”状态中.text:0043F012 jnz Dr_kit0_a;如果在调试状态则跳转.text:0043F018.text:0043F018 loc_43F018:;CODE XREF:Dr_kit0_aD↑j.text:0043F018;Dr_kit0_a79↑j.text:0043F018 mov ebx,[ebp_KTRAP_FRAME._Ebp].text:0043F01B mov edi,[ebp_KTRAP_FRAME._Eip].text:0043F01E mov[ebp_KTRAP_FRAME.DbgArgPointer],edx.text:0043F021 mov[ebp_KTRAP_FRAME.DbgArgMark],0BADB0D00h.text:0043F028 mov[ebp_KTRAP_FRAME.DbgEbp],ebx.text:0043F02B mov[ebp_KTRAP_FRAME.DbgEip],edi.text:0043F02E test byte ptr[ebp(_KTRAP_FRAME.EFlags2)],2;判断是不是虚拟8086.text:0043F032 jnzshortloc_43F082.text:0043F034 test byte ptr[ebp_KTRAP_FRAME.SegCs],1;判断是不是内核模式.text:0043F038 jnzshortloc_43F04B;如果是内核模式直接蓝屏.text:0043F038;否则是来自用户态CPL3则继续按用户态异常处理.text:0043F03A sti.text:0043F03B push ebp.text:0043F03C push0.text:0043F03E push0.text:0043F040 push0.text:0043F042 push0.text:0043F044 push7Fh.text:0043F046 call _KeBugCheck224;KeBugCheck2(x,x,x,x,x,x).text:0043F04B;---------------------------------------------------------------------------.text:0043F04B.text:0043F04B loc_43F04B:;CODE XREF:_KiTrap0078↑j.text:0043F04B cmp word ptr[ebp_KTRAP_FRAME.SegCs],1Bh;判断是不是r3的段选择子.text:0043F050 jnzshortloc_43F06F;如果不是r3的段选择子跳转.text:0043F052 sti.text:0043F053 push ebp;_KTRAP_FRAME.text:0043F054 call _Ki386CheckDivideByZeroTrap4;这函数通常会检查触发原因除数为0vs 商溢出.text:0043F054;返回值eax错误号.text:0043F059 mov ebx,[ebp_KTRAP_FRAME._Eip];ebx异常地址.text:0043F05C jmp loc_43ED6B.text:0043F061;---------------------------------------------------------------------------.text:0043F061.text:0043F061 loc_43F061:;CODE XREF:_KiTrap00C0↓j.text:0043F061;_KiTrap00CB↓j.text:0043F061 sti.text:0043F062 mov ebx,[ebp68h].text:0043F065 mov eax,0C0000094h.text:0043F06A jmp loc_43ED6B.text:0043F06F;---------------------------------------------------------------------------.text:0043F06F.text:0043F06F loc_43F06F:;CODE XREF:_KiTrap0090↑j.text:0043F06F mov ebx,large fs:124h.text:0043F076 mov ebx,[ebx50h].text:0043F079 cmp dword ptr[ebx148h],0.text:0043F080 jzshortloc_43F061.text:0043F082.text:0043F082 loc_43F082:;CODE XREF:_KiTrap0072↑j.text:0043F082 push0.text:0043F084 call _Ki386VdmReflectException_A4;Ki386VdmReflectException_A(x).text:0043F089oral,al.text:0043F08B jzshortloc_43F061.text:0043F08D jmp Kei386EoiHelper0;Kei386EoiHelper().text:0043F08D _KiTrap00 endp.text:0043ED6B loc_43ED6B:;CODE XREF:_KiRaiseAssertion81↑j.text:0043ED6B;sub_43EEAF64↓j....text:0043ED6Bxorecx,ecx;参数个数清零.text:0043ED6D call CommonDispatchException2.3 CommonDispatchException.text:0043ED8C CommonDispatchException proc near;CODE XREF:_KiRaiseAssertion471↑p.text:0043ED8C;_KiRaiseAssertion47D↑p....text:0043ED8C.text:0043ED8C var_50dword ptr-50h.text:0043ED8C var_4Cdword ptr-4Ch.text:0043ED8C var_48dword ptr-48h.text:0043ED8C var_44dword ptr-44h.text:0043ED8C var_40dword ptr-40h.text:0043ED8C var_3Cbyte ptr-3Ch.text:0043ED8C.text:0043ED8C sub esp,50h.text:0043ED8F mov[esp_EXCEPTION_RECORD.ExceptionCode],eax.text:0043ED92xoreax,eax.text:0043ED94 mov[esp_EXCEPTION_RECORD.ExceptionFlags],eax.text:0043ED98 mov[esp_EXCEPTION_RECORD.ExceptionRecord],eax.text:0043ED9C mov[esp_EXCEPTION_RECORD.ExceptionAddress],ebx.text:0043EDA0 mov[esp_EXCEPTION_RECORD.NumberParameters],ecx.text:0043EDA4 cmp ecx,0;判断有没有参数.text:0043EDA7 jzshortloc_43EDB5.text:0043EDA9 lea ebx,[esp_EXCEPTION_RECORD.ExceptionInformation].text:0043EDAD mov[ebx],edx;参数1.text:0043EDAF mov[ebx4],esi;参数2.text:0043EDB2 mov[ebx8],edi;参数3.text:0043EDB5.text:0043EDB5 loc_43EDB5:;CODE XREF:CommonDispatchException1B↑j.text:0043EDB5 mov ecx,esp;ecx_EXCEPTION_RECORD.text:0043EDB7 test byte ptr[ebp(_KTRAP_FRAME.EFlags2)],2;判断是否8086模式.text:0043EDBB jzshortloc_43EDC4.text:0043EDBD mov eax,0FFFFh.text:0043EDC2 jmpshortloc_43EDC7.text:0043EDC4;---------------------------------------------------------------------------.text:0043EDC4.text:0043EDC4 loc_43EDC4:;CODE XREF:CommonDispatchException2F↑j.text:0043EDC4 mov eax,[ebp_KTRAP_FRAME.SegCs].text:0043EDC7.text:0043EDC7 loc_43EDC7:;CODE XREF:CommonDispatchException36↑j.text:0043EDC7andeax,1;内核CS低位为0用户CS0x1B低位为1.text:0043EDC7;因此1就足够区分KernelMode(0)/UserMode(1)。.text:0043EDCA push1;FirstChance.text:0043EDCC push eax;PreviousMode.text:0043EDCD push ebp;TrapFrame.text:0043EDCE push0;ExceptionFrame.text:0043EDD0 push ecx;ExceptionRecord.text:0043EDD1 call _KiDispatchException20;KiDispatchException(x,x,x,x,x).text:0043EDD6 mov esp,ebp.text:0043EDD8 jmp Kei386EoiHelper0;Kei386EoiHelper().text:0043EDD8 CommonDispatchException endp2.4 从 KiTrap00 到 CommonDispatchException做了什么用户态执行 除0||CPU 触发 #DE(vector0)v IDT[0]gate-nt!KiTrap00||--保存现场/切 fs0x30/建 KTRAP_FRAME||--判断 V86/VDM?||--是:Ki386VdmReflectException_A...|--否:继续||--判断来源 SegCs:||--KernelMode:KeBugCheck2(0x7F,...)|--UserMode(CS0x1B):||||--Ki386CheckDivideByZeroTrap(得到异常错误码)||--eaxExceptionCode(如0xC0000094)||--ebxExceptionAddress(EIP)|--ecxNumberParameters(这里为0)v CommonDispatchException||--在栈上构造 _EXCEPTION_RECORD|--计算 PreviousMode(SegCs1)--调用KiDispatchException(...,FirstChance1)

相关文章:

异常的登记(一)

一、windows的异常分类 异常(Exception)可以按“产生源”分为两大类: 1. CPU 硬件产生的异常 2. 软件主动触发 / 模拟产生的异常二、CPU 硬件产生的异常:以除0异常(#DE)为例 我们从一个最简单、最典型的 CP…...

MogFace-large与活体检测技术结合:构建金融级安全人脸认证

MogFace-large与活体检测技术结合:构建金融级安全人脸认证 最近和几个做金融科技的朋友聊天,他们都在头疼同一个问题:线上业务越来越方便,但安全风险也越来越高。特别是人脸识别,现在随便一张高清照片或者一段视频&am…...

springboot哈尔滨道路巡查报修信息管理系统vue 论文vue

目录系统架构设计功能模块划分技术实现方案开发阶段计划论文研究要点测试部署方案创新点设计项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统架构设计 采用前后端分离架构,后端使用Spr…...

工业控制系统选型指南:PLC、DCS、FCS到底怎么选?(附场景对比表)

工业控制系统选型实战:PLC、DCS、FCS核心差异与场景化决策框架 在石化工厂的中控室里,李工程师盯着屏幕上跳动的压力曲线皱起了眉头——现有PLC系统对反应釜的连续控制已经力不从心,而隔壁车间的DCS系统预算又远超预期。这种场景每天都在全球…...

Lychee Rerank MM惊艳案例:医学影像DICOM缩略图+放射科报告文本语义对齐

Lychee Rerank MM惊艳案例:医学影像DICOM缩略图放射科报告文本语义对齐 医学影像与报告文本的精准匹配一直是医疗AI领域的核心挑战。传统的基于关键词的检索方式难以理解影像内容与报告描述之间的深层语义关联,而Lychee Rerank MM的出现为这一难题提供了…...

C的头文件

一、.c与.h区别.c文件(源文件)是程序的主要代码.h文件(头文件)包含函数,宏定义,结构体定义,全局变量声明。被.c文件引用二、作用编译器编译.c文件的时候知道用到的函数其形式是否规范,对函数进行…...

WAN2.2文生视频ComfyUI工作流优化:减少冗余节点、提升执行效率与稳定性

WAN2.2文生视频ComfyUI工作流优化:减少冗余节点、提升执行效率与稳定性 1. 引言:从能用,到好用 如果你用过WAN2.2文生视频工作流,可能会有一个感觉:功能是挺强大的,能结合SDXL Prompt Styler生成风格多样…...

【Unity】解决Win10无法播放H265(HEVC)视频以及未响应卡死

前言 在项目现场部署软件的时候,经常会遇到无法播放H265视频问题, 防盗镇楼,本文地址:https://blog.csdn.net/cbaili/article/details/158877197 方案1 安装微软官方解码器 无意间在外网发现个帖子,安装HEVC解码器.实测好用: https://www.free-codecs.com/guides/how_to_dow…...

Qwen-Image镜像快速入门:RTX4090D镜像内置脚本调用Qwen-VL全流程演示

Qwen-Image镜像快速入门:RTX4090D镜像内置脚本调用Qwen-VL全流程演示 1. 环境准备与快速部署 1.1 硬件与镜像要求 在开始之前,请确保您的环境满足以下要求: GPU型号:RTX 4090D(24GB显存)驱动版本&#…...

DeerFlow多智能体系统实战:基于LangGraph的自动化研究流程搭建

DeerFlow多智能体系统实战:基于LangGraph的自动化研究流程搭建 本文详细介绍了如何使用DeerFlow的多智能体架构进行自动化研究,包括LangGraph框架的配置、智能体节点定义、状态管理以及工作流设计。适合希望快速构建复杂AI研究流程的开发者,提…...

Qwen3-0.6B-FP8模型监控:性能指标与日志分析

Qwen3-0.6B-FP8模型监控:性能指标与日志分析 1. 为什么需要模型监控 当你把Qwen3-0.6B-FP8模型部署到生产环境后,最怕的就是半夜收到报警说服务挂了,或者用户反馈响应变慢了。这时候如果没有完善的监控体系,排查问题就像大海捞针…...

二极管伏安特性实测:用Arduino+Python绘制曲线(附完整代码)

二极管伏安特性实测:用ArduinoPython绘制曲线(附完整代码) 在电子工程实践中,理解元器件的真实特性往往比理论推导更具价值。当我们翻开任何一本电子学教材,二极管伏安特性曲线总是以理想化的折线形式呈现——0.7V导通…...

51单片机学习记录

1.流水灯#include "reg51.h"// 定义LED灯的位选数组 unsigned char led0[] {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};// 延时函数 void delay(unsigned int n){unsigned int i0,j0;for(i 0;i<n;i){for(j 0;j<120;j);} } // LED流水灯函数 void led(){int…...

终极Evernote备份方案:evernote-backup完整指南,让笔记数据永不丢失![特殊字符]

终极Evernote备份方案&#xff1a;evernote-backup完整指南&#xff0c;让笔记数据永不丢失&#xff01;&#x1f4da; 【免费下载链接】evernote-backup Backup & export all Evernote notes and notebooks 项目地址: https://gitcode.com/gh_mirrors/ev/evernote-backu…...

AIGlasses OS Pro实战:用本地视觉系统实现文档扫描与实时翻译场景

AIGlasses OS Pro实战&#xff1a;用本地视觉系统实现文档扫描与实时翻译场景 1. 智能眼镜视觉系统的独特价值 在移动计算设备快速发展的今天&#xff0c;智能眼镜正逐渐成为增强现实和视觉辅助的重要载体。AIGlasses OS Pro作为一款专为智能眼镜设计的本地视觉系统&#xff…...

Youtu-VL-4B-Instruct源码部署:智能家居设备界面理解与操作指引生成

Youtu-VL-4B-Instruct源码部署&#xff1a;智能家居设备界面理解与操作指引生成 1. 引言 想象一下这个场景&#xff1a;你刚买了一个新的智能空气净化器&#xff0c;面对面板上密密麻麻的按钮和指示灯&#xff0c;说明书又不知所云。这时候&#xff0c;你只需要拿起手机拍张照…...

lychee-rerank-mm快速部署教程:单机GPU适配,显存占用<2GB

lychee-rerank-mm快速部署教程&#xff1a;单机GPU适配&#xff0c;显存占用<2GB 1. 什么是lychee-rerank-mm&#xff1f; lychee-rerank-mm是一个轻量级的多模态重排序模型&#xff0c;专门用来给文本或图像内容按照与查询的匹配度进行打分排序。简单来说&#xff0c;它就…...

黑群晖Docker新手避坑:aria2-pro挂载路径错误导致容器启动失败的完整解决流程

黑群晖Docker新手避坑指南&#xff1a;彻底解决aria2-pro路径映射问题 刚接触黑群晖和Docker的新手&#xff0c;在搭建下载工具时总会遇到各种"坑"。其中最常见的就是容器启动失败&#xff0c;而错误原因往往指向一个看似简单却令人困惑的问题——路径映射错误。本文…...

Python爬虫实战:手把手教你如何搭建文档站点快照与长图归档器!

㊗️本期内容已收录至专栏《Python爬虫实战》&#xff0c;持续完善知识体系与项目实战&#xff0c;建议先订阅收藏&#xff0c;后续查阅更方便&#xff5e; ㊙️本期爬虫难度指数&#xff1a;⭐⭐⭐ (进阶) &#x1f250;福利&#xff1a; 一次订阅后&#xff0c;专栏内的所有文…...

Python 快速上手:从零构建你的第一个 Telegram 机器人

1. 为什么选择Telegram机器人开发 最近两年&#xff0c;我身边越来越多的开发者开始尝试Telegram机器人开发。作为一个长期使用Python的开发者&#xff0c;我发现用Python构建Telegram机器人简直是绝配。相比其他即时通讯平台&#xff0c;Telegram的机器人API设计得非常友好&am…...

OpenClaw+GLM-4.7-Flash智能监控:服务器日志异常检测与告警推送

OpenClawGLM-4.7-Flash智能监控&#xff1a;服务器日志异常检测与告警推送 1. 为什么需要本地化的日志监控方案 去年处理线上事故时&#xff0c;我发现团队严重依赖第三方日志监控服务。当服务器出现权限拒绝错误时&#xff0c;敏感路径信息已经被传输到云端。这件事让我开始…...

告别第三方内网穿透服务:用DDNS-Go+华为云自建动态域名解析,飞牛OS实测

自建动态域名解析全攻略&#xff1a;DDNS-Go与华为云的深度整合实践 在数字化生活日益普及的今天&#xff0c;远程访问家庭或办公室网络资源已成为许多技术爱好者和专业人士的刚需。传统的内网穿透解决方案如花生壳、Ngrok等虽然方便&#xff0c;但往往伴随着高昂的费用、带宽限…...

硬件密码引擎(CE)技术解析:嵌入式安全加速核心

1. 硬件密码引擎&#xff08;CE&#xff09;模块技术解析 1.1 模块定位与工程价值 硬件密码引擎&#xff08;Crypto Engine&#xff0c;简称 CE&#xff09;并非通用计算单元&#xff0c;而是面向嵌入式系统安全需求深度定制的专用协处理器。其核心价值在于将原本由主控 CPU 承…...

不用困在局域网!XiuXianGame修仙游戏,外网访问就这么简单

XiuXianGame 是一款以文字为核心的修仙休闲游戏&#xff0c;核心功能涵盖修为提升、灵石积累、休闲小游戏闯关等&#xff0c;玩家可通过手动操作或自动挂机的方式推进修仙进度&#xff0c;整体玩法轻松不耗时&#xff0c;主打碎片化的休闲体验&#xff0c;无需高强度投入就能感…...

当后轮也开始玩转向:4WS4WD的横摆稳定黑科技

4WS4WD无人车横摆稳定性控制 通过滑模控制理论对后轮转角和直接横摆力矩进行集成控制&#xff0c;考虑前后轴荷及路面附着系数实现转矩分配&#xff0c;提高车身稳定性。 carsim&#xff0f;simulink联合仿真 方向打死油门到底&#xff0c;车尾突然开始画龙——这种惊悚场面在…...

dir命令详解:查看文件与文件夹

Windows命令提示符中dir命令的完整使用指南 dir命令是Windows命令提示符中最基础且最重要的命令之一&#xff0c;主要用于查看当前目录下的文件和子文件夹信息。下面我将详细介绍该命令的各种用法和参数。 1. dir命令的基本用法 基本查看操作 在命令提示符中直接输入dir命令…...

Step3-VL-10B-Base系统资源优化:C盘清理与模型存储空间管理

Step3-VL-10B-Base系统资源优化&#xff1a;C盘清理与模型存储空间管理 你是不是也遇到过这种情况&#xff1f;兴致勃勃地准备部署一个像Step3-VL-10B-Base这样的大模型&#xff0c;结果刚跑起来&#xff0c;C盘空间就“告急”了。看着那个红色的磁盘空间不足提示&#xff0c;…...

华为ENSP实战:旁挂AC的Web界面快速部署多SSID无线网络

1. 为什么选择旁挂AC部署多SSID无线网络&#xff1f; 在企业无线网络部署中&#xff0c;旁挂式AC&#xff08;接入控制器&#xff09;架构因其灵活性和易维护性&#xff0c;成为中小型企业的首选方案。相比直连式部署&#xff0c;旁挂AC不需要改变现有网络拓扑结构&#xff0c;…...

5.OpenGL之uniform

在OpenGL中&#xff0c;uniform 是一种着色器程序中的变量类型&#xff08;存储限定符&#xff09;。简单来说&#xff0c;可以把 uniform 理解为&#xff1a;从CPU端&#xff08;你的C/Qt代码&#xff09;向GPU端&#xff08;着色器程序&#xff09;发送的一个“全局只读”参数…...

保姆级教程:用GParted Live USB无损调整Windows磁盘分区(含安全操作指南)

零风险实战&#xff1a;用GParted Live USB拯救你的Windows磁盘空间 每次打开电脑看到C盘飘红的剩余空间&#xff0c;是不是有种窒息感&#xff1f;系统运行越来越慢&#xff0c;新软件装不下&#xff0c;临时文件不敢删——这种困境我太熟悉了。三年前我的开发机C盘只剩500MB时…...