CE内存调试实战:从游戏分数定位到工程化DMA分析
简介本资源是一份面向软件开发初学者与网络安全兴趣者的游戏外挂实践入门包聚焦Cheat EngineCE内存读写、进程调试及易语言外挂逻辑实现等核心技能解决从零理解游戏修改原理到动手编写简易外挂的实操断层问题。压缩包共3个文件HTML格式的操作指南页含CE流程图解与示例说明、.inscode配置文件用于CE工具环境初始化与快捷键预设、.gitignore标准模板适配后续代码扩展管理整体仅5KB轻量便携便于快速导入CE环境验证学习。已有199人下载学习适合在Windows平台开展魂斗罗、魔兽争霸等经典单机游戏的内存变量定位与数值篡改实验。读者可直接复用HTML中的分步操作逻辑、调用.inscode提升CE调试效率并结合文中推荐的成长路线图与SRC技术文籍延伸学习形成“工具使用—代码实现—安全认知”闭环实践路径。1. 游戏外挂制作与CE工具使用这不是“破解”而是内存调试能力的实战入口很多人看到“游戏外挂制作”第一反应是封号、法律风险、黑产联想——但如果你把标题里的“外挂制作”替换成“进程内存结构逆向分析”把“CE工具”理解为“跨平台通用内存扫描调试器”整件事就立刻回归到正经的软件工程基本功范畴。这个项目本质是一套面向Windows桌面应用的运行时内存观测与交互式调试训练方案核心目标不是绕过验证或篡改逻辑而是教会开发者如何在无源码、无符号、无文档的前提下定位关键数据结构如血量、金币、坐标、理解程序状态流转、验证自己对业务逻辑的假设。某高校系统安全实验课用它带学生拆解《扫雷》计时器内存布局某嵌入式团队用类似思路调试工控HMI界面卡顿问题甚至有UI自动化测试工程师靠这套方法快速定位Qt程序中未暴露的控件句柄地址。它适合三类人刚学完C/C想打通“代码→汇编→内存”链路的新人、做PC端兼容性测试需要快速定位崩溃现场的QA、以及从事逆向辅助开发如插件热加载、配置热更新的中阶工程师。注意本项目所有操作均在本地虚拟机中完成不连接任何在线服务不修改目标程序二进制文件不注入DLL不调用高危API——它只读内存、只显示地址、只做标记所有行为等价于一个高级版任务管理器。2. CE工具基础操作从启动扫描到定位动态地址的最小闭环CECheat Engine不是“外挂生成器”而是一个可视化内存调试前端。它的价值在于把WinDbg里要敲十几行命令才能完成的“搜索→反汇编→断点→观察寄存器”流程压缩成三次点击两次输入。我们以经典Demo《Tetris》俄罗斯方块为例演示如何找到当前分数值的内存地址——这是所有后续分析的起点。2.1 启动CE并附加目标进程的标准化流程首先确保你已下载CE官方最新稳定版v7.5安装时取消勾选所有第三方捆绑软件。启动后点击左上角“电脑图标”按钮Open process在进程列表中找到tetris.exe若未显示点击右下角“Show all processes”并勾选“Show processes from all users”。关键细节必须确认进程状态栏显示“Running”而非“Suspended”——后者会导致内存扫描结果失真。若目标进程被UAC保护CE会弹出权限提示此时需点击“Yes”并等待几秒直到右下角状态栏出现“Scanning finished: 0 addresses found”字样这是正常初始状态表示尚未开始搜索。# 验证进程是否被正确附加的命令行辅助方式非必需但可排错 tasklist /fi imagename eq tetris.exe /fo csv | findstr tetris提示CE默认以32位模式运行。若你的目标程序是64位如多数新游戏必须使用CE安装目录下的CheatEngine-x86_64.exe否则会报错“Access denied”或根本找不到进程。这个细节导致约40%的初学者首次失败——他们没意识到CE本身也有位数之分。2.2 四步定位法从模糊值到精确地址的完整推演分数值是典型的“动态变化整数”不能直接用固定值搜索。我们采用CE最可靠的四步定位法首次扫描输入当前分数选择“Exact value”“4 Bytes”假设当前分数为1250输入1250扫描类型选“Exact value”数值类型选“4 Bytes”32位整数点击“First Scan”。CE将遍历整个用户态内存空间约2GB返回数千个候选地址。此时不要慌——这是正常现象。二次筛选让分数变化后执行“Next Scan”在游戏中获得100分使分数变为1350回到CE输入1350点击“Next Scan”。候选地址锐减至几十个。重复此过程2-3次如再得50分→1400地址列表通常收敛到1-5个。地址验证双击候选地址添加到下方Address List右键→“Find out what writes to this address”这是最关键一步。当CE弹出“Select a thread”窗口时保持默认通常只有一个线程点击OK。此时立即在游戏中触发分数变化如消一行。CE会捕获写入该地址的汇编指令例如mov [esi0x14], eax这说明分数存储在esi寄存器所指基地址偏移0x14处且esi很可能指向玩家对象结构体。获取基址右键该指令→“Browse this memory region”→查看esi值在内存浏览窗口中记下esi寄存器当前值如0x12345000这就是玩家对象的动态基址。分数真实地址 0x12345000 0x14 0x12345014。将此地址添加到Address List并勾选“Pointer scan”选项为后续稳定性处理铺路。注意CE的“4 Bytes”类型对应C语言int32_t若搜索浮点数如坐标需选“Float”或“Double”若目标程序用64位整数存分数罕见但存在必须选“8 Bytes”。选错类型会导致零结果——这是新手第二高频翻车点。3. 动态地址稳定性攻坚指针扫描与偏移链构建上一节找到的0x12345014只是本次运行的临时地址。重启游戏后该地址大概率失效——因为操作系统每次加载进程时堆内存起始位置都会随机化ASLR。真正的工程级需求是无论游戏重启多少次都能通过同一套规则自动计算出分数地址。这依赖CE的指针扫描Pointer Scan功能本质是构建一条“从模块基址出发经多次偏移抵达目标”的稳定路径。3.1 指针扫描前的必要准备冻结关键模块加载CE的指针扫描要求目标地址在扫描期间保持“相对稳定”。但若游戏使用动态链接库DLL加载资源其基址可能在扫描中途变动。因此必须先锁定主模块在CE的Process List中右键tetris.exe→ “Properties” → 记录“Base Address”如0x400000确保游戏未启用全盘ASLR可通过dumpbin /headers tetris.exe | findstr dynamic验证若输出含“DYNAMICBASE”则需用editbin /dynamicbase:no tetris.exe临时关闭——仅用于学习环境提示生产环境绝不建议关闭ASLR此处仅为教学演示。实际工作中我们会扫描kernel32.dll等系统模块的导出函数地址作为锚点因其基址在同版本Windows中高度稳定。3.2 执行指针扫描并提取有效偏移链在Address List中右键已确认的分数地址 → “Pointer scan for this address”。弹窗中设置Maximum offset填1024覆盖常见结构体大小Scan mode选“Fast scan”平衡速度与精度Additional offsets to check留空初筛不加额外偏移点击OK后CE将遍历所有内存区域寻找能通过“基址偏移1偏移2...”抵达目标地址的指针链。扫描耗时约2-5分钟完成后得到数千条候选链。此时需人工筛选点击“Pointer scanner results”窗口右上角“Save”按钮保存为score_pointers.txt重启游戏重新附加CE再次执行分数定位步骤同2.2获得新地址如0x2a78b014在CE中点击“Pointer scanner results” → “Rescan memory” → 选择刚才保存的文件 → 输入新地址 → 点击“Rescan”经过二次筛选有效链通常剩3-5条。打开score_pointers.txt查找形如tetris.exe0x12340 - 0x14 - 0x0 - 0x14这表示从tetris.exe模块基址出发先加0x12340得到一级指针解引用后加0x14得二级指针再解引用加0x0即不变最后加0x14抵达分数。其中0x0偏移往往指向虚表或数组首地址是典型结构体特征。3.3 将偏移链转化为可编程调用的C代码有了稳定偏移链就能脱离CE实现自动化。以下为基于Windows API的最小可行代码需VS2019启用/EHsc异常处理#include windows.h #include iostream #include vector // 偏移链tetris.exe0x12340 - 0x14 - 0x0 - 0x14 std::vectorULONG_PTR offsets { 0x12340, 0x14, 0x0, 0x14 }; // 获取模块基址的通用函数 uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName) { uintptr_t modBaseAddr 0; HANDLE hSnap CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId); if (hSnap ! INVALID_HANDLE_VALUE) { MODULEENTRY32 modEntry; modEntry.dwSize sizeof(modEntry); if (Module32First(hSnap, modEntry)) { do { if (!_wcsicmp(modEntry.szModule, modName)) { modBaseAddr (uintptr_t)modEntry.modBaseAddr; break; } } while (Module32Next(hSnap, modEntry)); } } CloseHandle(hSnap); return modBaseAddr; } // 根据偏移链计算最终地址 uintptr_t FindDMAAddress(HANDLE hProc, uintptr_t ptr, std::vectorULONG_PTR offsets) { uintptr_t addr ptr; for (unsigned int i 0; i offsets.size(); i) { ReadProcessMemory(hProc, (LPCVOID)addr, addr, sizeof(addr), 0); addr offsets[i]; } return addr; } int main() { DWORD procId 0; // 通过进程名获取PID实际项目中应增加重试逻辑 HANDLE hSnap CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 procEntry; procEntry.dwSize sizeof(procEntry); if (Process32First(hSnap, procEntry)) { do { if (!_wcsicmp(procEntry.szExeFile, Ltetris.exe)) { procId procEntry.th32ProcessID; break; } } while (Process32Next(hSnap, procEntry)); } CloseHandle(hSnap); HANDLE hProc OpenProcess(PROCESS_ALL_ACCESS, FALSE, procId); if (!hProc) { std::cout 无法打开进程\n; return -1; } uintptr_t moduleBase GetModuleBaseAddress(procId, Ltetris.exe); uintptr_t scoreAddr FindDMAAddress(hProc, moduleBase, offsets); int score 0; ReadProcessMemory(hProc, (LPCVOID)scoreAddr, score, sizeof(score), 0); std::cout 当前分数: score \n; // 输出当前分数: 1400 CloseHandle(hProc); return 0; }代码关键点说明GetModuleBaseAddress使用CreateToolhelp32Snapshot枚举模块比硬编码基址更鲁棒FindDMAAddress循环执行“读取指针值→加偏移”完美复现CE的指针扫描逻辑ReadProcessMemory的第三个参数是score变量地址第四个是sizeof(score)4字节顺序错误会导致读取垃圾值实际部署时需用VirtualProtectEx临时修改目标内存页属性若目标区域为PAGE_READONLY但本例中分数通常位于可读写数据段故省略。4. 常见问题排查CE使用中5个真实踩坑记录CE的学习曲线陡峭大量时间消耗在“为什么搜不到”“为什么地址变了”“为什么读出来是0”。以下是我在带某实验室学生实操时统计出的最高频5个问题每条都附带现场截图级复现步骤和根因分析。4.1 现象首次扫描返回0个地址状态栏显示“Scanning finished: 0 addresses found”原因目标进程未以调试权限运行或CE自身未以管理员身份启动。Windows Vista默认阻止低权限进程读取高权限进程内存。即使目标程序是普通用户启动若其父进程如终端有更高权限也会触发保护。解决右键CE快捷方式 → “以管理员身份运行”然后重新附加进程。验证方法在CE的“Process List”中目标进程右侧应显示“Debug Privilege: Yes”而非“No”。4.2 现象分数值搜索成功但尝试修改时提示“Cannot write to this address”原因该地址位于只读内存页PAGE_READONLY。常见于字符串常量区或代码段但某些游戏会把数值存放在.rdata节只读数据节以增加分析难度。解决在CE中右键该地址 → “Change record” → 取消勾选“Write only” → 勾选“Enable writing” → 点击OK。CE会自动调用VirtualProtectEx修改内存页属性。若仍失败说明该地址受硬件写保护如SMAP此时需改用其他偏移链或接受只读。4.3 现象指针扫描结果在重启游戏后全部失效Rescan返回0条匹配原因扫描时未关闭ASLR或目标模块如tetris.exe本身启用了DYNAMICBASE。每次加载基址变动超过Maximum offset设定范围导致偏移链断裂。解决用dumpbin /headers tetris.exe检查若含DYNAMICBASE用editbin /dynamicbase:no tetris.exe关闭仅限学习若无法修改原文件则改用系统DLL如user32.dll作为基址锚点因其基址在同版本Windows中极稳定。4.4 现象在Address List中添加了指针地址但值始终显示“???”原因该地址未被正确解析为指针。CE中只有明确标记为“Pointer”的地址才会自动解引用显示最终值。普通地址即使内容是指针只会显示其存储的数值。解决右键该地址 → “Change record” → 在“Type”下拉框中选择“4 Bytes Pointer”32位或“8 Bytes Pointer”64位然后在“Address”栏手动输入基址如tetris.exe0x12340CE将自动计算并显示解引用后的值。4.5 现象使用ReadProcessMemory读取到的值与CE显示值不一致如CE显示1400代码读出-123456789原因数据类型不匹配。CE默认按“4 Bytes Signed”解释内存而C中int是带符号32位但若游戏用无符号整数存储负数会被错误解释。解决在CE中右键该地址 → “Change record” → 将“Type”改为“4 Bytes Unsigned”对比显示值代码中改用unsigned int score接收并用printf(%u, score)输出。类型错配是内存调试中最隐蔽的玄学问题——值没错只是你看错了。5. 从CE到工程化构建可复用的内存分析工作流与防误用设计做到上一节的C代码你已经具备了独立分析任意Windows桌面程序的能力。但真实项目远不止“读一个分数”——某跨平台系统需要监控30个关键状态变量某图像处理Demo需实时捕获GPU显存映射地址这些场景要求将CE的交互式探索沉淀为可版本控制、可协作、可审计的工程化工作流。我在此分享经过3个模拟项目X验证的落地方法。5.1 结构化配置驱动用JSON定义扫描策略替代硬编码偏移把偏移链、模块名、数据类型等信息从代码中剥离存为analysis_config.json{ target_process: tetris.exe, base_module: tetris.exe, pointers: [ { name: player_score, offsets: [47488, 20, 0, 20], data_type: uint32, description: 玩家当前分数位于玩家对象结构体偏移0x14 }, { name: game_speed, offsets: [47488, 20, 0, 28], data_type: float, description: 游戏当前下落速度单位格/秒 } ] }配套Python解析脚本scanner.py可自动生成C头文件、生成CE脚本、甚至输出Mermaid流程图。这样当游戏更新导致偏移变化时只需修改JSON无需碰C代码——配置即文档文档即代码。5.2 安全边界设计在工具链中内置防误用熔断机制所有内存读写操作必须经过统一网关。我们在MemoryScanner类中强制加入三重校验class MemoryScanner { private: static bool IsAddressInRange(uintptr_t addr, size_t size) { // 熔断1禁止访问内核地址Windows用户态上限为0x7FFFFFFF if (addr 0x7FFFFFFF) return false; // 熔断2禁止访问CE常用调试区避免误读CE自身内存 if (addr 0x10000000 addr 0x1FFFFFFF) return false; // 熔断3限制单次读取长度防超长数组越界 if (size 1024) return false; return true; } public: templatetypename T bool Read(uintptr_t addr, T* out) { if (!IsAddressInRange(addr, sizeof(T))) { LogError(非法地址访问: 0x%llx, addr); return false; } SIZE_T bytesRead; bool success ReadProcessMemory(hProc, (LPCVOID)addr, out, sizeof(T), bytesRead); if (!success || bytesRead ! sizeof(T)) { LogError(读取失败地址: 0x%llx, 错误码: %d, addr, GetLastError()); return false; } return true; } };这些熔断不是过度设计。在某次模拟项目X中一位实习生误将player_score的偏移0x14写成0x140导致读取到相邻的纹理句柄地址程序崩溃并触发蓝屏——因为错误地址落在了显存映射区。熔断机制让问题在开发阶段就暴露为日志警告而非线上事故。5.3 验证闭环用CE脚本自动比对分析结果为确保JSON配置的准确性编写CE Lua脚本validate_config.lua在CE中一键运行-- 加载配置伪代码实际用CE的readMemString config loadJSON(analysis_config.json) for _, ptr in ipairs(config.pointers) do local addr getModuleBaseAddress(config.base_module) for _, offset in ipairs(ptr.offsets) do addr readInteger(addr) offset end local ce_value readInteger(addr) local cpp_value getCppResult(ptr.name) -- 调用外部C程序获取值 if ce_value ~ cpp_value then print(❌ 不一致: .. ptr.name .. CE .. ce_value .. C .. cpp_value) showError(配置错误请检查偏移链) else print(✅ 一致: .. ptr.name .. .. ce_value) end end每次配置变更后运行此脚本即可100%确认C实现与CE分析结果一致。这种“人机双向验证”机制让我们的分析准确率从82%提升到99.7%且所有差异都能在5分钟内定位到具体偏移项。我坚持在每个新项目启动时先花半天时间搭建这个验证闭环——它看起来慢但能避免后续三天的无效调试。当CE从“玩具”变成“可信的分析仪表盘”你才真正拿到了打开任意Windows程序内存黑匣子的钥匙。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

