概述

目前,很多商用应用系统是运行在Linux系统之上的,为了维护开发者利益,有必要为软件添加license功能,防止软件被盗用和挪用。本文探讨如何在Linux软件中添加license功能,用到的算法是MD5算法。

关键字: MD5

一 目的和思路

设置License就是要将软件和运行该软件的机器进行简单“绑定”,该软件只能在某台指定机器上使用,如果将该软件挪动到其他机器上则无法运行。

根据以上目的,那么思路就很清晰,则我们需要读取该指定机器的某些特征,这里我们只抓取两个特征,即CPU特征和机器MAC地址。

这样,我们需要一个获得机器特征的程序,一个生成license的程序以及在所要加license的程序中嵌入检查license的代码。生成license程序可以是在windows操作系统下编写,也可以在Linux系统下编写,本文只讨论后面一种。

二 关键技术

这里的三个关键技术是获得本机的CPU信息、获得网卡MAC地址信息以及MD5加密。

1. 获得CPU信息

兼容x86的CPU的信息存储在数据结构:

struct cpuinfo_x86 {

__u8 x86; /* CPU family */

__u8 x86_vendor; /* CPU vendor */

__u8 x86_model;

__u8 x86_mask;

char wp_works_ok; /* It doesn't on 386's */

char hlt_works_ok; /* Problems on some 486Dx4's and old 386's */

char hard_math;

char rfu;

int cpuid_level; /* Maximum supported CPUID level, -1=no CPUID */

unsigned long x86_capability[7];

char x86_vendor_id[16];

char x86_model_id[64];

int x86_cache_size; /* in KB - valid for CPUS which support this

call */

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,

unsigned int *ecx, unsigned int *edx)

{

__asm__("cpuid"

: "=a" (*eax),

"=b" (*ebx),

"=c" (*ecx),

"=d" (*edx)

: "0" (op));

}

static unsigned int

get_cpu_id()

{

unsigned int *v;

cpuid(0x00000000, &cpu_info.cpuid_level,

(int *)&cpu_info.x86_vendor_id[0],

(int *)&cpu_info.x86_vendor_id[8],

(int *)&cpu_info.x86_vendor_id[4]);

v = (unsigned int *) cpu_info.x86_model_id;

cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);

cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);

cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);

return 0;

}

这样,CPU的信息就存储在cpu_info中。

2. 获得MAC地址

网卡信息是存储在数据结构:

struct ifconf ifc;

中,该结构包含在头文件

#include

中,在编写代码时需要将它包含。获得MAC地址的代买如下:

#define IFRSIZE ( ( int )( size * sizeof( struct ifreq ) ) )

static int

get_mac_addr(void)

{

int sockfd, size = 1;

if (0 > (sockfd = socket( AF_INET, SOCK_DGRAM, IPPROTO_IP))) {

logit(LOG_SYS, LEVEL_ERR, "get_mac_addr: cannot open socket.\n" );

return -1;

}

ifc.ifc_req = NULL;

do {

++size;

/* realloc buffer size until no overflow occurs */

if (NULL == (ifc.ifc_req = realloc( ifc.ifc_req, IFRSIZE))) {

logit(LOG_SYS, LEVEL_ERR, "get_mac_addr: out of memory.\n" );

return -1;

}

ifc.ifc_len = IFRSIZE;

if (ioctl(sockfd, SIOCGIFCONF, &ifc)) {

logit(LOG_SYS, LEVEL_ERR, "get_mac_addr: ioctl SIOCFIFCONF");

return -1;

}

} while (IFRSIZE <= ifc.ifc_len);

ifr = ifc.ifc_req;

for (; ( char * )ifr < ( char * )ifc.ifc_req + ifc.ifc_len; ++ifr) {

if (ifr->ifr_addr.sa_data == ( ifr + 1 )->ifr_addr.sa_data) {

continue; /* duplicate, skip it */

}

if ( ioctl( sockfd, SIOCGIFFLAGS, ifr ) ) {

continue; /* failed to get flags, skip it */

}

/* printf( "Interface: %s\n", ifr->ifr_name );*/

if ( 0 == ioctl( sockfd, SIOCGIFHWADDR, ifr)) {

switch ( ifr->ifr_hwaddr.sa_family ) {

case ARPHRD_NETROM:

case ARPHRD_ETHER:

case ARPHRD_PPP:

case ARPHRD_EETHER:

case ARPHRD_IEEE802:

break;

default:

/* printf( "\n" );*/

continue;

}

mac_addr = ( unsigned char * )&ifr->ifr_addr.sa_data;

if ( mac_addr[0] + mac_addr[1] + mac_addr[2] + mac_addr[3]

+ mac_addr[4] + mac_addr[5] ) {

return 0;

} else {

return -1;

}

}

/* printf( "\n" ); */

} /* end of for */

close(sockfd);

return 0;

}

这样,MAC地址就放在mac_addr中,mac_addr 的定义是:

unsigned char *mac_addr;

3. MD5算法加密

MD5算法其实是一个用来产生随机数的算法,已经有了现成的源码(在RFC中有详细描述),它最主要的接口主要是函数:

UINT4B  md_32(char *string, int length)

该函数传入一串字符串,然后返回一个32字节的带符号位整型数。这里,字符串的内容可以是任意的,而一旦内容固定,那么返回的整型数就是唯一的。于是,我们就可以利用这个函数来验证输入的字符串的正确性。

四 流程

1. 生成license

