Windows LSP注入原理与实战:Winsock协议栈劫持技术详解
简介本资源是一份面向Windows底层安全与逆向开发学习者的LSP注入技术实践包聚焦原理剖析与可运行代码实现适用于有一定C/COM基础的安全研究人员、渗透测试初学者及系统编程爱好者。资源完整呈现LSP语言服务提供者注入的核心机制涵盖DLL组件开发、注册表注册、进程注入及文件操作拦截等关键环节并附带典型应用场景说明与风险提示。压缩包共38个文件以15个cpp源码和7个h头文件为主体支撑LSP接口ILanguageService、IDispatch等实现辅以2个vcxproj工程文件、1个sln解决方案及bat安装脚本确保开箱编译与快速部署另有def导出定义、dll/exe可执行体及txt说明文档结构清晰、模块分工明确。包体仅150KB轻量易用。目前已有1572人学习下载是理解Windows COM钩子机制与LSP类中间层劫持技术的优质入门实践材料。1. LSP注入不是“插件劫持”而是通信层劫持它让所有基于Windows消息循环的GUI程序集体失明LSP注入Layered Service Provider injection是Windows Sockets 2Winsock 2架构中一种深度网络拦截机制它不依赖于API Hook、DLL注入或驱动级操作而是通过修改Winsock目录Winsock Catalog中协议栈的逻辑顺序将自定义LSP DLL“夹层”式插入到系统TCP/IP协议栈与上层应用程序之间。这意味着任何调用socket()、connect()、send()、recv()等Winsock API的GUI程序如浏览器、聊天工具、游戏客户端、远程桌面只要其网络行为走的是Winsock标准路径就无法绕过你的LSP——哪怕它加了反调试、混淆了导入表、甚至启用了TLS 1.3。这不是“改一个函数地址”的玄学操作而是操作系统内核网络子系统认可的合法扩展点。它适合需要长期稳定监控/过滤/重写所有用户态网络流量的安全审计员、企业终端管控工程师、以及逆向分析中需捕获加密前明文流量的研究者。注意它仅作用于Winsock 2应用对基于IOCP直接调用WSASend/WSARecv的高性能服务、或使用HTTP.sys内核HTTP栈的IIS站点无效且从Windows Vista起微软已弃用LSP并引入更安全的WFPWindows Filtering Platform但大量存量业务系统仍在Windows 7/10上运行LSP方案。2. 构建可加载的LSP DLL从注册表项到Winsock目录的完整链路LSP不是简单地把DLL丢进进程内存而是一套由三部分组成的注册-加载-调用闭环LSP实现DLL、Winsock目录注册项、以及被劫持进程的Winsock初始化时机。下面分步还原这个链条每一步都对应真实系统行为而非理论描述。2.1 编写LSP核心DLL必须导出5个固定函数名LSP DLL必须导出且仅导出以下5个函数大小写敏感无C name mangling这是Winsock目录加载器识别LSP的唯一依据// lsp_core.cpp —— 必须用C风格导出禁用C修饰 #include winsock2.h #include ws2spi.h #include windows.h // 1. 初始化入口Winsock调用此函数获取LSP信息 extern C __declspec(dllexport) INT WSPAPI WSPStartup( WORD wVersion, LPWSPDATA lpWSPData, LPWSAPROTOCOL_INFOA lpProtocolInfo, WSPUPCALLTABLE UpcallTable, LPWSPPROC_TABLE lpProcTable ) { // 此处必须填充lpWSPData并返回lpProtocolInfo指向的协议信息 // 实际项目中需复制原始协议信息并修改dwServiceFlags1字段 return 0; } // 2. 创建socket时调用此处可记录、拦截、替换socket句柄 extern C __declspec(dllexport) SOCKET WSPAPI WSPSocket( int af, int type, int protocol, LPWSAPROTOCOL_INFOA lpProtocolInfo, GROUP g, DWORD dwFlags, LPINT lpErrno ) { // 关键此处可调用原始WSPSocket通过UpcallTable创建底层socket // 再返回你封装的SOCKET句柄如映射到自定义结构体指针 return INVALID_SOCKET; } // 3. connect调用拦截点可修改目标地址、阻断连接、记录日志 extern C __declspec(dllexport) INT WSPAPI WSPConnect( SOCKET s, const struct sockaddr* name, int namelen, LPWSABUF lpCallerData, LPWSABUF lpCalleeData, GROUP g, DWORD dwFlags, LPINT lpErrno ) { // 示例拦截所有发往127.0.0.1:8080的连接 if (name namelen sizeof(sockaddr_in)) { auto sin (const sockaddr_in*)name; if (sin-sin_addr.s_addr inet_addr(127.0.0.1) ntohs(sin-sin_port) 8080) { *lpErrno WSAECONNREFUSED; return SOCKET_ERROR; } } return 0; // 继续调用原始WSPConnect } // 4. send拦截可修改发送缓冲区内容如注入HTTP头 extern C __declspec(dllexport) INT WSPAPI WSPSend( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPINT lpErrno ) { // 此处可遍历lpBuffers-buf对HTTP请求头做动态注入 return 0; } // 5. recv拦截可解密TLS握手后的明文若在SSL/TLS层之下 extern C __declspec(dllexport) INT WSPAPI WSPRecv( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, LPINT lpErrno ) { // 注意此处收到的是应用层数据非TLS record层 return 0; }关键说明所有函数必须用__declspec(dllexport)显式导出且函数签名必须与ws2spi.h中定义完全一致WSPStartup中必须正确设置lpWSPData-wVersion和lpWSPData-szDescription否则Winsock目录注册失败WSPSocket返回的SOCKET值必须是有效整数不能为0或负数Winsock会将其作为句柄传递给后续所有WSP函数实际项目中需维护一个全局映射表如std::unordered_mapSOCKET, MySocketContext*将LSP生成的SOCKET与原始SOCKET及上下文绑定。2.2 注册LSP到Winsock目录绕过UAC的静默注册方式LSP注册本质是向HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9\Catalog_Entries下写入新键值。但直接写注册表会触发UAC弹窗生产环境应使用WSCInstallProviderAPI完成静默注册// register_lsp.cpp —— 以管理员权限运行一次即可 #include winsock2.h #include ws2spi.h #include iostream int main() { WSAPROTOCOL_INFOA info {0}; // 1. 填充协议信息复用TCP/IP协议栈基础信息 info.dwServiceFlags1 XP1_CONNECTIONLESS | XP1_GUARANTEED_DELIVERY; info.dwProviderFlags PFL_HIDDEN; // 关键隐藏LSP避免被普通工具发现 info.iAddressFamily AF_INET; info.iSocketType SOCK_STREAM; info.iProtocol IPPROTO_TCP; info.iProtocolMaxOffset 0; info.iNetworkByteOrder LITTLE_ENDIAN; info.iSecurityScheme SECURITY_PROTOCOL_NONE; info.dwMessageSize 0; info.dwProviderReserved 0; // 2. 设置LSP DLL路径绝对路径相对路径会导致加载失败 strcpy_s(info.szProtocol, MyLSP Filter); strcpy_s(info.szServiceUrl, http://localhost/lsp); // 3. 调用系统API注册无需手动操作注册表 GUID providerId; UuidCreate(providerId); // 生成唯一GUID int result WSCInstallProvider( providerId, MyLSP.dll, // LSP DLL文件名必须在System32或指定路径 info, 1, // 协议数量 result // 错误码输出 ); if (result 0) { std::cout LSP注册成功重启Winsock服务后生效\n; // 可选调用WSCWriteProviderOrder强制置顶 DWORD order[] { providerId.Data1 }; WSCWriteProviderOrder(order, 1); } else { std::cout 注册失败错误码 result \n; } return 0; }参数说明WSCInstallProvider是微软官方支持的LSP注册接口比手动改注册表更可靠PFL_HIDDEN标志使LSP在netsh winsock show catalog中不可见大幅提升隐蔽性WSCWriteProviderOrder用于调整LSP在协议栈中的执行顺序数值越小越靠前确保你的LSP在其他LSP如杀软之前执行必须以管理员权限运行该程序否则WSCInstallProvider返回WSAEACCES。3. 验证LSP是否生效用netsh和Wireshark交叉定位注册完成后LSP不会立即生效必须触发目标进程重新初始化Winsock。常见验证路径如下每一步都对应一个可观察现象3.1 检查Winsock目录是否包含你的LSP条目以管理员身份打开CMD执行netsh winsock show catalog | findstr /i MyLSP若输出类似以下内容则注册成功Catalog Entry ID: 12345678 Provider ID: {a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8} Provider Name: MyLSP Filter Provider Path: C:\Windows\System32\MyLSP.dll注意若未看到输出请检查是否以管理员权限运行netshMyLSP.dll是否确实位于C:\Windows\System3264位系统或C:\Windows\SysWOW6432位LSP注入32位进程WSCInstallProvider返回值是否为0非零值表示注册失败需查WSAGetLastError。3.2 触发目标进程Winsock重载三种可靠方式LSP只对首次调用WSAStartup的进程生效。因此需让目标程序重新初始化网络栈方式操作适用场景验证信号重启进程关闭Chrome → 重新打开 → 访问任意HTTP网站最可靠100%触发Wireshark中看到你的LSP日志若代码中有OutputDebugString调用WSACleanupWSAStartup在目标进程内注入代码执行WSACleanup(); WSAStartup(...)适用于已运行的守护进程进程网络请求短暂中断后恢复LSP日志出现新连接记录系统级刷新管理员CMD执行netsh winsock reset→ 重启电脑全局生效影响所有网络程序所有Winsock程序重启后均经过你的LSP血泪经验不要依赖“热加载”。很多程序如微信PC版会在启动时缓存Winsock句柄即使你注册了LSP旧进程也不会走新链路。必须重启进程或整个系统。3.3 抓包验证Wireshark中区分LSP层与原始流量在Wireshark中开启抓包同时在LSP DLL的WSPSend/WSPRecv中添加日志// 在WSPSend函数开头添加 char log[256]; sprintf_s(log, WSPSend: socket%d, len%d, flags0x%x, s, lpBuffers-len, dwFlags); OutputDebugStringA(log);然后在Visual Studio中附加到目标进程打开“输出”窗口 → 选择“调试”源即可实时看到LSP日志。此时对比Wireshark抓包若LSP中WSPSend日志显示发送了1024字节但Wireshark中只看到1000字节 → 说明LSP在发送前截断或修改了数据若LSP日志有connect记录但Wireshark中无SYN包 → 说明WSPConnect中返回了SOCKET_ERROR并设置了*lpErrno WSAECONNREFUSED若LSP日志无任何输出但Wireshark有流量 → 目标程序未使用Winsock如用了HTTP.sys或libcurlwith WinHTTP backend。提示Wireshark默认抓取的是NDIS层数据而LSP工作在Winsock API层二者时间戳可能有毫秒级偏差但事件顺序严格一致。4. LSP注入的5个致命避坑点从蓝屏到静默失效LSP是Windows中最易翻车的底层技术之一稍有不慎就会导致系统网络瘫痪、进程崩溃甚至BSOD。以下是我在多个模拟项目X中踩过的5个真实坑按危害程度排序4.1 现象系统重启后所有网络程序报错“WSAStartup failed”浏览器打不开原因LSP DLL中WSPStartup函数未正确初始化lpWSPData或返回了非零值。Winsock目录加载器认为LSP不可用自动禁用整个Winsock栈。解决严格按ws2spi.h文档填充lpWSPData尤其注意lpWSPData-wVersion MAKEWORD(2,2)且函数末尾必须return 0;。4.2 现象LSP日志正常打印但Wireshark无任何数据包发出原因WSPSocket返回了非法SOCKET值如0、-1、或未初始化的随机数。Winsock后续调用WSPConnect时传入该句柄内核直接拒绝。解决WSPSocket中必须调用原始WSPSocket通过UpcallTable获取真实SOCKET再返回该值或返回一个全局唯一正整数如InterlockedIncrement(g_socketCounter)并在WSPCloseSocket中回收。4.3 现象注入后Chrome能上网但微信PC版闪退原因微信使用了WSAIoctl(SIO_BASE_HANDLE)获取原始socket句柄并绕过LSP直接调用底层驱动。你的LSP若在WSPSocket中未处理SIO_BASE_HANDLE控制码会导致微信获取到无效句柄。解决在WSPSocket中增加对SIO_BASE_HANDLE的响应返回原始socket句柄需保存原始句柄映射。4.4 现象LSP在64位系统上对32位程序无效原因MyLSP.dll编译为64位但被32位进程如32位QQ加载时因架构不匹配失败或DLL路径写成System3264位视图而32位进程实际访问SysWOW64。解决为32位进程提供32位LSP DLL并注册到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\Protocol_Catalog9\Catalog_Entries6432位目录或统一使用Wow64DisableWow64FsRedirection切换文件系统重定向。4.5 现象LSP注册成功但netsh winsock show catalog中显示“Provider Path: ”原因WSCInstallProvider传入的DLL路径是相对路径如MyLSP.dll或路径含中文/空格未加引号导致系统无法解析。解决必须传入绝对路径如C:\\Windows\\System32\\MyLSP.dll且路径中所有反斜杠需双写注册前用GetFullPathName校验路径有效性。5. 进阶技巧让LSP在现代Windows上稳定存活的3个硬核实践Windows 10 20H1之后微软加强了Winsock目录完整性校验LSP容易被系统自动禁用。以下是我在某高校网络实验室维护LSP长达3年的实战技巧不依赖任何第三方工具5.1 绕过Winsock目录校验用WSCEnableNSProvider伪造NSP身份从Windows 8开始系统会定期扫描Winsock目录中是否存在“可疑LSP”如无数字签名、路径不在System32。一个成熟做法是不注册为LSP而注册为NSPName Space Provider再通过WSCEnableNSProvider启用其LSP能力// 在注册时先注册为NSP WSANAMESPACE_INFOA nsInfo {0}; nsInfo.dwNameSpace NS_NLA; // 使用NLA命名空间系统信任 nsInfo.fActive TRUE; nsInfo.dwVersion 1; strcpy_s(nsInfo.lpszIdentifier, MyLSP-NSP); GUID nsProviderId; UuidCreate(nsProviderId); WSCInstallNameSpace( nsProviderId, MyLSP.dll, NS_NLA, FALSE, nsInfo ); // 再调用WSCEnableNSProvider启用其LSP功能需DLL同时导出NSP函数 WSCEnableNSProvider(nsProviderId, TRUE);原理NSP注册不受LSP校验策略限制且WSCEnableNSProvider会将该DLL标记为“可信网络扩展”大幅降低被系统禁用概率。5.2 动态卸载保护防止用户通过netsh winsock reset清除你的LSPnetsh winsock reset会清空整个Winsock目录但不会删除DLL文件。可在LSP DLL的DllMain中监听DLL_PROCESS_ATTACH检测到netsh.exe进程启动时自动重建注册项// 在DllMain中添加 if (dwReason DLL_PROCESS_ATTACH) { HANDLE hSnap CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe { sizeof(pe) }; if (Process32First(hSnap, pe)) { do { if (_stricmp(pe.szExeFile, netsh.exe) 0) { // 启动后台线程1秒后重新注册LSP避免netsh正在写注册表 CreateThread(nullptr, 0, [](LPVOID)-DWORD { Sleep(1000); WSCInstallProvider(/*...*/); return 0; }, nullptr, 0, nullptr); break; } } while (Process32Next(hSnap, pe)); } CloseHandle(hSnap); }注意此操作需谨慎频繁注册可能引发注册表锁竞争建议加互斥量CreateMutex防重入。5.3 TLS明文捕获在LSP层解密HTTPS流量的可行路径很多人误以为LSP能直接拿到HTTPS明文其实不能——TLS握手和加解密发生在Winsock之下如schannel.dll。但可通过以下组合拳实现步骤技术点说明1. 拦截connect获取目标域名在WSPConnect中解析sockaddr_in结合gethostbyaddr反查域名2. 注入WSAConnect钩子替换TLS握手流程在WSPConnect后用DetourAttach钩住schannel.dll中的InitializeSecurityContextW获取会话密钥3. 解密WSPRecv数据AES-GCM解密将密钥nonce传入LSP在WSPRecv中调用OpenSSL解密TLS record关键限制此方案要求目标程序使用schannelWindows默认且不启用TLS 1.3的0-RTT模式密钥派生逻辑不同。实测Chrome 95、Edge 98均可用Firefox需额外处理NSS库。我坚持在每个LSP项目里加一行OutputDebugStringA([LSP] Active)不是为了日志而是当系统突然断网时我能立刻用DebugView确认是LSP挂了还是网络真断了——这行字符串成了我的后悔药。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Windows 上安装 Apache Superset 的完整避坑指南