跨境电商怎么做才能长期做下去?优先维护账号稳定

跨境电商怎么做才能长期做下去?优先维护账号稳定

跨境电商怎么做才能长期做下去,先换个角度想:不是怎么跑得更快,而是怎么不被打断。账号稳、节奏稳、人不散,这三件事比爆单更能决定一家店能开多久。 下面按账号稳定、扩张节奏、团队沉淀三块讲清楚。 一、跨境电商怎么做才能长期…

2026/10/14 12:37:44 阅读更多 →
PyTorch模块化神经网络设计与实践指南

PyTorch模块化神经网络设计与实践指南

1. 模块化神经网络的设计哲学在深度学习领域,模块化设计早已从软件工程的最佳实践演变为神经网络架构的核心方法论。PyTorch的nn模块API之所以能成为行业标准,正是因为它完美诠释了"组合优于继承"的设计理念。我至今记得2017年第一次用nn.Sequ…

2026/10/14 12:37:44 阅读更多 →
数据库物理模型设计实战:从字段类型到索引优化的完整指南

数据库物理模型设计实战:从字段类型到索引优化的完整指南

简介:数据库物理模型设计是数据库设计流程中承上启下的关键环节,关注逻辑模型如何在真实存储系统中落地,以实现性能、存储效率和数据管理的最优平衡。这份docx文档面向数据库设计师、开发人员及建模初学者,围绕通用设计模式展开论…

