標 題:《奧數2000》註冊碼的計算(VB5程式)
發信人:laoqian
軟體簡介機序號產生器制:奧數2000未註冊時只有“考試介紹”等功能。當您註冊後成為註冊使用者時,下一步視窗的多個子視窗:“奧數課堂”
、“招生考試及競賽”、“奧賽2001”等可供使用。它們包括初、中、高階奧數訓練題及重點初中招生考試試題, 試題包括圖形、計算等多種形式試題,題庫將有兩千多道精選試題供您使用。VB
5.0程式,註冊時程式根據硬碟序列號不同產生軟體的序列號,因此每臺機器每次產生的的序列號是不同的,我們的目標就是分析其註冊碼的產生過程,作序號產生器。
使用工具:SmartCheck 6.20
註冊計算過程:
首先安裝《奧數2000》,執行SmartCheck,配置好SmartCheck後,load奧數2000,進入註冊視窗,顯示“本機硬體程式碼”:010061134(這是我的機,你的肯定不一樣)在“本軟體作者提供的註冊碼
”填入:123456789(註冊碼當然是假的,只是為了好記,必須9位,有提示) 再按註冊,這時跳出一個對話方塊.....,退出《奧數2000》。然後,再次load奧數2000,直到見到註冊提示視窗。
切換到NuMega SmartCheck的主視窗。 軟體執行過程可以在SmartCheck看到,
展開Image1_Click。(就是前面帶+的Click)
我們來到 “Form11 (Form) created”,往下看:
Text4.Text <-- "010" (String)
String "010"
Integer
(1) --> Long (1)
Integer 1
Long 1
......來到
Integer (6)
--> Long (6)
Integer 6
Long 6
Text4.Text <-- "010061134" (String)
String "010061134"
<======這是我的“本機硬體程式碼”,往下看:
這時需要展開詳細資訊,你不會?我X
Mid(VARIANT:String:"010061134..", long:4, VARIANT:Integer:6)
Arguments
--------------------
string (variant)
String
.bstrVal = 00615654
= "010061134"
Long length = 4 0x00000004 <======從第4位開始
start
(variant)
Integer .iVal = 6 0x0006
<======取6個數字
__vbaVarMove(VARIANT:String:"061134", VARIANT:Empty)
returns DWORD:83F784
Arguments
--------------------
pSource
(variant)
unsigned short * .bstrVal = 0061560C
= "061134" <======取6個數字得到
pDest (variant)
unsigned short .vt = 0 0x0000
<======"061134"為計算註冊碼的關鍵數
............
再往下看:
Text2.Text
Mid(VARIANT:String:"loca=123...", long:6, VARIANT:Integer:6)
Arguments
--------------------
string (variant)
String
.bstrVal = 007102C4
= "loca=123456789
<======這是我的假“註冊碼”,往下看:
"
Long length = 6 0x00000006
start (variant)
Integer .iVal = 6 0x0006
__vbaVarMove(VARIANT:String:"123456",
VARIANT:Empty) returns DWORD:83F81C
Arguments
--------------------
pSource (variant)
unsigned short * .bstrVal = 00615654
= "123456"
<======取前6個數字
pDest (variant)
unsigned
short .vt = 0 0x0000
<======"123456"以後會與"061134"計算出的註冊碼比較
....................
__vbaVarMul(VARIANT:String:"061134", VARIANT:Integer:18)
<======乘法
Arguments
--------------------
lhs (variant)
unsigned short * .bstrVal = 0061560C
= "061134"
rhs (variant)
signed short .iVal
= 18 0x0012 <======061134*18
__vbaVarMul returns DWORD:83F734
__vbaVarAdd(VARIANT:Double:1.10041e+006, VARIANT:Long:2498699) returns DWORD:83F724
<======加法
Arguments
--------------------
lhs (variant)
double .dblVal = 1100412. <====== 061134*18=1100412
rhs (variant)
signed long .lVal = 2498699 0x0026208B
<====== 1100412+2498699
__vbaVarMove(VARIANT:Double:3.59911e+006,
VARIANT:Empty) returns DWORD:83F774
Arguments
--------------------
pSource (variant)
double .dblVal = 3599111. <======
1100412+2498699=3599111
pDest (variant)
unsigned short
.vt = 0 0x0000
...............
Mid(VARIANT:Double:3.59911e+006, long:2,
VARIANT:Integer:6)
Arguments
--------------------
string (variant)
double .dblVal = 3599111.
Long length = 2 0x00000002
<======從第2位開始
start (variant)
Integer
.iVal = 6 0x0006 <======取6個數字
Mid
__vbaVarMove(VARIANT:String:"599111",
VARIANT:Empty) returns DWORD:83F7CC
Arguments
--------------------
pSource (variant)
unsigned short * .bstrVal = 006156E4
= "599111"
<======取6個數字得到我雞的關鍵數
pDest (variant)
unsigned
short .vt = 0 0x0000
..............
再往下看:怎樣對待"599111",找到以下mid
Mid(VARIANT:String:"599111", long:1, VARIANT:Integer:1)
Arguments
--------------------
string (variant)
String
.bstrVal = 006156E4
= "599111"
Long
length = 1 0x00000001 <======取"599111"的第1位數
start (variant)
Integer .iVal = 1 0x0001
Mid(VARIANT:String:"599111", long:3, VARIANT:Integer:1)
Arguments
--------------------
string (variant)
String .bstrVal
= 006156E4
= "599111"
Long
length = 3 0x00000003 <======取"599111"的第3位數
start (variant)
Integer .iVal = 1 0x0001
Mid(VARIANT:String:"599111",
long:5, VARIANT:Integer:1)
Arguments
--------------------
string (variant)
String .bstrVal = 006156E4
= "599111"
Long length = 5 0x00000005
<======取"599111"的第5位數
start (variant)
Integer .iVal = 1 0x0001
Mid(VARIANT:String:"599111",
long:2, VARIANT:Integer:1)
Arguments
--------------------
string (variant)
String .bstrVal = 006156E4
= "599111"
Long length = 2 0x00000002
<======取"599111"的第2位數
start (variant)
Integer .iVal = 1 0x0001
Mid(VARIANT:String:"599111",
long:4, VARIANT:Integer:1)
Arguments
--------------------
string (variant)
String .bstrVal = 006156E4
= "599111"
Long length = 4 0x00000004
<======取"599111"的第4位數
start (variant)
Integer .iVal = 1 0x0001
Mid(VARIANT:String:"599111",
long:6, VARIANT:Integer:1)
Arguments
--------------------
string (variant)
String .bstrVal = 006156E4
= "599111"
Long length = 6 0x00000006
<======取"599111"的第6位數
start
(variant)
Integer .iVal = 1 0x0001
.......
__vbaVarMove(VARIANT:String:"591911", VARIANT:Empty) returns DWORD:83F7BC
Arguments
--------------------
pSource (variant)
unsigned short * .bstrVal = 00615794
= "591911" <======由上面得到我雞的關鍵數
pDest
(variant)
unsigned short .vt = 0 0x0000
............
再往下看:怎樣對待"591911",找到以下:
__vbaVarTstEq(VARIANT:String:"591911",
VARIANT:String:"123456") returns DWORD:0
Arguments
--------------------
lhs (variant)
unsigned short * .bstrVal = 00615794
= "591911"
rhs (variant)
unsigned short * .bstrVal = 00615654
=
"123456"
<======"591911"與"123456"比較是否相等,相等即註冊成功!!!
看明白了嗎,我的註冊碼為9位數"591911***",其中*為任意字元
至於序號產生器,我就不寫了。
序號產生器演算法:
“本機硬體程式碼”為A(例如,010061134),從A第4位開始取6個數字得到B(061134),C=B*18+2498699
從C第2位開始取6個數字得到D(六位數),依次取D的1,3,5,2,4,6位,組成新數E,再在E的末尾加3個任意字元,得到你機的9位數註冊碼。