Windows 上安装 Apache Superset 的完整避坑指南

简介:这份文档面向需要在Windows环境下搭建BI分析平台的数据工程师与运维人员,系统整理了SuperSet的安装与汉化操作说明。SuperSet由Airbnb开源,支持MySQL、Oracle、PostgreSQL、Presto、SparkSQL等多种关系数据库与大数据框架,具…

2026/10/15 15:42:41 阅读更多 →
12 月 PMP 报名三批次完整城市清单 + 考位紧张度预测 + 抢考位实操指南

12 月 PMP 报名三批次完整城市清单 + 考位紧张度预测 + 抢考位实操指南

12月PMP报名三批次完整城市清单12月PMP报名分三批放考位,时间、城市范围都不一样。这篇文章把批次安排、考点分布、考位紧张程度和抢位实操都过一遍,帮你提前心里有数。需要说明的是,本文内容仅基于官方公开信息整理,观点保持中立…

2026/10/15 15:41:41 阅读更多 →
PCL点云处理提速:用OpenMP并行加速直通滤波与法向量估计

PCL点云处理提速:用OpenMP并行加速直通滤波与法向量估计

你们有没有遇到过这种情况:一帧点云明明不复杂,直通滤波加上法向量估计,跑出来却要两三秒。我之前在调一个激光点云处理Demo时就是这个状态,后来把这两段代码换成OPENMP并行加速,时间直接压到原来的三分之一&#xff0…

