You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 03:09:02