Peripateticism

Yuens' blog

View the Project on GitHub

header

软件加密与授权思路和原理简析

最近需要对开发的软件设置给定日期后不能使用的限制,给软件使用限制,一般有以下限制方式,或说是授权方式:

  1. 离线
    1. 使用日期限制,在某个日期前可使用;
    2. 使用时间限制,时间段内可使用;
    3. 使用次数限制; 等等
  2. 在线
    1. 每隔固定日期,需要联网才能继续使用;
    2. 需要联网才能使用; 等等。

1.原理

软件试用版常用时间限制,通常是将安装软件的时间和系统当前时间对比:

  1. 安装时写入某隐藏文件,用来存储软件安装时间;
  2. 安装时将时间信息写入注册表;
  3. 程序本身自修改执行代码(能做到这一步必须对pe格式十分了解,难度很大)。

1.1 源码中限制

下面给出这种方法的C/C++代码实现:

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

bool is_out_of_date(const int deadline_time_stamp) const
{
    time_t cur_time_t = time(nullptr);
    const int current_time_stamp = time(&cur_time_t); // 时间戳,距离1970.1.1的秒数
    return (current_time_stamp > deadline_time_stamp) ? true : false;
}

更高级的方式,是在不影响源码的情况下,给exedll等文件加壳。以下内容来自百度百科:

1.2 加壳限制

1.3 解压原理

1.4 加壳分类

加壳工具通常分为压缩壳和加密壳两类:

  1. 压缩壳的特点是减小软件体积大小,加密保护不是重点;
  2. 加密壳种类比较多,不同的壳侧重点不同,一些壳单纯保护程序,另一些壳提供额外的功能,如提供注册机制、使用次数、时间限制等。

2.破解

既然是根据时间来限制,那么自然可以更改系统时间,或者在一个可控时间的虚拟环境如沙盘中,使其无法达到被限制的日期。

  1. 破解软件。网上有小伙伴说,可以在安装之后迅速用AnyDay一类软件把它变成”永久试用版”,从而接触限制。网上应该有类似不少的软件;
  2. 针对时间限制文件放在注册表或者隐藏写入文件的,可以清除注册表信息或者找到隐藏的文件进行清理(有办法就是在安装软件后,立即搜索更改日期为最新的小文件,有时可以挖得出来)。有些软件是在某个不知名的目录中,如system32\XX\XXXXX\XXXX的不引人注意且有很多文件的目录中创建一个文件,记录首次安装时间,在卸载时并不删除。

删除相关的隐藏文件或者清理注册表,仍旧被限制使用,可能是没有找到软件隐藏的注册表信息、隐藏文件,可以尝试把系统日期往回调几天看看,反复查找,不过这个方法建议在虚拟机里使用。

3.参考

  1. 一般试用版软件的时间限制原理是什么?怎么解决啊-CSDN论坛
  2. 加壳_百度百科