Steam DRM 包装
Steam DRM 包装
DRM 通过加密和授权验证,确保只有授权用户能运行受保护的 exe,防止未授权拷贝。Steam 的 DRM 包装是 drm_wrap 这条 steamcmd 命令,把明文 exe 包成一个 wrapper exe。
官方文档:https://partner.steamgames.com/doc/features/drm
命令与参数
drm_wrap [appid] [input filename] [output filename] [toolname] [flags] [<destination>]
- appid — 数字应用 ID
- input filename — 输入明文 exe 的相对或绝对路径,带空格记得加引号
- output filename — 输出 wrapper exe 的路径
- toolname — 目前只支持
drmtoolp - flags — 行为位掩码:
0— 正常包装(保护最强)6— 兼容模式(关掉混淆)32— 跳过调试器检查38— 兼容模式 + 跳过调试器检查(保护最弱)
- destination — 可选,
cloud或local,默认 cloud。除非 cloud 出问题,否则不用动。
典型用法:
steamcmd +login <user> <password> +drm_wrap <appid> "D:\Game.exe" "D:\Game.exe" drmtoolp 0 +quit
如果报错 "Executables with a TLS callback can only be wrapped in compatibility mode",换兼容模式:
steamcmd +login <user> <password> +drm_wrap <appid> "D:\Game.exe" "D:\Game_DRM.exe" drmtoolp 6 +quit
exe 大于 64MB 要手动包装
命令行的 drm_wrap 会把 exe 上传到 Steam 服务器做 wrap 再下回来。exe 大于 64MB 时下载这一步会失败,得改用网页版手动包装器:
https://partner.steamgames.com/apps/drm/<appid>
实测里命令行虽然报错,DRM 其实已经上传成功,只是下不回来、没法替换本地 exe,所以最终还是得网页手动下载替换再上传包。
flags 选择的实战经验
不同引擎版本、不同 build 配置对 flags 的容忍度不一样,这部分坑很深:
- 同一个 exe,
drmtoolp 0下不回来,改drmtoolp 6就能下回来。 - UE4.27 的某项目,development 配置用
drmtoolp 6仍然下不回来,Test 配置drmtoolp 6可以。 - UE4.17 的某项目,development 四种 flag 都下不回来(网上建议要么兼容模式要么升引擎),Shipping 配置
drmtoolp 6可以。
经验是先 0,失败逐步退到 6;同一个 exe 在不同 build 配置下表现可能完全相反,值得各配置都试一遍。
DRM 和数字签名的顺序
所有 exe 都要数字签名,但签完名再加 DRM,签名会被 wrapper 抹掉。正确顺序是先加 DRM,再把加完 DRM 的 exe 发去签名。
只给启动项加 DRM
试过给自研引擎的所有 exe 都加 DRM,结果除启动项外的几个 exe 一加 DRM 就起不来,原因是它们用了 .NET 框架(官方文档有提)。这些 exe 走的是 SteamAPI_RestartAppIfNecessary 这套机制。
还遇到过个别 exe(比如等待标题用的小工具)加 DRM 时报 Error result: 8 (Invalid Parameter),日志里是 "PE module implementation does not currently support adding imports / Unable to add import of kernel32.dll:GetModuleHandleA",显示 Upload complete 但 DRM 页面上其实没传成功。
给非启动项的 exe 加 DRM 后,在 SteamDeck 上还能开,但 PC 端起不来且报错。所以结论是只给启动项(launcher)加 DRM。