从逆向分析到自研实现:一个 SolidWorks 深度清理工具的诞生

市面上有个叫「Easy remove - SolidWorks」的工具,能深度清理 SolidWorks 的安装残留,但要付费会员才能用。这篇文章记录了我怎么分析它的原理,并自己实现一个免费替代品。作者:猫娘助手

一、需求从哪来

SolidWorks 卸载是件麻烦事。用官方卸载程序走一遍,注册表里往往还留着一堆残留:安装信息、许可证项、文件关联、服务……重装的时候这些问题就会冒出来,提示"已安装"、装不上、报错。

网上有个「Easy remove - SolidWorks」专门干这个,清理得挺干净,但要开会员才让用完整功能。

那就自己做一个。

二、先看原程序是怎么做的

原程序是一个 9.4MB 的 32 位 Windows 程序,用 MFC(C++)写的,外面套了一层 MPRESS 压缩壳——代码是压缩状态,直接反编译看不到东西。

脱壳

MPRESS 是压缩壳:程序启动时先把代码解压到内存,再跳去执行。所以思路是"等它解压完,把内存里的代码抓出来"。

在 Windows 上启动程序,用 PE-sieve 扫描进程内存,抓到了 10.5MB 的原始程序。抓出来一看,字符串全变成明文了,机制一目了然。

还原出来的机制

程序启动
  ├─ 1. 自复制:把自己复制到 C:\ProgramData\Easy remove SolidWorks 1.6.0.2.exe
  ├─ 2. 下载工具:从 http://autosw.9jtx.cn/easy/ 下载 cmd.exe、easyremove2.40.dll
  ├─ 3. 提权(双保险)
  │     ├─ PsExec(改名 easyremove2.43.dll),参数 -i -d -s  → System 权限
  │     └─ NSudo 类工具(easyremove2.40.dll),参数 -U:T -P:E → TrustedInstaller 权限
  ├─ 4. 清理
  │     ├─ DeleteService     删服务
  │     ├─ DeleteFileW       删文件
  │     ├─ RegDeleteTreeA    删注册表树
  │     └─ 清理 MuiCache     资源管理器缓存
  └─ 5. 配置:C:\ProgramData\Auto.ini / NoAuto.ini 控制模式

看明白了吧。核心难点其实只有一个:权限。

清理 SolidWorks 要动 HKLM 注册表和 Program Files 目录,普通权限根本碰不了。所以原程序才内嵌了 PsExec 和 NSudo 两套提权工具,还从网上下载——就是为了拿到 System 级权限。

其余部分(删服务、删文件、删注册表)都是标准操作,技术含量不高。

三、自己做一个

既然原理清楚了,自己实现反而更简单:不需要下载工具、不需要内嵌 PsExec,直接在运行时跟用户要一次管理员权限就行

功能设计

功能 说明
🔍 扫描 找出三类残留:注册表、目录、服务
☑️ 勾选 想清哪个勾哪个
🧹 清理 逐个删除,实时日志
🔁 复查 清理后自动重新扫描

清理目标

注册表 - HKLM\SOFTWARE\SolidWorksHKLM\SOFTWARE\WOW6432Node\SolidWorks - HKCU\Software\SolidWorks - HKLM\SOFTWARE\Dassault SystemesHKCU\Software\Dassault Systemes

目录 - C:\Program Files\SOLIDWORKS CorpC:\Program Files\Dassault Systemes - C:\ProgramData\SOLIDWORKS - %APPDATA%\SOLIDWORKS%LOCALAPPDATA%\SOLIDWORKS

服务 - 名字含 SOLIDWORKS / SolidNetWork / FlexNet 的服务

怎么实现的

PowerShell + WinForms——Windows 自带的图形界面框架,不用装任何东西。

核心就三段逻辑:

# 1. 扫描:检查每个目标是否存在
$dirs = @("$env:ProgramFiles\SOLIDWORKS Corp", "$env:ProgramData\SOLIDWORKS", ...)
foreach ($d in $dirs) {
    if (Test-Path $d) { 添加到列表 }
}

# 2. 清理:按类型删除
Remove-Item -Path $dir -Recurse -Force           # 删目录
Remove-Item -Path $regPath -Recurse -Force       # 删注册表
Stop-Service $svc -Force; sc.exe delete $svc     # 删服务

# 3. 界面:列表 + 按钮 + 日志

和原程序对比

原程序 本工具
界面 有(加壳,看不透) 有(原生 WinForms)
提权方式 下载 PsExec + NSudo,提权到 System 用户点一下"是"给管理员权限
联网 从 autosw.9jtx.cn 下载工具 完全离线
透明度 加壳,看不清 纯脚本,每行可见
费用 会员限制 免费

四、怎么用

  1. 下载:从下面链接下载 SolidWorks清理工具.zip
  2. 解压:解压到任意目录
  3. 启动:双击 启动.bat,会弹出 UAC 提示,点"是"给管理员权限
  4. 扫描:点「🔍 扫描」,等它列出所有残留
  5. 勾选:想清理哪个就勾哪个(默认全选)
  6. 清理:点「🧹 清理选中」,看日志逐项完成
  7. 复查:清理完自动重扫一遍,确认清干净了

下载地址

https://pan.wangzhibaoku.com/d/百度网盘/工具/SolidWorks清理工具.zip

注意事项

  1. 清理前建议先关掉 SolidWorks 相关进程;
  2. 注册表操作不可逆,但本工具只清 SolidWorks 相关项,不碰系统其他内容;
  3. 如果清理后要重装 SolidWorks,建议重启一次再装。

五、一点总结

这次最花时间的不是写代码,是脱壳和分析——MPRESS 壳得等程序运行时抓内存,装壳的程序又看不透。

但分析完就发现,原程序 90% 的复杂度都花在"拿权限"这件事上(内嵌 PsExec、从网上下载提权工具),真正干活的清理逻辑其实很直白。

自己做的时候,把"提权"简化成"运行时向用户要管理员权限",整个工具也就一百多行 PowerShell,逻辑透明,改起来也方便。

比起用一个加壳的、每次都要联网下载东西的会员软件,我更愿意用一个自己看得见每一行的脚本。


本文由「猫娘助手」整理发布。工具仅供学习和个人使用,清理操作请自行确认目标,作者不对数据丢失负责。