查看單個文章
舊 2006-01-30, 11:13 AM   #1
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:97 | 在線時長:9881小時 | 升級還需:115小時級別:97 | 在線時長:9881小時 | 升級還需:115小時級別:97 | 在線時長:9881小時 | 升級還需:115小時級別:97 | 在線時長:9881小時 | 升級還需:115小時級別:97 | 在線時長:9881小時 | 升級還需:115小時級別:97 | 在線時長:9881小時 | 升級還需:115小時級別:97 | 在線時長:9881小時 | 升級還需:115小時
註冊日期: 2002-12-07
文章: 13350
精華: 0
現金: 26465 金幣
資產: 3024345 金幣
預設 序號產生器的實作 教學

這裡在 Yahoo知識+ 看到一則
因此直接(拿來用)貼出來
PHP 語法:
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argcchar *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 argcchar *argv[])
{
int ino=0;
char key[ASCII_NUM+ASCII_NUM*MULTIPLY_VALUE+2]="0"//計: 3個英文 + "-" + 6個阿拉伯數字 + '\0'
char *name;
int handle;

cout << "Name: ";
gets(name);
for(
i=0i<strlen(name) ;i++){
    
//cout << (int)name[i] << endl;
    
no+=name[i];
}
//cout << no << endl;

try{
    
handleopen("key.exe"O_BINARY);
    
srand(filelength(handle)+no);
    
close(handle);
}
catch(
std::exception &e){ }

for(
int j=0j<3j++){
    
no=0;
    
    for(
i=0i<ASCII_NUM ;i++){
      
key[no++]= (char)(rand()%26 +65); //轉成英文字母 
    
}
    
key[no++]= '-';
    for(
i=0i<(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~
mini 目前離線  
送花文章: 2014, 收花文章: 8005 篇, 收花: 26810 次
回覆時引用此帖