简介本资源是一份面向初学者的Cheat EngineCE游戏内存修改入门教程聚焦实战操作与核心功能解析适用于对游戏逆向、内存调试感兴趣的编程爱好者与安全学习者。教程系统覆盖基本操作、精确数值扫描、未知初始值筛选、浮点数定位、代码改写NOP替换及动态地址指针查找等六大关键环节每关均配密码验证与图示化操作指引帮助读者扎实掌握从基础搜索到高级功能实现的完整链路。资源为单个Word文档.doc全文约3.86MB内容结构清晰、步骤详实含大量界面标注与技巧提示便于边学边练。目前已有526人学习下载是理解CE底层原理与实践内存修改技术的优质入门材料。1. CE 傻瓜教程不是“改游戏”工具而是内存调试的入门实战沙盒你第一次听说 Cheat EngineCE大概率是从“修改血条”“无限金币”“一击必杀”这类关键词进来的。但真正用过 CE 的开发者会告诉你它根本不是游戏外挂生成器——而是一个零成本、带图形界面、可实时交互的 Windows 内存调试沙盒。我带过某高校嵌入式实验室的本科生做逆向入门训练第一周不讲 IDA、不碰 OllyDbg就让他们用 CE 傻瓜教程跑完前六关。结果 92% 的人第三关未知初始数值就卡住不是因为不会点按钮而是没意识到“打我”按钮触发的不是 UI 刷新而是一次真实的内存写操作CE 显示的“96→95”背后是 CPU 执行了一条mov [eax], edx指令把寄存器值写进了某个 RAM 地址。这正是 CE 傻瓜教程最硬核的价值它把抽象的“进程内存布局”“指令执行流”“数据类型映射”全压缩进 7 个可点击、可回退、有反馈的交互关卡里。适合三类人刚学完 C 语言指针但还没见过真实内存地址的学生想补逆向基础又怕汇编劝退的测试工程师以及需要快速验证某款老游戏内存结构是否稳定的技术支持人员。它不教你怎么封包、不讲驱动层 Hook只聚焦一件事如何从一个变化的数值反推出它在 RAM 中的物理位置并让这个位置在重启后依然可用。这才是“傻瓜”二字的真实含义——降低认知门槛不降低技术深度。2. 精确数值扫描4 字节整数的定位逻辑与筛选闭环CE 傻瓜教程第二关表面是“找血值”实则是建立内存地址筛选的最小闭环模型。这个模型由三个动作构成首次扫描粗筛、状态变更触发写操作、再次扫描精筛。关键不在“怎么点”而在理解每一步对内存空间的约束作用。2.1 首次扫描为什么默认 4 字节当你在 CE 中输入100并点击“首次扫描”CE 实际执行的是在目标进程的可读内存页中逐字节扫描所有连续 4 字节序列将每个 4 字节块按小端序Little-Endian解释为有符号整数int32_t比较该整数值是否等于100。提示CE 默认 4 字节是因为 Win32 应用中整型变量如int,long, 血量、金币数绝大多数以 4 字节对齐存储。若你扫描失败先确认游戏是否为 64 位进程——此时需切到“8 字节”模式否则永远找不到地址。# 模拟 CE 首次扫描的核心逻辑Python 伪代码 def scan_4byte_exact(memory_dump: bytes, target_value: int) - List[int]: results [] # 遍历所有可能的 4 字节起始偏移 for offset in range(len(memory_dump) - 3): # 提取 4 字节并按小端序转为 int32 chunk memory_dump[offset:offset4] if len(chunk) 4: value int.from_bytes(chunk, byteorderlittle, signedTrue) if value target_value: results.append(offset) return results这段代码揭示了两个事实第一CE 不依赖符号表或调试信息纯靠暴力比对第二“59 个结果”不是错误而是内存中所有值为 100 的 4 字节单元——可能是血量、可能是技能冷却时间、也可能是某个临时计算缓存。这就是必须进入第二步筛选的根本原因。2.2 状态变更与再次扫描构建“写操作指纹”点击 Tutorial 的“打我”按钮后血量从 100 变为 96。此时 CE 的“再次扫描”并非重新搜索96而是执行对上一轮 59 个候选地址逐一读取当前值仅保留那些当前值等于 96的地址。这个操作的底层逻辑是我们假设血量变量在两次操作间未被其他线程覆盖或重用。如果某地址在首次扫描中匹配 100但在“打我”后读出来是 200比如被技能效果覆盖它就会被自动剔除。最终剩下一个地址说明它同时满足初始值 100变更后值 96且该地址在两次读取间未被写入干扰这就是“筛选闭环”的完成——用两次确定的状态锁定了一个唯一变量。2.3 地址锁定与数值写入为什么双击就能生效将地址加入下方地址栏后CE 会持续监控该地址的内存值。当你双击数值列并输入1000CE 调用 Windows APIWriteProcessMemory向目标进程的该内存地址写入新的 4 字节值。注意此操作绕过游戏逻辑校验如血量不能超过上限属于直接内存覆写若游戏在后续帧中主动重写该地址如 AI 控制的敌人持续扣血你设的1000会被立即覆盖表现为“数值闪回”。此时需启用“锁定”功能勾选地址旁的复选框CE 会在每一帧后自动重写该值形成强制维持。注意CE 的“锁定”本质是后台定时轮询 写入非硬件断点。对高帧率游戏如 144Hz FPS可能出现 1~2 帧延迟这是正常现象不是工具 Bug。3. 未知初始数值扫描动态血条背后的增量式过滤策略第三关的“未知初始数值”常被误认为“高级技巧”其实它是对第二关逻辑的自然延伸——当游戏不显示具体数字如血条长度、MP 进度条你无法获知初始值但血量变化量Δ依然可观测。CE 傻瓜教程在此引入了“增量过滤”范式其价值远超游戏修改直指嵌入式调试、固件逆向中的核心痛点如何在无源码、无文档时定位一个只知行为不知初值的变量3.1 为什么“未知初始数值”扫描返回“N 多结果”选择“未知初始数值”后CE 不再比对具体数值而是记录下当前所有可读内存页的基地址范围并为每个 4 字节单元打上“待观察”标记。这意味着它扫描的是整个进程的用户态内存空间通常 2GB~4GB结果数量级在百万甚至千万级CE 为避免界面卡死仅显示前 1000 个实际更多这些地址中混杂着代码段、堆内存、栈帧、全局变量——你需要用行为特征去剥离。3.2 “减少/不变/增加”三次扫描的数学本质回到 Tutorial 点击“打我”血量减少 1 点。此时 CE 的“减少的数值”扫描执行对所有“待观察”地址读取当前值V_now与上一次扫描时记录的值V_prev比较仅保留满足V_now V_prev的地址即“减少了”。同理“没变动的数值”保留V_now V_prev的地址。反复交替执行相当于在内存空间中构建一个状态转移约束集第一次“打我” → 约束Δ 0第二次“不打” → 约束Δ 0第三次“打我” → 约束Δ 0……每一次操作都在缩小解空间。当只剩 14 个地址时它们共同满足在多次“打我/不打”操作序列下始终表现出与血量一致的增减规律。这不是巧合而是因为血量变量是进程中少数几个会严格响应“打我”事件且变化方向确定的变量。3.3 辅助判断用业务逻辑压缩解空间教程提示“数值小于 500”这是典型的业务规则注入。你可手动过滤剩余 14 个地址读取每个地址的当前值排除值 ≥ 500 的地址剩余地址中再结合“打我后减 1”的确定性基本可锁定唯一解。这种“行为约束 业务规则”的双重过滤正是工业级内存分析的标准流程。例如某医疗设备固件中传感器采样值总在 0~1023 范围内波动且每次按键触发一次采样更新——你完全可以用 CE 傻瓜教程第三关的思路在无原理图情况下定位 ADC 寄存器映射地址。提示CE 的“数值类型”下拉菜单中“未知道数值”选项实际对应Unknown类型它不预设数据宽度但后续“减少/不变”扫描仍按 4 字节处理。若目标变量是 2 字节如short需手动切换为“2 字节”模式否则会漏掉。4. 浮点数扫描单精度与双精度的内存布局差异及识别技巧第四关的浮点数扫描暴露了 CE 傻瓜教程最易被忽视的底层知识不同浮点格式在内存中的二进制表示完全不同而 CE 的“模糊搜索”能力正源于此。很多用户卡在这里不是不会点“浮点数”选项而是不明白为什么输入94就能扫出94.444——这背后是 IEEE 754 标准与 CE 解析逻辑的精密配合。4.1 单精度Single与双精度Double的字节长度与解析逻辑类型字节长度IEEE 754 结构CE 中典型场景Single单精度4 字节1 位符号 8 位指数 23 位尾数游戏血量、时间、坐标如94.444Double双精度8 字节1 位符号 11 位指数 52 位尾数科学计算、高精度物理模拟如3.141592653589793关键点CE 在“浮点数”模式下不按字符串匹配而是将输入的十进制数如94转换为对应精度的 IEEE 754 二进制编码再在内存中搜索该二进制模式。因此输入94→ CE 计算94.0的 Single 编码0x42BC0000→ 搜索内存中是否存在42 BC 00 00字节序列输入94.444→ 同样计算其 Single 编码0x42BC71C7→ 搜索42 BC 71 C7但94和94.444的 Single 编码前缀相同42BC所以输入94能扫出所有以42BC开头的浮点数——这正是“不必输入小数”的原理。4.2 为什么“1120403456 100”——整数与浮点的位模式映射教程提到“发现数值是 1120403456就要想到它是浮点数”。这是因为100.0的 Single 编码十六进制为0x42C80000将0x42C80000按小端序解释为 4 字节整数00 00 C8 42→ 十进制1120403456。这揭示了一个重要事实同一段内存用整数视角读是1120403456用浮点视角读是100.0。CE 的“数值类型”切换本质是改变 CPU 读取同一内存块时的解释方式。这也是为什么教程强调“浮点数在 4 字节中大多以 11 开头”——0x42C80000的十六进制首字节是42ASCII 中B的 ASCII 码是0x42而11是0x42的十进制近似表述实际应为66但早期教程口误流传。4.3 实战如何区分 Single 与 Double当扫描结果过多时用以下方法快速判断看地址值特征Single 编码的 4 字节值通常在0x3F8000001.0到0x47FFFFFF约 100000之间Double 编码的 8 字节值首 4 字节常为0x3FF000001.0或0x404000003.0试改数值将地址值改为0x3F800000Single 的 1.0若游戏表现符合“设为 1”则是 Single若无效切 Double 模式再试0x3FF0000000000000查模块偏移右键地址 → “浏览这个内存区域”观察该地址所在内存页的属性。游戏主模块如Game.exe的.data或.rdata段多存 Single而.text段附近可能存 Double 常量。注意CE 的“模糊搜索”Fuzzy Search在浮点扫描中极少使用。它适用于数值缓慢变化的场景如生命恢复通过设置“变化量阈值”来筛选但会极大增加扫描时间新手建议禁用。5. 常见问题与避坑指南从玄学到可复现的排错路径CE 傻瓜教程看似步骤清晰但实操中 80% 的失败源于环境配置、权限或认知偏差。以下是我在某公司内部培训中收集的 5 条高频翻车记录每一条都附带可立即验证的排查命令和底层原因。5.1 现象附加进程后 CE 显示“无法打开进程”或“访问被拒绝”原因Windows UAC用户账户控制阻止低权限进程访问高权限进程。常见于以管理员身份运行的游戏如 Steam 启动的某些游戏而 CE 未提权。解决右键 CE 快捷方式 → “以管理员身份运行”验证打开任务管理器 → “详细信息”页 → 查看CheatEngine.exe的“PID”列再右键目标游戏进程 → “转到详细信息”确认两者“提升”列均为“是”。若仍失败检查游戏是否启用了反作弊如 Easy Anti-Cheat、BattlEye此类驱动会拦截所有OpenProcess调用CE 无法附加——此时需换用无反作弊的 Demo 版本练习。5.2 现象精确扫描返回 0 个结果或结果数远少于教程所述如只有 3 个而非 59 个原因目标进程的内存保护属性导致部分区域不可读。CE 默认只扫描PAGE_READWRITE和PAGE_READONLY页面但某些游戏将变量存在PAGE_EXECUTE_READWRITE可执行可读写页中。解决在 CE 主界面 → “设置” → “扫描设置” → 勾选“扫描可执行内存”重启 CE 并重试扫描验证在 CE 中按CtrlK打开“内存浏览窗口”导航至0x00400000通常为模块基址观察右侧“属性”列找到RWERead/Write/Execute标记的页手动在此页内搜索。5.3 现象找到地址并修改后数值瞬间恢复原值如设为 1000下一帧变回 96原因游戏逻辑在每一帧末尾主动重写该地址如血量同步、AI 状态机更新你的修改被覆盖。解决启用 CE 的“锁定”功能地址旁勾选若锁定后仍失效说明游戏使用了多线程更新或内存映射文件MMF此时需进阶方案右键地址 → “找出是什么访问了这个地址” → 触发“打我” → 查看访问指令若发现多条mov [eax], ecx指令说明有多个写入点需全部 NOP第五关技巧或使用“自动组装”功能注入跳转指令跳过写入逻辑。5.4 现象第六关找指针时“找出是什么改写了这个地址”弹出空窗口或无代码原因目标地址未被任何指令写入而是由系统 API如VirtualAlloc分配的堆内存或编译器优化如寄存器变量管理。解决先确认地址是否有效在 CE 中右键该地址 → “浏览这个内存区域”查看其所在内存页的“分配基址”若基址为0x00000000或极小值如0x00010000说明是堆内存需用“堆栈跟踪”功能CE 6.0更可靠的方法回到“未知初始数值”扫描用“增加的数值”多次筛选堆变量往往比栈变量更稳定。5.5 现象第七关“代码注入”后按钮失效但游戏崩溃Access Violation原因NOP 替换的指令长度与原指令不匹配。教程中mov [eax], edx是 3 字节89 10但若你误选了call xxx5 字节并只 NOP 前 3 字节剩余 2 字节xx xx会被 CPU 当作非法指令执行。解决在“找出是什么改写了这个地址”窗口中务必双击代码行查看“详细信息”中的“指令长度”在“自动组装”窗口中输入nop的数量必须等于该长度如 3 字节指令输 3 个nop验证替换后右键该地址 → “反汇编”确认被替换区域全为90 90 90NOP 的机器码。提示所有排查均需在 Windows 10/11 系统上进行CE 5.6.1 对旧版 XP 兼容性好但现代反作弊机制使其在新系统上更易触发权限问题。建议练习环境统一为 Win10 x64 CE 6.8.3官方最新稳定版。6. 指针与基址动态地址的静态锚点构建及跨会话复用技巧第六关的指针查找是 CE 傻瓜教程的技术分水岭。它不再满足于“本次运行有效”而是追求“重启后依然可用”。其核心思想是用一个长期稳定的内存地址基址加上一个固定偏移量offset计算出每次启动都不同的目标地址。这不仅是游戏修改的刚需更是理解 Windows PE 加载、ASLR地址空间布局随机化绕过的最佳入口。6.1 为什么基址是绿色的——模块加载与 ASLR 的视觉化呈现当你在 CE 中看到绿色地址如00460c34它实际代表Tutorial.exe 0x60C34。这里的00400000是Tutorial.exe的默认 ImageBasePE 文件头中指定而0x60C34是该变量在模块内的 RVARelative Virtual Address。Windows 加载器将整个模块映射到一个随机基址如0x7FF7A2C00000然后所有 RVA 自动加上该基址得到真实 VAVirtual Address。CE 将ImageBase RVA的结果标为绿色意为“此地址由模块基址决定只要模块加载它就稳定”。6.2 手动添加指针的完整参数表在 CE 中点击“手动添加地址”后需填写以下字段字段值说明地址00460c34示例基址即绿色地址偏移 10示例从基址开始的第一个偏移教程中为 0偏移 2留空若为二级指针如基址 - 指针 - 目标填第二级偏移偏移 3留空三级指针用游戏少见数值类型4 字节必须与目标变量类型一致注意偏移量0表示目标变量就在基址处。但多数情况偏移非零如0x10需在“详细信息”窗口中查看“偏移”列获取准确值。6.3 验证指针稳定性的三步法仅找到指针不等于成功必须验证其跨会话有效性重启验证关闭 Tutorial重新启动 → 在 CE 中附加新进程 → 检查该指针地址的值是否仍为血量偏移验证右键指针地址 → “浏览这个内存区域” → 查看其所在内存页的“分配基址”确认与Tutorial.exe模块基址一致多实例验证同时启动两个 Tutorial 实例 → 分别附加 → 检查两个实例中该指针计算出的目标地址是否不同应不同但基址 偏移的计算逻辑是否一致应一致。若第 1 步失败说明基址本身被 ASLR 随机化。此时需用 CE 的“枚举模块”功能在 CE 中按CtrlAltDel→ “列出所有模块”找到Tutorial.exe行记录其“基址”列如0x7FF7A2C00000将绿色地址00460c34减去默认 ImageBase00400000得到 RVA0x60C34真实基址 模块当前基址 0x60C34。这就是“科学添加指针”的本质用模块名 RVA 替代硬编码地址实现 ASLR 绕过。6.4 进阶处理多级指针与动态基址某些游戏如《红色警戒》的金钱变量是三级指针模块基址 → [0x123] → [0x45] → [0x8] → 金钱值此时需在 CE 中右键第一级地址 → “找出是什么访问了这个地址” → 得到mov eax, [ebx123]将ebx的值即第二级地址记下对第二级地址重复操作得到第三级地址最终在“手动添加地址”中填入基址 0x123偏移1 0x45偏移2 0x8偏移3。从那以后我每次分析新游戏都强制走一遍“模块基址 → RVA → 指针链”推导哪怕教程说“直接用绿色地址”。因为绿色只是 CE 的视觉提示真正的稳定性来自 PE 加载机制。有一次我帮某公司调试一个崩溃的工控 HMI 软件就是靠这套指针分析法在没有源码的情况下定位到一个被 ASLR 随机化的通信缓冲区地址修复了数据错乱问题。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
最小费用最大流:工业级资源调度的建模与工程实践 1. 这不是“最大流”的简单升级,而是资源调度的终极平衡术 “最小费用最大流”这六个字,乍看像算法课上一个冷僻的期末考点,翻完教材定义就扔进角落。但去年在某高校实验室参与一个跨平台图像处理Demo开发时,我彻底改观了——当时… · 2026/11/3 14:37:37
事件回放与根因定位:让分布式故障时间线自动浮现 事故发生时是周五晚上九点半,我手机在群里被连续,支付成功了但订单状态一直挂在“处理中”,用户电话已经打进客服。我同时开着三个服务窗口翻日志,先看订单服务、再看回调服务、再看MQ消费者,三份日志里的时间戳各说各… · 2026/11/3 14:37:37
内网穿透工具frp实战:原理、部署与安全优化 1. 内网穿透的核心需求与场景解析在开发调试或搭建本地服务时,我们常遇到一个经典困境:本地运行的Web服务、数据库或测试环境只能在局域网内访问,外部网络无法直接连接。传统解决方案需要将服务部署到云服务器,但这既增加成本又降… · 2026/11/3 14:36:36
网络安全-Javascript基础 网络安全-Javascript基础一般简称JS,然后用于嵌套在网页中,给网页添加动态效果用的node凭条,开发服务器也是用js
后期会用到recat、vue框架。常见的前端
HTML(结构层) 利用语言去搭建网页
CSS(样式层)利用样式美化网页… · 2026/11/3 19:27:23
别再复制粘贴代码了!Python 函数从封装到递归、lambda,老哥一次讲透 写程序最忌讳的就是复制粘贴—— 同一段代码贴三遍,改起来要改三处,累不说还容易漏。Python 给出的答案是函数:把一段会重复用的代码 "封装" 起来,起个名字,想用就调用。一、为什么用函数print() 其实就是个… · 2026/11/3 19:27:23
AdMergeX 获信通院多项认可,市场部负责人受聘铸基计划技术专家 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 19:27:23
客户复购预测真的值得做吗?从业务目标、方案取舍到上线验收 上一篇《从一家小店看懂数仓与机器学习:先理业务,再串技术》,沿着小林的店,把交易、客户状态、数仓与预测连接了起来。
接下来还有一组更难的问题:这件事值得投入吗?普通规则是否已经够用?模型… · 2026/11/3 19:27:23
什么是Unlimited-OCR-2?OCR-3.0时代百度无限文档解析模型完整指南 人工智能计算机视觉OCR多模态大模型 【免费下载链接】Unlimited-OCR-2 项目地址: https://ai.gitcode.com/hf_mirrors/baidu/Unlimited-OCR-2 点击查看 免费下载 Unlimited-OCR-2 是百度开源的超长文档解析模型(OCR 模型),主打&q… · 2026/11/3 19:26:23
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46