【文章标题】: ColorPicker注册过程分析
【文章作者】: HappyTown
【作者邮箱】: wxr277@163.com
【作者主页】: www.pediy.com
【软件名称】: ColorPicker 2.0.6
【软件大小】: 607K
【下载地址】: 附件内或网上搜索
【加壳方式】: ASPack 2.11 -> Alexey Solodovnikov
【保护方式】: 序列号
【编写语言】: Borland Delphi 6.0
【使用工具】: OllyDbg,PEiD,ResScope,DeDe,字符串计算器(我自己写的一个工具)
【操作平台】: WinAll?
【软件介绍】: 用于获取屏幕上各处颜色值的好软件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  1.脱壳
        安装后用PEiD察看,得知软件采用ASPack 2.11 -> Alexey Solodovnikov加壳,用PEiD插件轻松脱掉并选择重建IAT即可。
  
  2.察看是否采用成熟加密算法  
        PEiD察看了一下,软件使用了BASE64、CAST-128/256和SHA1算法,心中一乐,呵呵,有点玩头。
        随后令人大跌眼镜的是,虽然这个软件采用了成熟加密算法,却用在了不合适的地方,导致加密失败,更要命的是它还用的是明码比较。
  
  3.用ResScope和DeDe察看相关信息
        可得知点击注册"OK"按钮后的Click事件地址在004A02D4,就在这里下断点,同时导出map文件用于OllyDbg分析。
  
  4.跟踪分析
        OllyDbg载入脱壳后文件并加载map文件。
  
  Name:happy
  RegKey:7654321
  点击注册的"OK"按钮,被断。
  
  004A02D4 >  55              push ebp                            ; <-Tabout@FlatButton2Click
  004A02D5    8BEC            mov ebp,esp
  004A02D7    B9 05000000     mov ecx,5
  004A02DC    6A 00           push 0
  004A02DE    6A 00           push 0
  004A02E0    49              dec ecx
  004A02E1  ^ 75 F9           jnz short colorpic.004A02DC
  004A02E3    51              push ecx
  004A02E4    53              push ebx
  004A02E5    8945 FC         mov dword ptr ss:[ebp-4],eax
  004A02E8    33C0            xor eax,eax
  004A02EA    55              push ebp
  004A02EB    68 08054A00     push <colorpic.->System.@HandleFina>
  004A02F0    64:FF30         push dword ptr fs:[eax]
  004A02F3    64:8920         mov dword ptr fs:[eax],esp
  004A02F6    8D55 E4         lea edx,dword ptr ss:[ebp-1C]
  004A02F9    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A02FC >  8B80 18030000   mov eax,dword ptr ds:[eax+318]      ; *FlatEdit1:N.A.
  004A0302 >  E8 8D62F9FF     call colorpic.00436594              ; ->Controls.TControl.GetText(TControl):TCaption;
  004A0307    8B45 E4         mov eax,dword ptr ss:[ebp-1C]
  004A030A    8D55 F8         lea edx,dword ptr ss:[ebp-8]
  004A030D >  E8 B685F6FF     call colorpic.004088C8              ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
  004A0312    8D55 E0         lea edx,dword ptr ss:[ebp-20]
  004A0315    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A0318 >  8B80 1C030000   mov eax,dword ptr ds:[eax+31C]      ; *FlatEdit2:N.A.
  004A031E >  E8 7162F9FF     call colorpic.00436594              ; ->Controls.TControl.GetText(TControl):TCaption;
  004A0323    8B45 E0         mov eax,dword ptr ss:[ebp-20]
  004A0326    8D55 F4         lea edx,dword ptr ss:[ebp-C]
  004A0329 >  E8 9A85F6FF     call colorpic.004088C8              ; ->SysUtils.Trim(AnsiString):AnsiString;overload;
  004A032E    837D F8 00      cmp dword ptr ss:[ebp-8],0          ; 判断是否输入了name
  004A0332    0F84 9B010000   je colorpic.004A04D3
  004A0338    8D45 DC         lea eax,dword ptr ss:[ebp-24]
  004A033B    50              push eax
  004A033C    8B4D F8         mov ecx,dword ptr ss:[ebp-8]        ; happy
  004A033F    BA 2E391E00     mov edx,1E392E                      ; 用于计算的常量
  004A0344    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A0347    E8 8C020000     call colorpic.004A05D8              ; 关键call:算出注册码
  004A034C    8B55 DC         mov edx,dword ptr ss:[ebp-24]       : 54036100-378098817-375258124
  004A034F    8B45 F4         mov eax,dword ptr ss:[ebp-C]
  004A0352 >  E8 6945F6FF     call colorpic.004048C0              ; ->System.@LStrCmp;比较假码和真码是否相等
  004A0357    0F85 41010000   jnz colorpic.004A049E
  004A035D    8D55 D4         lea edx,dword ptr ss:[ebp-2C]
  004A0360    33C0            xor eax,eax
  004A0362 >  E8 A926F6FF     call colorpic.00402A10              ; ->System.ParamStr(Integer):String;
  004A0367    8B45 D4         mov eax,dword ptr ss:[ebp-2C]
  004A036A    8D55 D8         lea edx,dword ptr ss:[ebp-28]
  004A036D >  E8 FA88F6FF     call colorpic.00408C6C              ; ->SysUtils.ExtractFilePath(AnsiString):AnsiString;
  004A0372    8B55 D8         mov edx,dword ptr ss:[ebp-28]
  004A0375    8D45 EC         lea eax,dword ptr ss:[ebp-14]
  004A0378    B9 1C054A00     mov ecx,colorpic.004A051C           ; ASCII "ColorPicker.ini"
  004A037D >  E8 4644F6FF     call colorpic.004047C8              ; ->System.@LStrCat3;
  
  可以看出,在这里004A0352进行明码比较,004A034C保存的就是真正注册码,004A034F是我们输入的假码7654321。要做内存注册机,在004A0352下断,取edx的内存字符串即可。
  
  当然,我们要做的还不止此,分析出其注册算法才是我们的目的。
  跟进004A0347的call 004A05D8:
  
  ......
  004A05EB    8955 FC         mov dword ptr ss:[ebp-4],edx        ; 1E392E
  004A05EE    8B45 F8         mov eax,dword ptr ss:[ebp-8]        ; happy
  004A05F1    E8 6E43F6FF     call colorpic.00404964
  004A05F6    33C0            xor eax,eax
  004A05F8    55              push ebp
  004A05F9    68 67074A00     push colorpic.004A0767
  004A05FE    64:FF30         push dword ptr fs:[eax]
  004A0601    64:8920         mov dword ptr fs:[eax],esp
  004A0604    8D45 F4         lea eax,dword ptr ss:[ebp-C]
  004A0607    E8 B83EF6FF     call colorpic.004044C4
  004A060C    33F6            xor esi,esi
  004A060E    837D FC 00      cmp dword ptr ss:[ebp-4],0
  004A0612    0F84 29010000   je colorpic.004A0741
  004A0618    837D F8 00      cmp dword ptr ss:[ebp-8],0
  004A061C    0F84 1F010000   je colorpic.004A0741
  004A0622    8B45 F8         mov eax,dword ptr ss:[ebp-8]
  004A0625    E8 5241F6FF     call colorpic.0040477C
  004A062A    8BD8            mov ebx,eax
  004A062C    85DB            test ebx,ebx
  004A062E    7E 26           jle short colorpic.004A0656
  004A0630    BF 01000000     mov edi,1                           ; 下面根据name长度循环计算得到一个数:esi(abs(十进制)即为Serial1)
  004A0635    8B45 F8         mov eax,dword ptr ss:[ebp-8]        ; //happy
  004A0638    E8 3F41F6FF     call colorpic.0040477C              ; Len(happy)=5
  004A063D    F76D FC         imul dword ptr ss:[ebp-4]           ; eax=5*1E392E=971DE6;...
  004A0640    03F0            add esi,eax                         ; esi=0+971DE6=971DE6;...
  004A0642    8B45 F8         mov eax,dword ptr ss:[ebp-8]        ; happy
  004A0645    0FB64438 FF     movzx eax,byte ptr ds:[eax+edi-1]   ; 68(h)...
  004A064A    69C0 53200000   imul eax,eax,2053                   ; eax=name(i)*0x2053=D21B8;...
  004A0650    03F0            add esi,eax                         ; esi+eax=A43F9E;...
  004A0652    47              inc edi                             ; 2...
  004A0653    4B              dec ebx                             ; 4...
  004A0654  ^ 75 DF           jnz short colorpic.004A0635         ; \\
  004A0656    8BC6            mov eax,esi
  004A0658    99              cdq                                 :取绝对值
  004A0659    33C2            xor eax,edx
  004A065B    2BC2            sub eax,edx
  004A065D    8D55 F4         lea edx,dword ptr ss:[ebp-C]
  004A0660    E8 1783F6FF     call colorpic.0040897C              ; serial1(把esi转化成10进制):54036100
  004A0665    8D45 F4         lea eax,dword ptr ss:[ebp-C]
  004A0668    50              push eax
  004A0669    8B45 F4         mov eax,dword ptr ss:[ebp-C]        ; 54036100
  004A066C    E8 0B41F6FF     call colorpic.0040477C              ; Len(54036100)=8
  004A0671    8BD0            mov edx,eax                         ; 8
  004A0673    83EA 0A         sub edx,0A
  004A0676    B9 0A000000     mov ecx,0A
  004A067B    8B45 F4         mov eax,dword ptr ss:[ebp-C]        ; 54036100
  004A067E    E8 5143F6FF     call colorpic.004049D4
  004A0683    8B45 F8         mov eax,dword ptr ss:[ebp-8]        ; happy
  004A0686    E8 F140F6FF     call colorpic.0040477C
  004A068B    8BD8            mov ebx,eax                         ; 5
  004A068D    85DB            test ebx,ebx
  004A068F    7E 24           jle short colorpic.004A06B5
  004A0691    BF 01000000     mov edi,1
  004A0696    8B45 F8         mov eax,dword ptr ss:[ebp-8]        ;// happy
  004A0699    E8 DE40F6FF     call colorpic.0040477C              ; 取字符串长度的函数
  004A069E    8B55 F8         mov edx,dword ptr ss:[ebp-8]
  004A06A1    0FB6543A FF     movzx edx,byte ptr ds:[edx+edi-1]   ; 68(h)...
  004A06A6    0FAF55 FC       imul edx,dword ptr ss:[ebp-4]       ; edx=68*1E392E=C473AB0;...
  004A06AA    6BD2 53         imul edx,edx,53                     ; edx*53=(3)FB180710;...A1AD2F9A
  004A06AD    03F2            add esi,edx                         ; esi=3388684+FB180710=FE508D94...
  004A06AF    2BF0            sub esi,eax                         ; esi-Len(happy)=FE508D8F...最后:E976AB7F
  004A06B1    47              inc edi
  004A06B2    4B              dec ebx                             :\\
  004A06B3  ^ 75 E1           jnz short colorpic.004A0696
  004A06B5    FF75 F4         push dword ptr ss:[ebp-C]
  004A06B8    68 80074A00     push colorpic.004A0780              ; /下面是取绝对值
  004A06BD    8BC6            mov eax,esi                         ; /eax=E976AB7F;16895481=(not E976AB7F)+1
  004A06BF    99              cdq                                 ; edx(的每一位)=eax的符号位扩展(cdq:Convert Doubleword to 
  Quadword)
  004A06C0    33C2            xor eax,edx
  004A06C2    2BC2            sub eax,edx                         ; \serial2:16895481[十进制378098817]
  004A06C4    8D55 F0         lea edx,dword ptr ss:[ebp-10]
  004A06C7    E8 B082F6FF     call colorpic.0040897C              ; 注册码第二部分:378098817
  004A06CC    FF75 F0         push dword ptr ss:[ebp-10]
  004A06CF    8D45 F4         lea eax,dword ptr ss:[ebp-C]
  004A06D2    BA 03000000     mov edx,3
  004A06D7    E8 6041F6FF     call colorpic.0040483C
  004A06DC    8B45 F8         mov eax,dword ptr ss:[ebp-8]        ; happy
  004A06DF    E8 9840F6FF     call colorpic.0040477C              ; Len(happy)
  004A06E4    8BD8            mov ebx,eax
  004A06E6    85DB            test ebx,ebx
  004A06E8    7E 2D           jle short colorpic.004A0717
  004A06EA    BF 01000000     mov edi,1
  004A06EF    8B45 F8         mov eax,dword ptr ss:[ebp-8]        ;//happy
  004A06F2    E8 8540F6FF     call colorpic.0040477C              ; eax=Len(happy)
  004A06F7    8B55 F8         mov edx,dword ptr ss:[ebp-8]        ; happy
  004A06FA    0FB6543A FF     movzx edx,byte ptr ds:[edx+edi-1]   ; 68(h),61(a)...
  004A06FF    F7EA            imul edx                            ; eax*=68;*61
  004A0701    69C0 3B010000   imul eax,eax,13B                    ; eax*=13B...
  004A0707    03F0            add esi,eax                         ; E976AB7F+27FD8=E9792B57;...E983CAC6
  004A0709    8B45 F8         mov eax,dword ptr ss:[ebp-8]
  004A070C    E8 6B40F6FF     call colorpic.0040477C
  004A0711    03F0            add esi,eax        ;esi+Len(happy)
  004A0713    47              inc edi
  004A0714    4B              dec ebx
  004A0715  ^ 75 D8           jnz short colorpic.004A06EF    ;\\
  004A0717    0375 FC         add esi,dword ptr ss:[ebp-4]        ; esi=E983CAC6+1E392E=E9A203F4
  004A071A    FF75 F4         push dword ptr ss:[ebp-C]           ; 54036100-378098817
  004A071D    68 80074A00     push colorpic.004A0780
  004A0722    8BC6            mov eax,esi                         ; /给E9A203F4取绝对值=serial3(十进制)
  004A0724    99              cdq
  004A0725    33C2            xor eax,edx
  004A0727    2BC2            sub eax,edx                         ; \
  004A0729    8D55 EC         lea edx,dword ptr ss:[ebp-14]
  004A072C    E8 4B82F6FF     call colorpic.0040897C              ; 注册码第三部分:375258124
  
  好了注册码的生成过程出来了,详见注册机源代码。
  
  这里给出两组可用的Name和RegKey:
  
        Name:happy
        RegKey:54036100-378098817-375258124
     注册文件:
        [reginfo]
        userinfo=qxUvU1s=
        licence=9h1UF4GBUVD45Wr0nEZg4eyaHlhKxbMMinOBYw==
  
        Name:HappyTown
        RegKey:168200108-243803457-239163428
     注册文件:
        [reginfo]
        userinfo=iwkpRXaw0kSm
        licence=8gVR5zdgXmUFG7HSBo15KWhF3LLw6uV4bnu24jM=
 
