史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
註冊帳號 論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2006-01-30, 11:13 AM   #1
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:66 | 在線時長:4668小時 | 升級還需:89小時級別:66 | 在線時長:4668小時 | 升級還需:89小時級別:66 | 在線時長:4668小時 | 升級還需:89小時級別:66 | 在線時長:4668小時 | 升級還需:89小時級別:66 | 在線時長:4668小時 | 升級還需:89小時級別:66 | 在線時長:4668小時 | 升級還需:89小時
註冊日期: 2002-12-07
文章: 8057
精華: 0
現金: 15716 金幣
資產: 20346 金幣
預設 序號產生器的實作 教學

這裡在 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 目前離線  
送花文章: 1180, 收花文章: 3897 篇, 收花: 13746 次
回覆時引用此帖
舊 2006-01-31, 08:19 AM   #2 (permalink)
長老會員
 
羅迪 的頭像
榮譽勳章
UID - 2782
在線等級: 級別:61 | 在線時長:4072小時 | 升級還需:20小時級別:61 | 在線時長:4072小時 | 升級還需:20小時級別:61 | 在線時長:4072小時 | 升級還需:20小時級別:61 | 在線時長:4072小時 | 升級還需:20小時級別:61 | 在線時長:4072小時 | 升級還需:20小時級別:61 | 在線時長:4072小時 | 升級還需:20小時
註冊日期: 2002-12-06
住址: 香港
文章: 1002
精華: 0
現金: 9138 金幣
資產: 365806 金幣
預設

mini大大,可否作一個使用實例?
__________________
羅迪 目前離線  
送花文章: 1746, 收花文章: 419 篇, 收花: 1764 次
回覆時引用此帖
舊 2006-02-01, 02:10 PM   #3 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:66 | 在線時長:4668小時 | 升級還需:89小時級別:66 | 在線時長:4668小時 | 升級還需:89小時級別:66 | 在線時長:4668小時 | 升級還需:89小時級別:66 | 在線時長:4668小時 | 升級還需:89小時級別:66 | 在線時長:4668小時 | 升級還需:89小時級別:66 | 在線時長:4668小時 | 升級還需:89小時
註冊日期: 2002-12-07
文章: 8057
精華: 0
現金: 15716 金幣
資產: 20346 金幣
預設

引用:
作者: 羅迪
mini大大,可否作一個使用實例?
http://www.slime2.com.tw/forums/show...45#post1472045
那個範例也就是驗證
mini 目前離線  
送花文章: 1180, 收花文章: 3897 篇, 收花: 13746 次
回覆時引用此帖
發文 回覆


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 07:58 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2014, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1