一张登录许可证启动时到底该查哪些
给桌面软件接了一套登录许可证,启动的时候要过一串校验,任一条不过就直接锁应用。licence 防破解的一些具体坑(时间回拨、指纹漂移)之前写过,这里不重复,主要想理一下:一张许可证启动时到底该查哪些项,以及其中几个不那么直观的、容易漏掉的检查。
整体是个串行链条,前面是许可证本身合不合法,后面是运行环境对不对,最后才是用户名密码。哪一环断了都锁,不是「前面过了后面就随便」。
许可证本体这几项
先是把许可证解析出来,格式不对、签名解析失败,直接锁。然后是有效期,过期了锁——但有效期的判断会被改系统时间绕掉,这块得配合本地单调时间记录来防回拨,之前那篇说过的思路,这里不展开。接着是硬件指纹比对,确认现在这台机器就是许可证绑的那台,防一份 licence 拷来拷去到处用。
这几项是基础,大多数做 licence 的人都会想到。
版本号得跟软件版本对上
这条我觉得容易被忽略。许可证里带一个版本号字段,校验的时候不能只看它「有没有」,得看它是不是等于当前软件的版本。
为什么重要——因为软件会迭代。一份在 v2 时代签发的 licence,里面版本号写的是 2,用户拿着它去跑 v3,如果不校验版本,v3 照样认这份老 licence。这就留下一个口子:买了旧版的人拿着旧 licence 一直白嫖新版本。绑死版本号之后,大版本升级要么重新签发、要么 licence 里显式声明向前兼容哪些版本,主动权在签发方手里。
注册目录得是当初注册的那个
这条更隐蔽。注册成功的时候,把「当时所在的安装目录」记进许可证或者本地凭证里。下次启动,拿当前程序的运行目录(user.dir)跟记下来的那个比一下,不一致就锁。
防的是这种操作:用户在一台机器上注册成功了,然后把整个安装目录连着注册凭证一起打包,拷到另一台机器上跑。光靠硬件指纹的话,如果两台机器硬件凑巧接近、或者指纹本身不够强,可能蒙混过去。但目录是物理路径,拷到别的机器上基本不可能还在同一个绝对路径下,这条等于多加了一层「这确实是当初那台机器、那个位置」的绑定。
配置校核防的是改配置
还有个配置校核(proofread):启动时把关键的本地配置重新算一遍校验和,跟之前存的比对。防的是破解者不去动 licence 本体(那个有签名,动不了),转而去改本地的配置文件——比如把「已激活」标志、剩余时长这些写死成有利值。配置一旦被改,校验和对不上,锁。
这条的逻辑是:licence 本体有签名护着改不动,那攻击者最可能下手的就是没有签名保护的本地配置,得给这部分也上个完整性校验。
最后才是用户名密码
所有上面的环境校验都过了,才走到用户名密码这一步。它放在最后是有讲究的:用户名密码防的是「会操作电脑但不会逆向」的人,真正能破前面那些链路的人,根本不需要猜密码。所以把它放最前面没意义,先确认环境和许可证没问题,最后再用密码挡一道普通使用者层面的越权。
这一串串起来,思路其实就是「licence 本体靠签名、运行环境靠多维度绑定」。签名保证许可证没被改,版本号、目录、配置校核把「拿合法 licence 换个环境用」这条路一层层堵上,最后用密码挡住普通越权。哪条单独拎出来都不绝对,但叠成一个链条之后,想绕过去得同时把好几处都对上,门槛就上去了。
