如何设置Inno Setup安装包仅可在单台电脑运行一次
Inno Setup 安装包单设备单次运行实现方案
核心逻辑为专属安装包绑定目标设备硬件特征+运行后自毁,可实现单台设备仅能运行一次、拷贝到其他设备无法启动的效果,具体实现步骤如下:
1. 预生成专属绑定安装包
- 先向申领免费副本的用户收集目标设备的硬件特征,推荐取 CPU序列号+系统盘序列号+首块网卡MAC地址 三者组合的MD5哈希值,既保证设备唯一识别性,也不会泄露用户原始硬件信息
- 你在本地为每个用户单独编译专属安装包,将对应设备的哈希值硬编码到安装包代码中,不同用户的安装包无法通用
2. 启动时强制校验设备匹配性
通过 Inno Setup 的 InitializeSetup 事件触发设备校验,设备不匹配直接退出安装:
function InitializeSetup(): Boolean; var CpuSerial, DiskSerial, MacAddr, DeviceHash, TargetHash: String; begin Result := False; // 替换为对应用户的预生成设备哈希值,每个安装包此处内容唯一 TargetHash := 'YOUR_PRE_GENERATED_DEVICE_HASH'; // 以下为获取硬件信息并计算哈希的逻辑,可直接复用Inno Setup社区通用的硬件读取封装函数 CpuSerial := GetCpuSerialNumber(); DiskSerial := GetSystemDiskSerialNumber(); MacAddr := GetFirstNetworkCardMac(); DeviceHash := CalcMD5(CpuSerial + '_' + DiskSerial + '_' + MacAddr); if DeviceHash <> TargetHash then begin MsgBox('该安装包为专属授权版本,不支持在当前设备运行', mbError, MB_OK); Exit; end; Result := True; end;
3. 安装完成后自毁源安装包
通过 CurStepChanged 事件监听安装完成状态,调用系统命令延迟删除安装包本身,确保单次运行:
procedure CurStepChanged(CurStep: TSetupStep); var SourceExePath: String; ErrorCode: Integer; begin if CurStep = ssDone then begin // 获取当前运行的安装包完整路径 SourceExePath := ExpandConstant('{srcexe}'); // 调用cmd延迟2秒后删除安装包,避免程序运行中无法删除的问题 Exec('cmd.exe', '/C timeout /t 2 /nobreak > nul & del /f /q "' + SourceExePath + '"', '', SW_HIDE, ewNoWait, ErrorCode); end; end;
可选强化方案
- 对编译后的安装包加壳,防止普通用户逆向修改校验逻辑或硬编码的哈希值
- 增加服务端校验逻辑:安装包启动时请求你方服务端确认该安装包未被激活使用,首次运行成功后服务端直接标记该安装包失效,后续即使文件被拷贝也无法通过校验
注意:该方案仅能提高普通用户的传播门槛,无法100%防御技术人员的逆向破解,足够应对绝大多数常规的非授权传播场景。
内容的提问来源于stack exchange,提问作者accpert.com
相关产品推荐
相关产品推荐

