《奧數2000》註冊碼的計算(VB5程式) (6千字)

看雪資料發表於2015-11-15

標 題:《奧數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位數註冊碼。

相關文章