2026/10/14 12:36:41 阅读更多 →

最新新闻

fabric.js绘制直线:从基础到进阶实战

fabric.js绘制直线:从基础到进阶实战

1. 项目概述在Web前端开发中,Canvas绘图是一个非常重要的技能点。而fabric.js作为一款强大的Canvas库,能够大大简化我们操作Canvas的过程。今天我们就来聊聊如何使用fabric.js在画布上添加最基本的图形元素——直线。作为一个长期使用fabric.js的开发者&…

2026/10/14 13:32:31 阅读更多 →
阿里云部署Qwen-Image-2.1云端适配实战指南

阿里云部署Qwen-Image-2.1云端适配实战指南

1. 为什么“云端部署Qwen-Image-2.1”不是一句空话,而是必须重新定义的工程实践 你搜到这篇教程时,大概率正卡在三个地方:一是本地显存不够跑不动7B参数量的多模态模型,二是反复尝试Docker Compose拉镜像失败后看到报错 failed t…

2026/10/14 13:32:31 阅读更多 →
PyTorch显存泄漏定位与修复实战指南

PyTorch显存泄漏定位与修复实战指南

1. 这不是显存不够,是显存正在“悄悄逃跑”——为什么训练越跑显存越高?你有没有遇到过这样的场景:模型刚启动时,nvidia-smi 显示显存占用 3.2GB,一切正常;跑完第10个batch,涨到 4.1GB&#xff…

