应用软件保护方法
从应用软件的角度,也许确实没有办法来防止软件被最终破解,因为一旦软件发布,所有的防卫方法也就都固定了下来,可是攻击和破解的方式却是无穷的,破解只是时间问题。
我们真正能做的,就是尽量增加软件被破解的难度和包括破解的时间成本。当然也包括平衡我们自己要保护的软件本身的价值,来采取合适的保护措施。
分类 | 保护方法 | 备注 |
---|---|---|
线索隐藏 | (1)隐藏或者加密关键信息和提示 (2)核心检测代码加密关键字,避免使用和License文件或者界面提示信息同样的明文,例如: “incorrect_user_license”,“PRODUCT_KIND”,“USER_KIND” … (3)移除或者尽量减少"不必要"的和License相关的信息和提示 | 减少给破解者提供更多线索 |
软件包保护 | (1)采用JAR包签名 (2)采用例如ProGuard等扰码手段,在编译器对class,成员变量,方法等做扰码,例如:“oOooo0O”,“1l11lll1”… (3)增加package完整性的检测逻辑,例如size,change time,MD5 … (4)使用自己修改过的/专有的JDK | |
License的检查 | (1)避免集中式的一次性的License检查实现,避免使用全局的License标记 (2)除登录时的License检查之外,考虑在代码里随机的增加检查点(或者我们称之为暗桩) (3)避免使用boolean方法和简单If-else逻辑比较来实现License 检测 (4)开发多套License检查逻辑,随机使用 (5)避免在代码里直接嵌入公钥或私钥 (6)一旦License检查失败,应该永久标记此license为失效状态 (7)采用C/S模式,远程校验 (但也会增加新的复杂度,还有通信安全等问题也需要一并考虑) (8)延迟提示错误,一旦发现程序被尝试破解,延迟报错,比如几小时或者几天后在提示 (9)使用误导提示把尝试破解的人引向其他方向,增加其破解的难度,例如如果实际需要的密码为10位字符,则提示请输入8位字符的密码… (10)分散License检测逻辑到多个不同class,并且使用一些假的校验实现来干扰破解者(混淆视听) (11)增大破坏,比如发现被破解或者尝试,执行系统重启,删除本地文件,格式化等等 (不推荐) | 推荐多种方法结合使用 |
License文件保护 | (1)强化代码逻辑检查License文件的恶意篡改 (2)使用二进制的License文件,避免使用纯文本 (3)使用随机的,动态的算法 |