--------------------------------------------------------------------------------
【加密Name和RegKey】 
  下面我简单说一下这个过程:
  ///////////////////////////////////
  qxUvU1s=的形成过程:
  
  密钥在00484600处,长度40h位。
  cast256(name) //在00483CC0处
  把结果和Name(happy)逐字符xor(在00483CCB处)生成Name长度个字节,然后把这几个字节通过移位等简单运算得到相应的数字序列(共Name长度个),最终根据数字序列查表(从004818C8开始的子程序)得到qxUvU1s=
  
  ///////////////////////////////////
  9h1UF4GBUVD45Wr0nEZg4eyaHlhKxbMMinOBYw==的形成过程:
  跟上面的qxUvU1s=的形成过程一模一样(因为调用的是同一个子程序,只是Name换成了RegKey),你可以跟进去看看,详细的跟进分析我就不贴了,仅贴出一部分,我实在太困了。
  
  密钥:
  00484600  AC 69 41 00 8C E5 41 00 C8 68 41 00 64 E6 41 00  琲A.屽A.萮A.d鍭.
  00484610  30 E5 41 00 74 E6 41 00 6C E7 41 00 9C E9 41 00  0錋.t鍭.l鏏.滈A.
  00484620  84 E6 41 00 7C E6 41 00 A4 E9 41 00 80 41 48 00  勬A.|鍭.らA.AH.
  00484630  88 47 48 00 90 47 48 00 78 47 48 00 B4 47 48 00  圙H.怗H.xGH.碐H.
  
  表:
  004A404C  41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50  ABCDEFGHIJKLMNOP
  004A405C  51 52 53 54 55 56 57 58 59 5A 61 62 63 64 65 66  QRSTUVWXYZabcdef
  004A406C  67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76  ghijklmnopqrstuv
  004A407C  77 78 79 7A 30 31 32 33 34 35 36 37 38 39 2B 2F  wxyz0123456789+/
  
  004A0382    8B4D EC         mov ecx,dword ptr ss:[ebp-14]
  004A0385    B2 01           mov dl,1
  004A0387    A1 C0904600     mov eax,dword ptr ds:[4690C0]
  004A038C >  E8 DF8DFCFF     call colorpic.00469170              ; ->AxCtrls.TOleStream.Create(TOleStream;boolean;IStream);<+>
  004A0391    8945 E8         mov dword ptr ss:[ebp-18],eax
  004A0394    33C0            xor eax,eax
  004A0396    55              push ebp
  004A0397    68 97044A00     push <colorpic.->System.@HandleFina>
  004A039C    64:FF30         push dword ptr fs:[eax]
  004A039F    64:8920         mov dword ptr fs:[eax],esp
  004A03A2    6A 00           push 0
  004A03A4    BA 745A4A00     mov edx,colorpic.004A5A74
  004A03A9    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A03AC >  8B80 30030000   mov eax,dword ptr ds:[eax+330]      ; *cast:N.A.//指向密钥地址:00484600
  004A03B2    B9 40000000     mov ecx,40
  004A03B7    8B18            mov ebx,dword ptr ds:[eax]
  004A03B9    FF53 40         call dword ptr ds:[ebx+40]          ; case256初始化
  004A03BC    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A03BF >  8B80 30030000   mov eax,dword ptr ds:[eax+330]      ; *cast:N.A.
  004A03C5    8B10            mov edx,dword ptr ds:[eax]
  004A03C7    FF52 48         call dword ptr ds:[edx+48]          ; 判断是否已经初始化
  004A03CA    8D4D F0         lea ecx,dword ptr ss:[ebp-10]
  004A03CD    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A03D0 >  8B80 30030000   mov eax,dword ptr ds:[eax+330]      ; *cast:N.A.
  004A03D6    8B55 F8         mov edx,dword ptr ss:[ebp-8]        ; happy
  004A03D9    8B18            mov ebx,dword ptr ds:[eax]          ; 指向密钥:00484600
  004A03DB    FF53 54         call dword ptr ds:[ebx+54]          ; 形成qxUvU1s=
  004A03DE    8B45 F0         mov eax,dword ptr ss:[ebp-10]
  004A03E1    50              push eax
  004A03E2    B9 34054A00     mov ecx,colorpic.004A0534           ; ASCII "userinfo"
  004A03E7    BA 48054A00     mov edx,colorpic.004A0548           ; ASCII "reginfo"
  004A03EC    8B45 E8         mov eax,dword ptr ss:[ebp-18]
  004A03EF    8B18            mov ebx,dword ptr ds:[eax]
  004A03F1    FF53 04         call dword ptr ds:[ebx+4]
  004A03F4    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A03F7 >  8B80 30030000   mov eax,dword ptr ds:[eax+330]      ; *cast:N.A.
  004A03FD    8B10            mov edx,dword ptr ds:[eax]
  004A03FF    FF52 48         call dword ptr ds:[edx+48]
  004A0402    8D4D F0         lea ecx,dword ptr ss:[ebp-10]
  004A0405    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A0408 >  8B80 30030000   mov eax,dword ptr ds:[eax+330]      ; *cast:N.A.
  004A040E    8B55 F4         mov edx,dword ptr ss:[ebp-C]        ; 54036100-378098817-375258124
  004A0411    8B18            mov ebx,dword ptr ds:[eax]
  004A0413    FF53 54         call dword ptr ds:[ebx+54]          ; 同样是查表生成下面这串序列
  004A0416    8B45 F0         mov eax,dword ptr ss:[ebp-10]       ; 9h1UF4GBUVD45Wr0nEZg4eyaHlhKxbMMinOBYw==
  004A0419    50              push eax
  004A041A    B9 58054A00     mov ecx,colorpic.004A0558           ; ASCII "licence"
  004A041F    BA 48054A00     mov edx,colorpic.004A0548           ; ASCII "reginfo"
  004A0424    8B45 E8         mov eax,dword ptr ss:[ebp-18]
  004A0427    8B18            mov ebx,dword ptr ds:[eax]
  004A0429    FF53 04         call dword ptr ds:[ebx+4]
  004A042C    33C0            xor eax,eax
  004A042E    5A              pop edx
  004A042F    59              pop ecx
  004A0430    59              pop ecx
  004A0431    64:8910         mov dword ptr fs:[eax],edx
  004A0434    68 D3044A00     push colorpic.004A04D3
  004A0439    8B45 E8         mov eax,dword ptr ss:[ebp-18]
  004A043C >  E8 7332F6FF     call colorpic.004036B4              ; ->System.TObject.Free(TObject);
  004A0441    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A0444 >  8B80 18030000   mov eax,dword ptr ds:[eax+318]      ; *FlatEdit1:N.A.
  004A044A    33D2            xor edx,edx
  004A044C    8B08            mov ecx,dword ptr ds:[eax]
  004A044E    FF51 64         call dword ptr ds:[ecx+64]
  004A0451    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A0454 >  8B80 1C030000   mov eax,dword ptr ds:[eax+31C]      ; *FlatEdit2:N.A.
  004A045A    33D2            xor edx,edx
  004A045C    8B08            mov ecx,dword ptr ds:[eax]
  004A045E    FF51 64         call dword ptr ds:[ecx+64]
  004A0461    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A0464 >  8B80 20030000   mov eax,dword ptr ds:[eax+320]      ; *FlatButton2:N.A.
  004A046A    33D2            xor edx,edx
  004A046C    8B08            mov ecx,dword ptr ds:[eax]
  004A046E    FF51 64         call dword ptr ds:[ecx+64]
  004A0471    8B45 FC         mov eax,dword ptr ss:[ebp-4]
  004A0474 >  8B80 08030000   mov eax,dword ptr ds:[eax+308]      ; *Label24:N.A.
  004A047A    33D2            xor edx,edx
  004A047C >  E8 4361F9FF     call colorpic.004365C4              ; ->Controls.TControl.SetText(TControl;TCaption);
  004A0481    6A 00           push 0
  004A0483    66:8B0D 60054A0>mov cx,word ptr ds:[4A0560]
  004A048A    B2 02           mov dl,2
  004A048C    B8 6C054A00     mov eax,colorpic.004A056C           ; ASCII "Register successfully."
  004A0491    E8 E2FBF8FF     call colorpic.00430078
  004A0496    C3              retn
  
