工作需要,限定工具使用日期,同时防止程序拷贝到其它机器上直接使用,故需绑定mac,IP,和授权日期。
基本思路:
1、授权程序,获取mac地址,IP地址,及提供的授权日期等信息,编码后入到注册表中。
2、工具在运行时,获取本机mac,IP地址,及当前日期,与注册表中的内容(取出来后反编码)进行比较。如果mac地址和IP地址均正确,则判断授权日期是否有效。任一项不满足,均不允许软件的使用。
简单粗暴,下面直接提供授权程序的源代码:
1 argc = %0% 2 If argc != 1 3 { 4 MsgBox, 16, 系统提示, 提供的参数错误。`n使用格式:SoftAuth.exe YYYY-MM-DD`n例如:SoftAuth.exe 2016-12-31 5 ExitApp 6 } 7 ; 获取参数1 8 arg1 = %1% 9 ;MsgBox, 0, 传递的参数, % arg1 10 ; 判断参数是否为日期格式 11 If IsDate(arg1) = 0 12 { 13 MsgBox, 16, 系统提示, 提供的参数错误。`n使用格式:SoftAuth.exe YYYY-MM-DD`n例如:SoftAuth.exe 2016-12-31 14 ExitApp 15 } 16 17 MacFile := % A_Temp "\Mac.info" 18 IpFile := % A_Temp "\Ip.info" 19 ;获取mac地址 20 run, %ComSpec% /c ipconfig /all |findstr "物理地址" > %MacFile%, ,hide 21 22 ;获取ip地址 23 run, %ComSpec% /c ipconfig /all |findstr "IPv4" > %IpFile% , ,hide 24 25 ;取出mac+ip 26 StrMac = %A_Space% 27 Loop 28 { 29 FileReadLine, line, %MacFile%, %A_Index% 30 if ErrorLevel 31 break 32 RegExMatch(line,"([0-9A-Fa-f]{2}-){5}[0-9A-Fa-f]{2}", matchMac) 33 StrMac := % StrMac matchMac 34 } 35 StringReplace, NewMac, StrMac, -,, ALL 36 37 StrIp = %A_Space% 38 Loop 39 { 40 FileReadLine, line, %IpFile%, %A_Index% 41 if ErrorLevel 42 break 43 RegExMatch(line,"(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})", matchIp) 44 StrIp := % StrIp matchIp 45 } 46 StringReplace, NewIP, StrIp, -,, ALL 47 StringReplace, NewIP, NewIP, .,, ALL 48 49 ;加上有效日期 50 AllInfo := % NewIP NewMac arg1 51 52 ;对字符串加密 53 加密后串 := % RC4(AllInfo, "har@123") 54 解密后串 := % RC4(加密后串, "har@123") 55 56 ;写注册表 57 RegWrite, REG_SZ, HKCU, Software\Microsoft\HAR, AuthInfo, % 加密后串 58 59 ;读注册表 60 ;RegRead, regvalue, HKCU, Software\Microsoft\HAR, AuthInfo 61 ;解密regvalue := % RC4(regvalue, "har@123") 62 63 ;MsgBox, 64, 读注册表, % "读出串regvalue:" regvalue "`n解密regvalue:`n" 解密regvalue "`n原串:`n" AllInfo 64 ;删除临时文件 65 FileDelete, % MacFile 66 FileDelete, % IpFile 67 68 MsgBox, 64, 系统提示, 软件授权成功。授权日期截止到:%arg1% 69 Return 70 71 ;判断是否为日期格式 72 IsDate(Str) 73 { 74 ;RegExMatch(Str, "(\d{4})-(0\d{1}|1[0-2])-(0\d{1}|[12]\d{1}|3[01])", A) 75 RegExMatch(Str, "(\d{4}-\d{2}-\d{2})", A) 76 Return ( A = Str) 77 } 78 79 80 ;___RC4 Encryption by Rajat__________字符串加密算 81 ;使用!----------------------- 82 ;密文 := RC4(原文,密钥) 83 ;解密 := RC4(密文,密钥) 84 RC4(RC4Data,RC4Pass) 85 { 86 global RC4Result 87 ATrim = %A_AutoTrim% 88 AutoTrim, Off 89 BLines = %A_BatchLines% 90 SetBatchLines, -1 91 StringLen, RC4PassLen, RC4Pass 92 Loop, 256 93 { 94 a := A_Index - 1 95 Transform, ModVal, Mod, %a%, %RC4PassLen% 96 ModVal ++ 97 StringMid, C, RC4Pass, %ModVal%, 1 98 Transform, AscVar, Asc, %C% 99 Key%a% = %AscVar% 100 sBox%a% = %a% 101 } 102 b = 0 103 Loop, 256 104 { 105 a := A_Index - 1 106 TempVar := b + sBox%a% + Key%a% 107 Transform, b, Mod, %TempVar%, 256 108 T := sBox%a% 109 sBox%a% := sBox%b% 110 sBox%b% = %T% 111 } 112 StringLen, DataLen, RC4Data 113 RC4Result = 114 i = 0 115 j = 0 116 Loop, %DataLen% 117 { 118 TmpVar := i + 1 119 Transform, i, Mod, %TmpVar%, 256 120 TmpVar := sBox%i% + j 121 Transform, j, Mod, %TmpVar%, 256 122 TmpVar := sBox%i% + sBox%j% 123 Transform, TmpVar2, Mod, %TmpVar%, 256 124 k := sBox%TmpVar2% 125 StringMid, TmpVar, RC4Data, %A_Index%, 1 126 Transform, AscVar, Asc, %TmpVar% 127 Transform, C, BitXOr, %AscVar%, %k% 128 IfEqual, C, 0 129 C = %k% 130 Transform, ChrVar, Chr, %C% 131 RC4Result = %RC4Result%%ChrVar% 132 } 133 AutoTrim, %ATrim% 134 SetBatchLines, %BLines% 135 Return RC4Result 136 } 137 ;___RC4 Encryption by Rajat_____________________________________
工具运行时,只需从注册表中获取注册信息,进行反编码后解析,并验证即可(授权程序中有相应的源代码,可拷贝下来重复使用来达到目的)。