PCPro(PigChamp Pro) v3.0.23註冊碼的計算(VB程式,非常簡單) (3千字)

看雪資料發表於2001-10-08

軟體簡介機序號產生器制:豬場管理軟體,一個專業方面的軟體。VB 6.0程式,CD-KEY為:100-5410,演示版有30天或40次使用的限制,註冊時可以選擇標準版、PLUS版或諮詢顧問版等,程式根據選擇版本的不同產生軟體的序列號,軟體序列號的產生使用了Randomize函式並呼叫了GetVolumeInformationA這個API,因此每臺機器每次產生的的序列號是不同的,那麼我們就不能自動產生序列號以及自動產生註冊碼了。序列號產生後,會根據序列號生成註冊碼並進行註冊比較。但不管什麼版本的序列號,其生成的註冊碼的過程是一樣的,我們的目標就是分析其註冊碼的產生過程。
下載地址:http://www.pigchampinc.com/products/pcprodownload.htm
使用工具:SmartCheck 6.20,IDA Pro 4.15
註冊計算過程:
首先安裝PCPro,執行SmartCheck,配置好SmartCheck後,執行PCPro,軟體執行過程可以在SmartCheck看到,儲存成SmartCheck檔案。用IDA反編譯PCPro.exe,下面為反編譯的結果。需要說明的是,下面的反編譯結果,考慮到篇幅的關係,去掉了無關緊要的語句,因此並不完整,不要將反編譯的內容照抄進行對照,應結合相應的語句標號進行對照。
在SmartCheck中,找到相應click的InputBox函式,向下找len函式,可知該函式的發生是在PCPro.exe的44CAAC處,加上基址400000,則該函式在IDA中就是84CAAC,如下:
:0084CAAC                call    __vbaLenBstr        ====> 序列號的長度
:0084CAC3                call    rtcLeftCharVar      ====> 左取序列號字元,長度不定,即不包含硬碟序列號部分
:0084CAE6                call    __vbaLenBstr        ====> 所取序列號的長度

從84CAFB-84CC1A利用mid函式將所取序列號中的連字元“-”去掉,過程略

:0084CC22                call    __vbaR8Str          ====> 轉為雙精度型
:0084CC27                fstp    qword ptr [ebp-38h]  ====> 存到[ebp-38h]
:0084CC3A                call    __vbaLenBstr        ====> 輸入的註冊碼的長度
:0084CC49                call    __vbaI2I4            ====> 轉為整型

從84CC57-84CD5B利用mid函式分別取輸入的註冊碼各字元,測試是否是數字,如果不是,則給出錯誤資訊,過程略

:0084CD78                call    __vbaR8Str          ====> 輸入的註冊碼轉為雙精度型
:0084CD7D                fstp    qword ptr [ebp-30h]  ====> 存到[ebp-30h]
:0084CD80                fld    qword ptr [ebp-38h]  ====> 調入序列號
:0084CD83                fsub    ds:dbl_407788        ====> 407788的值為56551
:0084CD92                fdiv    ds:dbl_401ED8        ====> 401ED8的值為5
:0084CDBA                fsubr  qword ptr [ebp-38h]  ====> 相減
:0084CDBD                fadd    ds:dbl_407780        ====> 38341
:0084CDC3                fmul    ds:dbl_406470        ====> 乘7
:0084CDD3                fstp    qword ptr [ebp-0C4h] ====> 存到[ebp-0C4h]
:0084CDD9                fld    qword ptr [ebp-38h]  ====> 調入
:0084CDDC                fadd    ds:dbl_407778        ====> 48342
:0084CDEB                fdiv    ds:dbl_401D68        ====> 除以2
:0084CE0A                call    __vbaFPInt
:0084CE0F                fsubr  qword ptr [ebp-0C4h] ====> 相減
:0084CE1B                call    __vbaFpR8
:0084CE20                fcomp  qword ptr [ebp-30h]  ====> 進行比較

在SmartCheck中,84CE1B中的值是可看到的,也就是該註冊碼,但由於該註冊碼太長,在SmartCheck中是用科學記數法顯示的,因而不能看到全部的數字。
計算過程:設生成的要參與計算的序列號為sn
((sn-int((sn-56551)/5)+38341)*7)-int((sn+48342)/2)
例如:序列號為84802-47223-824-9654,則左取的字元sn為8480247223824,經上面計算註冊碼為43249261164894,測試一下,註冊成功,做個註冊器,選擇不同版本反覆註冊,均註冊成功。
該軟體如果輸入的註冊碼不對,會退出,但其中還有一個計算,則是輸入該註冊碼後,不會退出,又變成Unregisted版,有興趣的可以試試找出來,很簡單的。

相關文章