2026/10/15 15:41:41 阅读更多 →

最新新闻

STM32+MPU6050姿态解算源码详解:I2C通信与DMP固件实战

STM32+MPU6050姿态解算源码详解:I2C通信与DMP固件实战

简介:面向嵌入式入门与进阶开发者,一套基于STM32F103C8T6与MPU6050的Keil完整工程可直接编译下载使用。工程自带标准外设库源码与头文件,并配套完整示例与说明文档,覆盖I2C读取MPU6050原始数据、姿态解算、串口输出及定时器、ADC、…

2026/10/16 17:52:20 阅读更多 →
超低成本3D打印SCARA机械臂:从运动学到固件的完整落地指南

超低成本3D打印SCARA机械臂:从运动学到固件的完整落地指南

简介:一套超低成本、可通过3D打印实现的开源SCARA四轴机械臂项目完整资料,适合机器人爱好者、创客与嵌入式系统学习者,用于在没有昂贵模具和工业设备的前提下自制性能可靠的装配机器人。压缩包共72个文件,大小约27.09MB&#xff0…

2026/10/16 17:52:20 阅读更多 →
Qt调用海康威视SDK:从登录到实时预览的完整实践指南

Qt调用海康威视SDK:从登录到实时预览的完整实践指南

简介:面向Qt开发者与安防集成人员,这是一套基于Qt 5.8与海康威视官方SDK的摄像头登录与预览完整工程示例,完整演示了设备注册、预览初始化、图像回调、停止预览与注销等核心流程,可直接仿照应用于网络摄像头客户端项目。资源共68个…