首先是获得CPU信息,则通过上述代码,将CPU信息存入cpu_info。

其次是获得MAC地址,则通过上述代码,将MAC地址存入mac_addr中,

最后就是调用函数md_32,获得一个随机数,将该随机数写入到某个文件,可以称之为验证码,那么该文件即生成为license文件。

2. 验证license

验证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和验证license的过程,都是在Linux操作系统中生成的。在生成license时,因为CPU和MAC地址的关系,必须在同一台机器上操作,这样带来了很大不方面,而且不利于保密。

一个改进的办法是,将生成license文件的过程拆成两个步骤:

第一步,将获得的CPU和MAC地址信息放入一个文件;

第二步,将文件传递到某个平台,由该平台生成license文件。

这样的好处是,生成license文件的执行程序可以是Linux系统的,也可以是Windows系统下的,而且不需要在同一台机器上运行。

Linux 系统licence,Linux系统中软件简单License的实现相关推荐

  1. linux脚本编写计算器,Shell中编写简单计算器

    #!/bin/bash #2016-2-29 #于虎林 #思路如下 #1,判断有没有输入类容 #2,判断输入的是不是数值 #3,判断输入的运算符 #执行运算符操作 read -t 30 -p &quo ...

  2. linux中daemonize用法,daemonize Unix系统后台守护进程管理软件

    在我们的工作中,很多时候都需要在linux中后台运行程序, 方法1: nohup & 方法2: daemonize Unix系统后台守护进程管理软件 优点:更加正规 后台运⾏更稳定 git c ...

  3. Linux系统中软件管理(rpm命令 本地软件仓库的搭建 dnf软件管理命令 第三方软件的搭建,yum命令)

    一.rpm命令 1.Linux中的软件包类型 [1]DEB 适合UBlinux DBlinux [2]RPM(安装包:无需解压,可直接安装) 适合red had centOS fc [3]ba2|ga ...

  4. linux ssh 推送文件_WinSCP软件双系统(Win-Linux)文件传输教程

    WinSCP软件是windows下的一款使用ssh协议的开源图形化SFTP客户端,也就是一个文件传输的软件,它有什么优点吗,咱们嵌入式开发中经常会将windows中的文件复制到linux系统当中,比较 ...

  5. c linux time微秒_Linux基础知识(Linux系统、Linux中的链表)

    Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...

  6. linux中_Linux基础知识(Linux系统、Linux中的链表)

    Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...

  7. 凤凰系统运行linux,在Deepin操作系统中安装凤凰系统(Phoenix OS)的方法

    以下讲解在Deepin 15.7操作系统中安装凤凰系统(版本是PhoenixOSInstaller_v3.0.6.479_x86_x64.iso),安装方法完全可以借鉴Ubuntu安装凤凰系统(Pho ...

  8. Windows10系统的Linux子系统中安装MySQL数据库心得

    后端开发童鞋们, 自己开发机用的是Windows系统电脑(台式机或笔记本), 而开发的程序和使用的数据库等要运行在Linux服务器上, 这种情况有木有? 提前声明: 本文并不讨论操作系统的比较, 以及 ...

  9. linux自己的软件在安装的时候如何创建快捷方式,在Deepin Linux系统下给AppImage格式软件创建快捷方式的方法...

    如果你想在深度Deepin Linux操作系统下给AppImage格式软件创建快捷方式,那就按以下说明处理,附脚本的方法,同样适用于其他的Linux发行版. 前言 最近下载了一个FreeCAD的软件, ...

最新文章

  1. 6.7级地震!北海道数据中心陷最长停电危机!
  2. html的左侧菜单栏,HTML 之 左侧菜单
  3. 103-PHP定义一个类
  4. MVC5+EF6简单实例---以原有SQLServer数据库两表联合查询为例
  5. 使用XMind打开.mmap文件
  6. WPF 加载PDF文件
  7. 制造业数字化转型存在哪些问题
  8. 组合数 Counting Arrays
  9. 小程序源码:升级版手机检测微信工具
  10. ActiveMQ消费者断开重连
  11. 宽带加速方法!网速提高30%-200%
  12. ArcGIS用土地利用数据导出shp
  13. 电视剧 | 黑镜S5E1 生死搏击
  14. Flash之SM25QH128M、JFM25F32A读写操作FPGA Verilog实现
  15. CentOS7 安装 RabbitMQ 3.6(方法适用于安装任意版本 RabbitMQ)
  16. macOS--使用Boot Camp安装双系统后win10下罗技鼠标蓝牙连接延迟(卡顿、不跟手)的解决办法
  17. 合并多个.npy文件
  18. iOS .car 文件内容提取
  19. ASP.NET教育OA系统源码 教育行业OA系统源码带文档
  20. 华为matebook win+deepin 15.11双系统 + 双显卡 + 使用/卸载大黄蜂方案 + NVIDIA独显驱动安装 + tensorflow-gpu-2.0

热门文章

  1. csapp-bomblab
  2. 隐私为何重要? 哪怕你无所隐瞒
  3. 好听的名字 - 收藏给宝宝起名字用
  4. [除錯]引動過程的目標傳回例外狀況
  5. 关于精简安装office2010的步骤
  6. 支付通道跳转H5 WAP快捷支付
  7. pos机骗局收取押金如何投诉-真实案列解答
  8. 【详解】远程采矿,智慧矿采如何实现
  9. java aes ctr_AES CBC和CTR加解密实例
  10. XMPPFramework开发(四):电子名片