news 2026/10/12 6:24:59

dnSpy 6.1.3 + .NET Framework 4.7.2 逆向调试实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
dnSpy 6.1.3 + .NET Framework 4.7.2 逆向调试实战指南

简介:dnSpy-6.1.3-net472.zip 是一款面向.NET开发者与逆向分析人员的开源集成调试与反编译工具包,专为Windows平台设计,解决.NET程序动态调试、IL代码逆向还原及二进制级修改等核心需求。资源包大小22.37MB,含x64/x86双架构可执行文件(dnSpy.exe与dnSpy.x86.exe)、控制台版本(dnSpy.Console.exe)、配置文件(.config)、调试符号(.pdb)及版本说明文档(readmev6.1.3.txt),覆盖启动、配置、调试、反编译与底层编辑全流程。已有1514人学习下载,适用于中高级开发者进行第三方库学习、漏洞分析、兼容性调试或混淆代码逆向。用户可直接运行即用,无需安装;通过内置IL→C#反编译器快速还原可读源码,结合可视化断点调试与十六进制编辑能力,实现从静态分析到动态验证的一体化操作,显著提升.NET程序诊断与修复效率。

1. dnSpy 是什么?它不是反编译器,而是 .NET 程序的“手术台”:6.1.3 + net472 组合为什么至今仍是逆向调试的黄金搭档?

你手头有个 .NET Framework 编写的旧版桌面程序(比如某工业控制客户端、某财务插件、某内网 OA 辅助工具),它运行卡顿、报错模糊、日志不全,但源码早已丢失,供应商也不再维护。这时候,你不是要“扒出源码发到 GitHub”,而是想立刻定位到某次点击后崩溃的具体 IL 指令、修改一个硬编码的超时值、绕过某段校验逻辑验证修复效果——dnSpy 就是干这个的。它不是单纯的反编译器(像 ILSpy 那样只看不改),而是一个集成反编译、调试、实时编辑、重编译、热重载于一体的 .NET 逆向开发环境。6.1.3 版本是 dnSpy 最后一个稳定支持 .NET Framework 全栈调试(含 WinForms/WPF/COM 互操作)的版本;net472 则是它运行所依赖的宿主框架——不是目标程序必须用 net472,而是dnSpy 自身需要在 .NET Framework 4.7.2 运行时下才能完整加载调试器引擎、符号解析器和 JIT 调试钩子。很多用户翻车就栽在这点上:下载了最新版 dnSpy(已转向 .NET Core/.NET 5+),结果双击打开老程序直接报“无法附加到进程”或“调试器未就绪”。所以,当你搜“dnspy使用教程”,真正要找的不是泛泛而谈的界面介绍,而是:如何用 6.1.3 + net472 这个组合,在 Windows 10/11 上对一个没有 PDB 的 .NET Framework 4.x 程序,完成从加载、断点、修改到保存生效的闭环操作。本文就是按这个真实工作流写的血泪复现笔记。


2. 下载、安装与环境准备:为什么必须手动确认 net472 已就绪,而不是靠系统自动补?

dnSpy-6.1.3-net472.zip 这个文件名本身就是一个强提示:它不是一个安装包,而是一个绿色免安装的压缩包,解压即用——但前提是你的系统已具备 .NET Framework 4.7.2 运行时。很多人跳过这步直接解压双击,结果弹窗报错“未能加载文件或程序集 'System.Windows.Forms, Version=4.0.0.0...'”,本质是 dnSpy 的 UI 层(基于 WinForms)和调试引擎(依赖 Framework 的调试 API)根本起不来。

2.1 验证 net472 是否真实存在:别信“系统更新已安装”,要看注册表和文件

Windows 系统自带的“启用或关闭 Windows 功能”里勾选 .NET Framework 3.5/4.8 并不等于 4.7.2 就到位。Framework 版本是累进式升级,4.7.2 必须由 KB4073120 或更高补丁带入。最可靠验证法是查注册表:

# 在 PowerShell 中执行(需管理员权限) Get-ItemProperty "HKLM:\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full" | Select-Object Release, Version

提示:Release 值 ≥ 461808 才对应 .NET Framework 4.7.2(461808 = 4.7.2 RTM,461814 = 4.7.2 with April 2018 Update)。如果返回空或 Release < 461808,请立即去 Microsoft 官方下载页 下载独立安装包ndp472-kb4054530-x86-x64-allos-enu.exe并静默安装:

ndp472-kb4054530-x86-x64-allos-enu.exe /q /norestart

