• 标 题:Green Tea 2.60注册码算法分析 (3千字)
  • 作 者:wind[CCG]
  • 时 间:2000-7-17 12:42:37
  • 链 接:http://bbs.pediy.com

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.