Linux系统中软件简单License的实现
概述
关键字: MD5
一 目的和思路
这样,我们需要一个获得机器特征的程序,一个生成license的程序以及在所要加license的程序中嵌入检查license的代码。生成license程序可以是在windows操作系统下编写,也可以在Linux系统下编写,本文只讨论后面一种。
二 关键技术
1.
兼容x86的CPU的信息存储在数据结构:
struct cpuinfo_x86 {
__u8 x86;
__u8 x86_vendor; /* CPU vendor */
__u8 x86_model;
__u8 x86_mask;
char wp_works_ok;
char hlt_works_ok;
char hard_math;
char rfu;
unsigned long x86_capability[7];
char x86_vendor_id[16];
char x86_model_id[64];
int x86_cache_size;
int x86_cache_alignment; /* In bytes */
int fdiv_bug;
int f00f_bug;
int coma_bug;
unsigned long loops_per_jiffy;
unsigned char x86_num_cores;
};
中,对于我们来说,只要获得x86_vendor_id和x86_model_id两项信息即可,前者记录的是CPU的制造商的信息,后者记录CPU的记录信息。在Linux下,可以通过以下代码获得:
static inline void
cpuid(int op, unsigned int *eax, unsigned int *ebx,
{
}
static unsigned int
get_cpu_id()
{
}
2.
网卡信息是存储在数据结构:
struct ifconf ifc;
中,该结构包含在头文件
#include <net/if.h>
中,在编写代码时需要将它包含。获得MAC地址的代买如下:
#define IFRSIZE
static int
get_mac_addr(void)
{
/*
/*
/*
}
unsigned char *mac_addr;
3.
MD5算法其实是一个用来产生随机数的算法,已经有了现成的源码(在RFC中有详细描述),它最主要的接口主要是函数:
UINT4B
该函数传入一串字符串,然后返回一个32字节的带符号位整型数。这里,字符串的内容可以是任意的,而一旦内容固定,那么返回的整型数就是唯一的。于是,我们就可以利用这个函数来验证输入的字符串的正确性。
四 流程
1.
首先是获得CPU信息,则通过上述代码,将CPU信息存入cpu_info。
其次是获得MAC地址,则通过上述代码,将MAC地址存入mac_addr中,
最后就是调用函数md_32,获得一个随机数,将该随机数写入到某个文件,可以称之为验证码,那么该文件即生成为license文件。
2.
验证license的一部分步骤和生成license是一模一样的,即验证时,也需要先读取CPU和MAC地址信息,然后也通过md_32函数生成一个验证码。此时,验证过程需要读入license文件中的数字,然后将两者进行比较,如果相同,则表示license正确,可以继续以下流程,如果不一样,则表明license出现问题,程序终止。
五 拓展
1.
因为生成license的原理是通过一个字符串生成一个验证码,于是,这个字符串的内容是可以任意修改的。也就是说,可以根据需要加入一些限制条件。
例如,要限制某个程序的最大网络连接数为200,那么就可以加入200这个数字在字符串中,生成一个新的验证码,而在license文件中写入类似:max_conns = 200的内容。当验证license时,验证流程读入max_conns的值作为全局变量,同时再通过计算license的验证码是否正确。一旦正确,那么max_conns的值(200)就成为程序的一个全局变量,可以用它来限制最大连接数。如果有人修改了license文件,使得max_conns的值发生变化,那么验证过程根据新的max_conns值所得到的验证码就跟license文件的验证码不一样,这样验证不过关,表示license文件是错误的。
另外,在license中加入验证时间的有效性也是常用的方法。
2.
上面讨论的生成license和验证license的过程,都是在Linux操作系统中生成的。在生成license时,因为CPU和MAC地址的关系,必须在同一台机器上操作,这样带来了很大不方面,而且不利于保密。
一个改进的办法是,将生成license文件的过程拆成两个步骤:
第一步,将获得的CPU和MAC地址信息放入一个文件;
第二步,将文件传递到某个平台,由该平台生成license文件。
这样的好处是,生成license文件的执行程序可以是Linux系统的,也可以是Windows系统下的,而且不需要在同一台机器上运行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2015-05-17 linux下C和shell调用的popen函数
2015-05-17 Linux下使用popen()执行shell命令
2015-05-17 RBL, UBL, Uboot的关系
2015-05-17 windows下搭建NFS服务器
2015-05-17 windows nfs server for linux
2013-05-17 ODBC API开发教程