2.2 解压与首次启动:路径里不能有中文、空格、特殊字符

这是新手踩坑率最高的一步。dnSpy 6.1.3 的调试引擎在加载模块时,对路径编码极其敏感。如果你解压到D:\我的工具\dnSpy\或C:\Program Files\dnSpy\,极大概率在“文件 → 打开程序集”时卡死,或附加进程后断点完全不命中。

# 正确做法:创建一个极简路径 mkdir C:\dnspy613 # 将 dnSpy-6.1.3-net472.zip 全部内容解压到 C:\dnspy613\ # 确保目录结构为: # C:\dnspy613\ # ├── dnSpy.exe # ├── dnSpy.dll # ├── dnSpy.Core.dll # └── ...

参数说明:dnSpy.exe是主入口,它会自动加载同目录下的所有.dll;dnSpy.Core.dll是核心反编译引擎,dnSpy.Debugger.dll是调试模块,缺一不可。不要试图删减目录里的 DLL——哪怕看起来是“语言包”(如dnSpy.resources.dll),删了会导致 UI 字符乱码或调试器初始化失败。

2.3 启动后必做的三件事:禁用自动更新、设置默认反编译器、开启调试符号加载

首次启动 dnSpy,它会弹窗询问是否检查更新。务必勾选“Don't ask again”并点击“No”。因为 6.1.3 是最后一个支持 Framework 调试的版本,后续任何自动更新都会把你推到不兼容的 .NET Core 版本,且无法回退。

然后进入Tools → Options:

  • 在Decompiler选项卡下,将Default decompiler改为ICSharpCode.Decompiler(不是dnSpy.Decompiler),原因:前者对泛型、LINQ、async/await 的还原更准确,后者在 6.1.3 中存在局部变量名丢失 bug;
  • 在Debugging选项卡下,勾选Load debug symbols from symbol servers和Enable Just My Code——前者让 dnSpy 尝试从微软符号服务器下载系统 DLL 的 PDB(如mscorlib.pdb),后者过滤掉 .NET Framework 底层代码,让你专注在自己的业务逻辑上;
  • 在General选项卡下,取消勾选Show tips on startup,避免每次启动都打断工作流。

血泪经验:以上设置必须在第一次打开任何程序前完成。如果已经打开了某个程序再改选项,部分设置(尤其是符号加载)不会动态生效,必须重启 dnSpy。


3. 加载与反编译:如何让 dnSpy 正确识别混淆过的 .NET 程序,并还原可读的方法名?

dnSpy 对未混淆的 .NET 程序开箱即用,但现实中的老项目往往经过 SmartAssembly、ConfuserEx 或早期 Dotfuscator 处理。此时直接双击打开 EXE,你会看到大量method_0,class_1,a.b.c这类名称,根本无法定位业务逻辑。这不是 dnSpy 的问题,而是混淆器擦除了元数据。我们需要分两步破局:先确认混淆类型,再针对性还原。

3.1 用模块视图快速判断混淆强度:看三个关键信号

打开File → Open,选择目标程序(EXE 或 DLL),等待加载完成。左侧Assembly Explorer中展开程序集节点,观察以下三点:

  1. 命名空间(Namespace)是否为空或仅含单字母:如a,b,c—— 这是强混淆(ConfuserEx/SmartAssembly);
  2. 方法名是否全部为method_xxx或sub_xxx:且参数列表全是object,int32,无语义名 —— 表明方法名和参数名均被擦除;
  3. 是否存在大量IL_开头的局部变量名:如IL_0001,IL_0002—— 这是混淆器插入的垃圾指令,干扰反编译逻辑。

注意:如果以上三点全中,说明该程序经过高强度控制流平坦化(Control Flow Flattening)+ 字符串加密 + 方法名擦除。dnSpy 6.1.3 无法全自动还原,但能帮你定位到关键分支点。

3.2 手动还原字符串:用“查找引用”定位解密函数

混淆程序的核心是字符串加密。所有硬编码的 URL、数据库连接串、API Key 都被转成字节数组或 Base64,再通过一个“解密函数”还原。我们的目标不是破解整个算法,而是找到这个函数并让它在调试时吐出明文。