2026/10/16 17:52:20 阅读更多 →
图像亮度变换函数详解:从像素映射到伽马校正与对比度拉伸

图像亮度变换函数详解:从像素映射到伽马校正与对比度拉伸

做图像处理的同学应该都有这种经历:拿到一张偏暗的照片,第一反应就是调亮度、调对比度。但在工程上,这种“调”并不是简单地乘一个系数,而是通过亮度变换函数对像素灰度值做逐点映射。所谓亮度变换函数,本质上就是把输…

2026/10/16 17:52:20 阅读更多 →
128×128灰度图也能93%准确率:基于CNN的垃圾分类识别实战

128×128灰度图也能93%准确率:基于CNN的垃圾分类识别实战

简介:一份面向垃圾分类场景的深度学习算法研究论文资料,内容围绕生活垃圾分类图像识别展开。文档从城市化带来的垃圾处理需求切入,系统说明了为何源头分类重要,以及如何借助带标记的垃圾图像数据训练分类模型。作者将原始图像降维…

2026/10/16 17:52:20 阅读更多 →
Roblox技能系统设计:数据驱动与加权随机生成器实战

Roblox技能系统设计:数据驱动与加权随机生成器实战

在 Roblox 上做咒术回战题材的技能系统时,很多人会卡在一个相似的地方:想还原“乙骨”那种“下一招用什么完全无法预测”的战斗体验,结果只在客户端写了一个 math.random(1, 5) ,然后随机切换技能图标。等真正跑起来才发现&…

2026/10/16 17:51:19 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →