Green Tea 2.60註冊碼演算法分析 (3千字)

看雪資料發表於2000-07-17

Green Tea 2.60註冊碼演算法
文章作者:wind[CCG]
作者主頁:http://biggow.8u8.com
作者E-mail:biggow@eastday.com
歡迎轉載,但請保持原文完整性!
看完此文,希望大家可以寫出序號產生器,應該不是很難!

:0046A029 E8EE9BF9FF              call 00403C1C
:0046A02E 8BD0                    mov edx, eax
:0046A030 85D2                    test edx, edx
:0046A032 7E14                    jle 0046A048
:0046A034 B801000000              mov eax, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046A046(C)
|
:0046A039 8B4DF0                  mov ecx, dword ptr [ebp-10]
:0046A03C 0FB64C01FF              movzx ecx, byte ptr [ecx+eax-01]
:0046A041 0FAFD9                  imul ebx, ecx
:0046A044 40                      inc eax
:0046A045 4A                      dec edx
:0046A046 75F1                    jne 0046A039
------------------------->上面這段程式,是將你輸入的註冊名,把註冊名每個字元的Ascii碼算出
然後,將每個字元的Ascii碼相乘,得到一個積(在這裡給這個乘積取一個變數名S)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046A032(C)
|
:0046A048 83C364                  add ebx, 00000064------->就是把乘積S加上64,
                                                          假設A=S+64(這裡都是十六進位制數)
:0046A04B 8BC3                    mov eax, ebx-------->把算出的A移入暫存器eax中!
:0046A04D 99                      cdq-------->判斷eax中的值是否大於80000000,如果大於80000000那麼
                                                edx=ffffffff,反之,edx=00000000
:0046A04E 33C2                    xor eax, edx------>把eax和edx做異或操作,也就是把A變數的值和
                                                    ffffffff或00000000作異或操作
                                                    如果edx=00000000的話,異或後eax的值保持
                                                    不變!
:0046A050 2BC2                    sub eax, edx------->eax=eax-edx,也就是把異或出來的
                                                      值去減FFFFFFFF或00000000
                                                      如果edx=00000000的話,eax的值保持不變
:0046A052 8BF8                    mov edi, eax
:0046A054 8BC7                    mov eax, edi
:0046A056 8D951CFEFFFF            lea edx, dword ptr [ebp+FFFFFE1C]
:0046A05C E813D0F9FF              call 00407074
:0046A061 8B951CFEFFFF            mov edx, dword ptr [ebp+FFFFFE1C]
:0046A067 8B86F8010000            mov eax, dword ptr [esi+000001F8]

演算法總結:這個軟體的註冊部分就是把你輸入的註冊名的每個字元都轉成相應的Ascii碼!
然後,把每個字元的Ascii碼相乘,得到這個乘積S,再把它加上64,然後把這個值放到eax中,然後
用cdq這個指令來判斷eax的值是否大於80000000,如果大於,那麼edx=ffffffff,否則,
edx=00000000
然後,把eax也就是A和00000000或ffffffff做異或,把異或出來的值放到eax裡去!
再用eax的值去減去了edx也就是00000000或ffffffff!

執行cdq這個指令的時候,eax小於80000000,那麼edx=00000000,那麼這個A轉換成十進位制
數後就是註冊碼!

為了說明清楚,就舉個簡單的例子:
我要的註冊名:wind
要轉換的字元:  w  i  n  d
      Ascii:  77 69  6E  64
chengji=77*69*6E*64;用計算器計算,得到chengji=8313E88
zonghe=chengji+64;計算後得到zonghe=8313EEC
由於8313EEC小於80000000,所以,edx=00000000
由於和00000000異或(後面的sub eax,edx,一個數減0當然不變啦!),所以,zonghe不變,仍然等於8313EEC
將8313EEC轉換成十進位制數就是註冊碼
8313EEC轉成十進位制為137445100

最後整理出
註冊名:wind  註冊碼:137445100

如果zonghe這個變數大於80000000的話,edx=ffffffff,就有一個異或過程,也就是說異或後的值會改變!
還有最後要加上1(因為sub eax,edx碼!)


xor(異或):也就是必須兩個相反的數才會得1,只有0和1出現的時候,結果才會為1,如果是0和0或者1和1
這個結果只能是0!


很久沒有寫東西了,希望大家對我粗糙的文筆表示諒解,也希望大家能夠明白我的意思!
如果你讀了這篇文章之後,寫出了序號產生器,別忘了,提一下我的名字:wind[CCG]
以及我的網站:biggow.8u8.com!宣傳一下!

                                                          wind
                                                  China Cracking Group
                                                      2000.7.16.

相關文章