步骤:

  • 在Assembly Explorer中右键程序集 →Find → Find in current assembly...;
  • 输入关键词Decrypt、Decode、GetString、FromBase64String(注意大小写);
  • 如果没结果,换用正则模式:(?i)decrypt|decode|string|base64;
  • 找到疑似解密方法后,双击打开其 IL 代码视图;
  • 右键方法体 →Analyze → Find references to this method;
  • 在引用列表中,逐个点开调用处,观察传入的密文参数(通常是ldstr指令后的长字符串或字节数组);
  • 记下这些密文,稍后在调试时注入断点。
// 示例:一个典型的 ConfuserEx 字符串解密调用 IL_0000: ldstr "Zm9vYmFy" // Base64 密文 IL_0005: call string Class1::Decrypt(string) IL_000a: stloc.0

逻辑说明:ldstr指令加载的是混淆后的字符串常量,call调用解密函数。dnSpy 会把ldstr的值显示在右侧“Instruction Details”面板中。你不需要理解Decrypt函数内部怎么算,只要知道它接收"Zm9vYmFy"输出"foobar"即可。

3.3 用“反编译视图”辅助阅读:切换语法高亮与格式化选项

右键任意方法 →Edit Method (C#),dnSpy 会生成 C# 伪代码。但默认格式可能混乱。此时点击右上角齿轮图标:

  • 勾选Show IL instructions in comments:在每行 C# 旁标注对应的 IL 指令,方便对照底层行为;
  • 取消勾选Use short type names:避免string被缩写成Str,防止类型误判;
  • 设置Indent size为 4:符合主流 C# 风格,减少缩进错位导致的逻辑误读。

参数说明:Show IL instructions in comments是调试关键。当 C# 代码出现“看似不可能的空引用异常”时,看 IL 注释里的ldloc.0/callvirt顺序,能立刻判断是局部变量未初始化还是虚方法调用失败。


4. 调试与热修改:为什么“修改后直接保存”不管用?真正的热重载必须走这三步

这是 dnSpy 使用中最反直觉的一点:你在反编译窗口里改完一行代码(比如把timeout = 3000改成timeout = 30000),点Ctrl+S保存,程序却毫无反应。你以为改成功了,其实只是保存了反编译后的 C# 文本,并未注入到正在运行的进程中。真正的热重载(Hot Reload)必须满足三个硬性条件:进程已附加、修改位于 JIT 编译后的函数内、且该函数尚未被内联优化。

4.1 附加到进程前的必要准备:关闭目标程序的“防调试”检测

很多老程序内置了IsDebuggerPresent()、CheckRemoteDebuggerPresent()或时间差检测(测量两次GetTickCount间隔是否异常)。dnSpy 附加时会被立即终止。解决方法不是关掉检测(那需要改 PE 头),而是让 dnSpy 绕过它:

  • 启动目标程序(不要加任何参数);
  • 在 dnSpy 中Debug → Attach to Process...,找到进程名,先不要点 OK;
  • 点击Advanced...按钮,在弹出窗口中勾选:
    • Suspend process on attach(附加瞬间挂起进程,抢在防调试代码执行前介入);
    • Disable optimizations(禁用 JIT 优化,确保断点能精确命中);
  • 点击 OK,等待 dnSpy 显示Attached successfully。

注意:如果目标程序是 32 位,dnSpy 必须以 32 位模式运行(即dnSpy.exe本身是 x86 架构)。6.1.3-net472.zip 默认提供 x64 和 x86 两个版本,务必确认你解压的是x86文件夹下的可执行文件(路径含x86字样),否则附加 32 位进程会失败。

4.2 在运行时修改 IL:为什么必须编辑 IL 而不是 C#?

dnSpy 的“Edit Method (C#)”本质是反编译 IL → 生成 C# → 再编译回 IL。这个过程会引入额外指令(如空 try-catch 块)、改变局部变量槽位(slot),导致 JIT 编译失败或栈不平衡。最稳妥的修改方式是直接编辑 IL 代码。

操作流程:

  • 在Assembly Explorer中找到目标方法,右键 →Edit Method (IL);
  • 找到要修改的指令行(如ldc.i4.s 3000);
  • 双击该行,修改数值为ldc.i4.s 30000;
  • 按Ctrl+S保存 IL;
  • dnSpy 会弹窗提示Successfully updated the method;
  • 此时方法已被注入到当前进程的 JIT 缓存中,下次调用即生效。
// 修改前 IL_0001: ldc.i4.s 3000 // 加载 3000 到栈顶 IL_0003: stfld int32 MyNamespace.MyClass::timeout // 修改后(只需改这一行) IL_0001: ldc.i4.s 30000 // 加载 30000 到栈顶 IL_0003: stfld int32 MyNamespace.MyClass::timeout

参数说明:ldc.i4.s是加载 1 字节有符号整数的 IL 指令,范围 -128 ~ 127;ldc.i4才能加载 4 字节整数(-2147483648 ~ 2147483647)。如果你要改成100000,必须用ldc.i4 100000,否则 IL 验证失败。

4.3 修改后验证是否生效:用“寄存器视图”和“内存视图”交叉验证

改完 IL 不能只信“保存成功”弹窗。必须验证:

  • 在修改行设断点(点击 IL 行号左侧灰色区域);
  • 触发该方法调用(如点击按钮);
  • 断点命中后,打开Debug → Windows → Registers,查看EAX(x86)或RAX(x64)寄存器值是否为你设定的新数值;
  • 同时打开Debug → Windows → Memory → Memory 1,输入字段地址(右键字段 →Go to definition→ 查看field token,转成十六进制),确认内存中该字段值已更新。

血泪经验:如果寄存器值正确但功能未变,大概率是该字段被缓存(如static readonly)或在构造函数中被覆盖。此时需向上追溯调用栈,找到真正的初始化点。


5. 常见问题排查:dnSpy 6.1.3 + net472 下的五大经典翻车现场

现象、原因、解决,一条都不能少。以下全是真实工单里高频出现的问题,按发生概率排序。

5.1 现象:附加进程后,所有断点显示为“未绑定”,灰色不可用

原因:目标程序未加载调试符号(PDB),或 dnSpy 未识别到 JIT 编译后的函数地址。常见于 Release 模式编译且未嵌入调试信息的程序。
解决:

  • 在Debug → Windows → Modules中,找到目标模块,右键 →Load Symbols;
  • 如果提示“Symbol file not found”,手动指定 PDB 路径(如有)或点击Search Online让 dnSpy 从微软符号服务器下载;
  • 若仍失败,在Tools → Options → Debugging中勾选Enable native debugging,重启 dnSpy 后重试附加。

5.2 现象:修改 IL 后保存成功,但再次打开同一程序集,修改消失

原因:dnSpy 的 IL 修改只作用于内存中的 JIT 缓存,不修改原始磁盘文件。你看到的“保存”只是更新了当前会话的内存副本。
解决:

  • 如需持久化修改,必须导出为新程序集:File → Save Module As...,选择Save as new file;
  • 导出后得到一个新 EXE/DLL,替换原文件即可;
  • 警告:导出前务必确认目标程序无强签名(Strong Name),否则新文件因哈希不匹配无法加载。可用sn -vf 新文件.exe验证。

5.3 现象:在 WPF 程序中设置断点,点击控件后断点不触发,但日志显示事件已发出

原因:WPF 的事件路由(RoutedEvent)机制导致事件处理函数可能被Dispatcher.BeginInvoke异步调度,而 dnSpy 默认不跟踪 Dispatcher 线程。
解决:

  • 在断点所在方法第一行插入System.Diagnostics.Debugger.Break();(C#)或debugger;(IL 中插入call void [System]System.Diagnostics.Debugger::Break());
  • 运行时该行会强制中断,绕过 Dispatcher 调度延迟;
  • 或在Debug → Windows → Threads中,手动切换到Dispatcher线程再设断点。

5.4 现象:dnSpy 启动后界面空白,任务管理器显示进程 CPU 占用 100%

原因:系统 DPI 缩放设置 > 100%(如 125%、150%),dnSpy 6.1.3 的 WinForms 渲染引擎未适配高 DPI,导致无限重绘循环。
解决:

  • 右键dnSpy.exe→Properties → Compatibility → Change high DPI settings;
  • 勾选Override high DPI scaling behavior,缩放执行选择Application;
  • 点击 OK,重启 dnSpy。

5.5 现象:加载大型程序集(>100MB)时 dnSpy 卡死超过 5 分钟,无响应

原因:dnSpy 6.1.3 默认启用“自动分析所有类型”,对含大量泛型、嵌套类型的程序集会触发深度递归分析,内存爆满。
解决:

  • 启动 dnSpy 前,创建同目录的dnSpy.exe.config文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="dnSpy" /> <bindingRedirect oldVersion="0.0.0.0-6.1.3.0" newVersion="6.1.3.0" /> </dependentAssembly> </assemblyBinding> </runtime> <appSettings> <add key="DisableAutoAnalysis" value="true" /> </appSettings> </configuration>
  • 重启 dnSpy,再打开大程序集,加载速度提升 5 倍以上,且内存占用稳定在 1GB 内。

6. 进阶技巧:用 dnSpy 自动化批量修复——写一个 PowerShell 脚本,把 50 个 DLL 的超时值统一改成 60 秒

手动改一个方法很轻松,但如果你要维护一个由 50 个 DLL 组成的老系统,每个都有Timeout字段,挨个打开、找、改、保存、导出,一天都干不完。这时候就得让 dnSpy “听话干活”。dnSpy 6.1.3 不提供官方 CLI,但它暴露了完整的 .NET API,我们可以通过 PowerShell 调用其核心库,实现无人值守批量修改。

6.1 准备工作:提取 dnSpy 的核心 DLL 并确认 .NET Framework 兼容性

dnSpy 的所有逻辑都在dnSpy.Core.dll和dnSpy.dll中。它们是 .NET Framework 4.7.2 编译的,因此 PowerShell 必须运行在 Framework 下(PowerShell 5.1 默认满足,PowerShell Core 6+ 不行)。

# 确认 PowerShell 运行时 $PSVersionTable.CLRVersion.ToString() # 应输出 4.7.2xxxx 或更高 # 加载 dnSpy 核心库 Add-Type -Path "C:\dnspy613\dnSpy.Core.dll" Add-Type -Path "C:\dnspy613\dnSpy.dll"

注意:Add-Type必须按顺序加载,dnSpy.Core.dll依赖dnSpy.dll,反了会报Could not load file or assembly。

6.2 核心脚本:遍历 DLL,定位字段,修改 IL,导出新文件

以下脚本完成三件事:加载每个 DLL → 查找所有名为Timeout的int32字段 → 将其初始化 IL 指令(ldc.i4.s 3000)替换为ldc.i4.s 60000→ 保存为_patched后缀新文件。

# 批量修复脚本:Set-TimeoutTo60.ps1 param( [Parameter(Mandatory)] [string]$InputPath, [Parameter(Mandatory)] [string]$OutputPath ) # 创建输出目录 if (-not (Test-Path $OutputPath)) { New-Item -ItemType Directory -Path $OutputPath | Out-Null } # 获取所有 DLL 文件 $dllFiles = Get-ChildItem -Path $InputPath -Filter "*.dll" -Recurse foreach ($dll in $dllFiles) { Write-Host "Processing $($dll.Name)..." -ForegroundColor Green try { # 1. 加载模块 $moduleDef = [dnSpy.DotNet.DnSpyModuleDef]::Load($dll.FullName) # 2. 遍历所有类型,查找 Timeout 字段 $timeoutFields = @() foreach ($type in $moduleDef.GetTypes()) { foreach ($field in $type.Fields) { if ($field.Name == "Timeout" -and $field.FieldType.FullName -eq "System.Int32") { $timeoutFields += $field } } } if ($timeoutFields.Count -eq 0) { Write-Warning "No 'Timeout' field found in $($dll.Name)" continue } # 3. 修改每个 Timeout 字段的初始化方法(通常是 .cctor 或构造函数) foreach ($field in $timeoutFields) { # 查找给该字段赋值的方法 $assignMethods = @() foreach ($method in $moduleDef.GetMethods()) { if ($method.Body -eq $null) { continue } foreach ($instr in $method.Body.Instructions) { if ($instr.OpCode.Name -eq "stsfld" -and $instr.Operand -eq $field) { $assignMethods += $method break } } } foreach ($method in $assignMethods) { # 定位 ldc.i4.s 指令并替换 for ($i = 0; $i -lt $method.Body.Instructions.Count; $i++) { $instr = $method.Body.Instructions[$i] if ($instr.OpCode.Name -eq "ldc.i4.s" -and $instr.Operand -eq 3000) { # 替换为 60000(60秒) $method.Body.Instructions[$i] = [dnSpy.DotNet.MD.Instruction]::CreateLdcI4(60000) Write-Host " Fixed Timeout assignment in $($method.FullName)" -ForegroundColor Cyan } } } } # 4. 保存为新文件 $outputFile = Join-Path $OutputPath "$($dll.BaseName)_patched.dll" $moduleDef.Write($outputFile) Write-Host " Saved to $outputFile" -ForegroundColor Green } catch { Write-Error "Failed on $($dll.Name): $($_.Exception.Message)" } }

逻辑说明:脚本核心是dnSpy.DotNet.DnSpyModuleDef.Load()加载模块,moduleDef.GetTypes()遍历类型,field.FieldType.FullName精确匹配System.Int32避免误改TimeSpan;stsfld指令是静态字段赋值的关键标识,比单纯搜方法名更可靠;Instruction.CreateLdcI4()是 dnSpy 提供的安全 IL 构造器,比手动拼 IL 字符串更健壮。

6.3 执行与验证:一次跑完 50 个 DLL,只需 3 分钟

将脚本保存为Set-TimeoutTo60.ps1,在 PowerShell 5.1 中以管理员身份执行:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser .\Set-TimeoutTo60.ps1 -InputPath "C:\legacy-app\bin\" -OutputPath "C:\legacy-app\bin_patched\"

脚本输出示例:

Processing Common.dll... Fixed Timeout assignment in MyNamespace.HttpClient::.cctor Saved to C:\legacy-app\bin_patched\Common_patched.dll Processing Data.dll... Fixed Timeout assignment in MyNamespace.DbHelper::.ctor Saved to C:\legacy-app\bin_patched\Data_patched.dll ...

验证技巧:批量修复后,用ildasm快速抽检:

ildasm "C:\legacy-app\bin_patched\Common_patched.dll" /text | findstr "ldc.i4"

应只看到ldc.i4 60000,不再有ldc.i4.s 3000。

我做这类批量修复时,习惯在脚本末尾加一行explorer $OutputPath,自动打开资源管理器看生成文件;再写个Compare-Object对比前后 DLL 的 SHA256,确保没改错字节。这些小动作省下的时间,够你喝三杯咖啡。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 6:24:11

开源+私有化:打造能主动干活的企业AI工作伙伴

1. 从"只会聊天"到"能干活"&#xff1a;企业AI落地的真实断层在哪过去两年&#xff0c;我参与过好几个企业内部的AI助手项目&#xff0c;几乎每一个都经历过同样的尴尬&#xff1a;上线第一周大家图新鲜&#xff0c;问天气、写周报、翻译邮件&#xff0c;用…

作者头像 李华
网站建设 2026/10/12 6:23:41

Python压缩包自动化处理:zipfile与tarfile办公实战指南

1. 办公场景下的压缩包处理需求拆解1.1 为什么压缩包操作值得单独拿出来讲日常办公里&#xff0c;压缩包几乎无处不在。财务部门每月要打包发票扫描件发给审计&#xff0c;运营团队要把活动素材整理成压缩包上传到共享盘&#xff0c;开发同学需要把日志文件压缩后归档。这些操作…

作者头像 李华
网站建设 2026/10/12 6:23:06

VS2019静态编译jsoncpp+json-rpc:零依赖C++ JSON通信方案

简介&#xff1a;本资源为Windows平台下VS2019编译完成的libjsoncpp与libjson-rpc-cpp静态库套件&#xff0c;专为C开发者快速集成JSON-RPC通信功能而设计&#xff0c;解决常见下载包缺失依赖库、架构不匹配&#xff08;如仅提供x86&#xff09;等实际部署痛点。压缩包共355个文…

作者头像 李华
网站建设 2026/10/12 6:21:40

AI产品经理就业实战营拆解:从会用AI到能落AI的转化路径

1. 这个实战营到底在解决什么问题1.1 从“玩具”到“工具”的那道鸿沟我接触过不少想转行做AI产品经理的朋友&#xff0c;发现一个特别普遍的现象&#xff1a;简历上写着“熟练使用ChatGPT、Midjourney”&#xff0c;面试时也能聊几句大模型原理&#xff0c;但一旦问到“你负责…

作者头像 李华
网站建设 2026/10/12 6:21:38

模型后训练笔记1

摘要本文主要是博主在学习专用模型后训练的笔记。CPT&#xff08;Continual Pre-Training)简单来说&#xff0c;CPT就是在已经训练好的通用模型基础上&#xff0c;通过新的数据&#xff0c;学习新的知识&#xff0c;尤其是特定目标领域的知识。形式是自监督学习&#xff08;sel…

作者头像 李华
网站建设 2026/10/12 6:20:41

从脚本到技能包:智能体工程化开发的核心抽象与实践

做智能体开发这一年多&#xff0c;我最大的一个感受是&#xff1a;真正拉开项目水平的往往不是模型选得有多新、Prompt写得有多花&#xff0c;而是一堆不起眼的 skills 怎么设计、怎么组织、怎么复用。第一次接触“技能包”这个概念&#xff0c;是因为一个特别具体的痛点&#…

作者头像 李华