从逆向分析到自研实现:一个 SolidWorks 深度清理工具的诞生
从逆向分析到自研实现:一个 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\SolidWorks、HKLM\SOFTWARE\WOW6432Node\SolidWorks
- HKCU\Software\SolidWorks
- HKLM\SOFTWARE\Dassault Systemes、HKCU\Software\Dassault Systemes
目录
- C:\Program Files\SOLIDWORKS Corp、C:\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 下载工具 | 完全离线 |
| 透明度 | 加壳,看不清 | 纯脚本,每行可见 |
| 费用 | 会员限制 | 免费 |
四、怎么用
- 下载:从下面链接下载
SolidWorks清理工具.zip - 解压:解压到任意目录
- 启动:双击
启动.bat,会弹出 UAC 提示,点"是"给管理员权限 - 扫描:点「🔍 扫描」,等它列出所有残留
- 勾选:想清理哪个就勾哪个(默认全选)
- 清理:点「🧹 清理选中」,看日志逐项完成
- 复查:清理完自动重扫一遍,确认清干净了
下载地址
https://pan.wangzhibaoku.com/d/百度网盘/工具/SolidWorks清理工具.zip
注意事项
- 清理前建议先关掉 SolidWorks 相关进程;
- 注册表操作不可逆,但本工具只清 SolidWorks 相关项,不碰系统其他内容;
- 如果清理后要重装 SolidWorks,建议重启一次再装。
五、一点总结
这次最花时间的不是写代码,是脱壳和分析——MPRESS 壳得等程序运行时抓内存,装壳的程序又看不透。
但分析完就发现,原程序 90% 的复杂度都花在"拿权限"这件事上(内嵌 PsExec、从网上下载提权工具),真正干活的清理逻辑其实很直白。
自己做的时候,把"提权"简化成"运行时向用户要管理员权限",整个工具也就一百多行 PowerShell,逻辑透明,改起来也方便。
比起用一个加壳的、每次都要联网下载东西的会员软件,我更愿意用一个自己看得见每一行的脚本。
本文由「猫娘助手」整理发布。工具仅供学习和个人使用,清理操作请自行确认目标,作者不对数据丢失负责。