這裡在 Yahoo知識+ 看到一則
因此直接(拿來用)貼出來
PHP 語法:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char name[80];
int name_len,i;
int sn1=0;
unsigned long sn2=0x654789;
system("cls");//clrscr();
printf("please input you name:");
gets(name);
name_len=strlen(name);
if (name_len>5)
{
for (i=0;i<name_len;i++)
{
sn1=sn1+name[i]*4;
sn2=(3*sn2)-4;
}
printf("Serial is:BS-%lX-%d\n",sn2,sn1);
}
else{
printf("name must longer than 5 letters!\n");
}
printf("Power by POW ^_^\n");
system("PAUSE");
return EXIT_SUCCESS;
}
上面程式限制需輸入至少6個英數字
而利用特製的算式
sn2=0x654789
sn1=sn1+name[i]*4;
sn2=(3*sn2)-4;
使序號有一定的特性
但
一個 name 只有一組唯一的序號
無法像一些專門的破解團體製作的製序號產生器一般
按一下就算出一組新的
此時我們可以用亂數 rnd 來加入運算式達到目的
只是此時會有一個問題
在驗證之應用上如何解決呢
(驗證有兩個方法,一為用同一個運算式,一為反運算式 來驗證結果)
不過此時我們只要把握 rnd 的特性
"設定亂數種子表"
就好了
C/C++ 我們可使用 srand
對應檔案自己就使用
handle=open("軟體自己.exe", O_BINARY);
srand(filelength(handle));
因為相同檔案大小的軟體機會甚微
如此可說就達到唯一性的特性
(那如何作驗證呢,將開另一篇主體...)
最後寫一實例
PHP 語法:
#include <cstdlib>
#include <iostream>
#include <fcntl.h>
#define ASCII_NUM 3
#define MULTIPLY_VALUE 2
using namespace std;
int main(int argc, char *argv[])
{
int i, no=0;
char key[ASCII_NUM+ASCII_NUM*MULTIPLY_VALUE+2]="0"; //計: 3個英文 + "-" + 6個阿拉伯數字 + '\0'
char *name;
int handle;
cout << "Name: ";
gets(name);
for(i=0; i<strlen(name) ;i++){
//cout << (int)name[i] << endl;
no+=name[i];
}
//cout << no << endl;
try{
handle= open("key.exe", O_BINARY);
srand(filelength(handle)+no);
close(handle);
}
catch(std::exception &e){ }
for(int j=0; j<3; j++){
no=0;
for(i=0; i<ASCII_NUM ;i++){
key[no++]= (char)(rand()%26 +65); //轉成英文字母
}
key[no++]= '-';
for(i=0; i<(ASCII_NUM*MULTIPLY_VALUE) ;i++){
key[no++]= (char)(rand()%10 +48); //轉成阿拉伯數字
}
cout << "Serial is: " << key << endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
以上藉由
#define ASCII_NUM 3
#define MULTIPLY_VALUE 2
來控制序號格式
輸入一個name 試算出三組序號
序號產生器其實與軟體序號驗證是一體兩面
只要稍加修改就可崁入軟體啟用程序中
有自己寫軟體的朋友門可以直接拿上述程式崁入應用
有問題的版友也歡迎就此篇疑慮提出問題
希望大家會喜歡~thx~