--------------------------------------------------------------------------------
【注册机源代码】 
  注意:该源代码在Dev-C++ 4.9.9.2 + WindowsXP SP2下编译运行通过,你如果使用VC++,可能还需添加"stdafx.h"头文件。 
  
    /*----------------------------------------------------*/
    /*    Software:[ColorPicker v2.06] KeyGen            */
    /*    Author:HappyTown                               */
    /*    Date:2006-08-01                                */
    /*----------------------------------------------------*/
    
    #include "math.h"
    #include "string.h"
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXINPUTLEN 200
    #define CONSTANT 0x1E392E
    
    int main(int argc, char* argv[])
    {  
      int intNameLen,i;
      long lKey_1=0,lKey_2=0,lKey_3=0;
      char szName[MAXINPUTLEN]={0};
    
      printf("\n        /*----------------------------------------------------*/\n");
      printf("        /*                                                    */\n");
      printf("        /*        Software:[ColorPicker v2.06] KeyGen        */\n");
      printf("        /*        Author:HappyTown                           */\n");
      printf("        /*        Date:2006-08-01                            */\n");
      printf("        /*                                                    */\n");
      printf("        /*----------------------------------------------------*/\n\n\n");
    
      //Get Ur name and its length.
      printf("        Input your name: ");
      scanf("%s",&szName);
      intNameLen=strlen(szName);
      
      
      //Get the first part of the Key
      for (i=0;i<intNameLen;i++)
      {    
        lKey_1+=intNameLen*CONSTANT;
        lKey_1+=szName[i]*0x2053;  
      }
      lKey_2=lKey_1;    //Transport the value before abs.
      lKey_1=abs(lKey_1);
    
    
      //Get the second part of the Key  
      for (i=0;i<intNameLen;i++)
      {
        lKey_2+=szName[i]*CONSTANT*0x53;
        lKey_2-=intNameLen;
      }
      lKey_3=lKey_2;
      lKey_2=abs(lKey_2);
    
    
      //Get the third part of the Key  
      for (i=0;i<intNameLen;i++)
      {
        lKey_3+=0x13B*intNameLen*szName[i]+intNameLen;
      }
      lKey_3=abs(lKey_3+CONSTANT);
    
      printf("\n        Registration key:  %d-%d-%d\n\n\n\n\n",lKey_1,lKey_2,lKey_3);
    
      system("PAUSE");
      return 0;
    }
  
--------------------------------------------------------------------------------
【经验总结】
  太好笑了,居然有这种加密方法!还有,SHA1根本就没有用。
  在实际中,的确有很多共享软件作者不懂加密算法,拿来别人的加密块不管三七二十一直接就用,连基本的使用知识都不知
  道,加密岂能不失败。
  还是那句话,劝这些作者们学习些基本的加密算法理论。只有知己知彼,才能百战不殆。

  多说一句话,其实注册机我前几天就做好了,只是现在连忙带懒,才一拖再拖写出了这篇教程,唉...
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年08月03日 2:08:20