2026/10/14 13:32:31 阅读更多 →
Aspose.Words 文档自动化实战:模板填充、表格与性能优化

Aspose.Words 文档自动化实战:模板填充、表格与性能优化

1. 为什么文档自动化绕不开 Aspose.Words做过企业级系统开发的人都有一个共识:文档处理是最容易被低估的脏活累活。尤其是 Word 文档,业务部门的需求永远在变——今天要批量生成合同,明天要把数据库里的报表导出成带页眉页脚的正式文件&#…

2026/10/14 13:32:31 阅读更多 →
OpenClaw自动化框架:零代码构建工作流的实战指南

OpenClaw自动化框架:零代码构建工作流的实战指南

1. 项目背景与核心价值2026年的OpenClaw(Clawdbot)正在重新定义自动化工作流程的标准。这个开源机器人框架的最新迭代版本,通过模块化技能包(Skills)的即插即用特性,让非技术人员也能快速构建复杂的自动化任…

2026/10/14 13:32:31 阅读更多 →
家电品牌出海GEO优化公司推荐:家电品牌如何判断服务商实力

家电品牌出海GEO优化公司推荐:家电品牌如何判断服务商实力

家电品牌做 GEO,首先要解决的是信息能否被 AI 讲对。型号、容量、认证、安装和售后等内容,都需要按目标市场整理,并通过持续监测验证实际呈现。 家电品牌在评估广拓时代CantoTimes时,可以重点看其自研系统、产品资料整理、海外内容…

2026/10/14 13:31:30 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →