【软件名称】: 个人日程助手1.0

【软件介绍】: 国产软件 / 共享版 / 信息管理 / 简体中文 /  1184 KB

【软件下载】:http://www2.skycn.com/soft/5282.html 

【保护方式】:注册码 + 功能限制

【破解工具】:Win2003, PEiD, Ollydbg,, 

【破解目的】:研究算法分析

【作者声明】:初学Crack,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

【破解过程】:
侦测:用PEiD查壳 Borland Delphi 6.0 - 7.0 哇没有壳啊,现在没有壳的软件可是真少啊。
 
先运行软件,点“注册”输入注册码,点确定,提示“注册码不正确,请注册申请注册码”

废话少说。。OllyDbg 载入软件, 查找ASCLL字符串,找到“注册码不正确,请注册申请注册码”

双击来到下面:
0047AD7B   .  8B45 E8       MOV EAX,DWORD PTR SS:[EBP-18]
0047AD7E   .  8D55 EC       LEA EDX,DWORD PTR SS:[EBP-14]
0047AD81   .  E8 1EC9FFFF   CALL Assistan.004776A4                     ;计算机器码,这我们不用管它
0047AD86   .  8B45 EC       MOV EAX, DWORD PTR SS:[EBP-14]
0047AD89   .  8D55 F0       LEA EDX,DWORD PTR SS:[EBP-10] 
0047AD8C   .  E8 5FD1F8FF   CALL Assistan.00407EF0                     ;关键CALL,计算注册码
0047AD91   .  8B55 F0       MOV EDX,DWORD PTR SS:[EBP-10] 
0047AD94   .  58            POP EAX 
0047AD95   .  E8 9E96F8FF   CALL Assistan.00404438                     ;比较注册码
0047AD9A   .  0F85 8B000000 JNZ Assistan.0047AE2B                      ;关键跳转,爆破改为JZ就行了
0047ADA0   .  B2 01         MOV DL,1
0047ADA2   .  A1 98E44200   MOV EAX,DWORD PTR DS:[42E498]
0047ADA7   .  E8 EC37FBFF   CALL Assistan.0042E598
0047ADAC   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
0047ADAF   .  33C0          XOR EAX,EAX
0047ADB1   .  55            PUSH EBP
0047ADB2   .  68 24AE4700   PUSH Assistan.0047AE24
0047ADB7   .  64:FF30       PUSH DWORD PTR FS:[EAX]
0047ADBA   .  64:8920       MOV DWORD PTR FS:[EAX],ESP
0047ADBD   .  BA 02000080   MOV EDX,80000002
0047ADC2   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0047ADC5   .  E8 6E38FBFF   CALL Assistan.0042E638
0047ADCA   .  33C9          XOR ECX,ECX
0047ADCC   .  BA 74AE4700   MOV EDX,Assistan.0047AE74                   ;Software\MyAssistant\Option
0047ADD1   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0047ADD4   .  E8 C738FBFF   CALL Assistan.0042E6A0
0047ADD9   .  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
0047ADDC   .  E8 8BC9FFFF   CALL Assistan.0047776C
0047ADE1   .  8B45 E0       MOV EAX,DWORD PTR SS:[EBP-20]
0047ADE4   .  8D55 E4       LEA EDX,DWORD PTR SS:[EBP-1C]
0047ADE7   .  E8 B8C8FFFF   CALL Assistan.004776A4
0047ADEC   .  8B4D E4       MOV ECX,DWORD PTR SS:[EBP-1C]
0047ADEF   .  BA 98AE4700   MOV EDX,Assistan.0047AE98                    ;RegistryCode"注册码写入注册表
0047ADF4   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0047ADF7   .  E8 403CFBFF   CALL Assistan.0042EA3C
0047ADFC   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0047ADFF   .  E8 0438FBFF   CALL Assistan.0042E608
0047AE04   .  B8 B0AE4700   MOV EAX,Assistan.0047AEB0                    ;弹出对话框注册成功
0047AE09   .  E8 52E2FAFF   CALL Assistan.00429060
0047AE0E   .  33C0          XOR EAX,EAX
0047AE10   .  5A            POP EDX
0047AE11   .  59            POP ECX
0047AE12   .  59            POP ECX
0047AE13   .  64:8910       MOV DWORD PTR FS:[EAX],EDX
0047AE16   .  68 35AE4700   PUSH Assistan.0047AE35
0047AE1B   >  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0047AE1E   .  E8 B984F8FF   CALL Assistan.004032DC
0047AE23   .  C3            RETN
0047AE24   .^ E9 078CF8FF   JMP Assistan.00403A30
0047AE29   .^ EB F0         JMP SHORT Assistan.0047AE1B
0047AE2B   >  B8 C4AE4700   MOV EAX,Assistan.0047AEC4                    ;注册码不正确,请注册申请注册码!跳到这就失败了!
0047AE30   .  E8 2BE2FAFF   CALL Assistan.00429060
0047AE35   .  33C0          XOR EAX,EAX
==============我们进入关键CALL看看===================
004776CC  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             ;  取出机器码
004776CF  |.  E8 18CCF8FF   CALL Assistan.004042EC                   ;  计算的机器码长度
004776D4  |.  8BD0          MOV EDX,EAX                              ;  压入机器码长度
004776D6  |.                      85D2          TEST EDX,EDX
004776D8  |.  76 1C         JBE SHORT Assistan.004776F6
004776DA  |.  B8 01000000   MOV EAX,1                         
004776DF  |>  8B4D FC       /MOV ECX,DWORD PTR SS:[EBP-4]            ;  第一次循环入口
004776E2  |.  0FB64C01 FF   |MOVZX ECX,BYTE PTR DS:[ECX+EAX-1]       ;  从左到右取机器码ASCLL码
004776E7  |.  03D9          |ADD EBX,ECX                             ;  将机器码ASCLL值加上刚才循环计算的值
004776E9  |.  8BCB          |MOV ECX,EBX                            
004776EB  |.  03C9          |ADD ECX,ECX                                  
004776ED  |.  8D0C89        |LEA ECX,DWORD PTR DS:[ECX+ECX*4]       
004776F0  |.  8BD9          |MOV EBX,ECX                             ;  上面四行把机器码ASC乘十                       
004776F2  |.  40            |INC EAX                               
004776F3  |.  4A            |DEC EDX                                 ;  这的值等于机器码长度每循环一次就减一
004776F4  |.^ 75 E9         \JNZ SHORT Assistan.004776DF             ;  如果EDX大于0就继续循环
;  上面的循环就是把机器码左到右的ASCLL码乘以10并相加
004776F6  |>  8BC3          MOV EAX,EBX                              ;  压入计算后的值我们设置为Z                             
004776F8  |.  33D2          XOR EDX,EDX
004776FA  |.  52            PUSH EDX                                 ; /Arg2 => 00000000
004776FB  |.  50            PUSH EAX                                 ; |Arg1
004776FC  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]             ; |EAX
004776FF  |.  E8 D809F9FF   CALL Assistan.004080DC                   ; \Assistan.004080DC
00477704  |.  33DB          XOR EBX,EBX
00477706  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
00477709  |.  E8 DECBF8FF   CALL Assistan.004042EC                   ;  计算Z的长度  
0047770E  |.  83F8 01       CMP EAX,1                                ;  比较Z的长度
00477711  |.  72 18         JB SHORT Assistan.0047772B               ;  大于1就直进入循环
00477713  |>  8B55 F8       /MOV EDX,DWORD PTR SS:[EBP-8]            ;  第二次循环入口
00477716  |.  0FB65402 FF   |MOVZX EDX,BYTE PTR DS:[EDX+EAX-1]       ;  从右到左取Z ASCLL码
0047771B  |.  03DA          |ADD EBX,EDX                             ;  将机器码ASCLL值加上刚才循环计算的值
0047771D  |.  8BD3          |MOV EDX,EBX                             
0047771F  |.  03D2          |ADD EDX,EDX                           
00477721  |.  8D1492        |LEA EDX,DWORD PTR DS:[EDX+EDX*4]       
00477724  |.  8BDA          |MOV EBX,EDX                             ;  上面四行把Z的ASCLL乘十                         
00477726  |.  48            |DEC EAX                                 ;  这的值等于机器码长度每循环一次就减一
00477727  |.  85C0          |TEST EAX,EAX
00477729  |.^ 75 E8         \JNZ SHORT Assistan.00477713             ;  如果EAX大于0就继续循环
                                                                     ;  上面的循环就是把机器码左到右的ASCLL码乘以10并相加
0047772B  |>  8BC3          MOV EAX,EBX                              ;  压入计算后的值(些值为十六进制)  
0047772D  |.  33D2          XOR EDX,EDX
0047772F  |.  52            PUSH EDX                                 ; /Arg2 => 00000000
00477730  |.  50            PUSH EAX                                 ; |Arg1
00477731  |.  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]             ; |
00477734  |.  E8 A309F9FF   CALL Assistan.004080DC                   ; \Assistan.004080DC
00477739  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
0047773C  |.  8BD6          MOV EDX,ESI
0047773E  |.  E8 AD07F9FF   CALL Assistan.00407EF0                   ;  把十六进制转不十进制既真正的注册码
00477743  |.  33C0          XOR EAX,EAX                              ;  压入真注册码 
00477745  |.  5A            POP EDX
00477746  |.  59            POP ECX
00477747  |.  59            POP ECX
【破解总结】:
            些软件通过一定算法的到一个机器码,这个机器码的算法就不用研究了,注册码通过机器码进行二次运算的到,
第一次把机器码的ASCLL的值从左到右进行取出乘以十并相加。的出一个值,然后进行第二次计算把刚才算出来的值的ASCLL
的值从右到左取出乘以十并相加,些时计算出来的值为十六进制,最后把管个十六进制转会十进制就是我们想要的注册码了


【注册机制作】:
          现在我们可以来制作注册机了,呵呵,我只会用Delphi哟!好了开始开工了。
先来写三个函数吧!
第一个函数模仿第一次计算
function strtointex(s:String):integer;
var i,n:integer;
begin
n:=0;
if length(s)-1>0 then
for i:=1 to length(s) do
    n:=(n+ord(s[i]))*10;
result:=n;
end;
第二个函数模仿第二次计算
function strtointex0(s:String):string;
var i:integer;
    n:int64;
    x:string;
begin
n:=0;
result:='';
if length(s)>0 then
 begin
 for i:=length(s) downto 1 do
    n:=(n+ord(s[i]))*10;
 x:=inttohex(n,16);
 result:=copy(x,length(x)-7,8);
 end;
end;
   第三个函数就是把十六进步转为十进制,不知道为什么Delphi中没有内置还个函数,还是不知道!管他了,我们写一个!
function HexTostr(Hex: String): string;
var
    I:integer; Res: int64;
    ch: Char;
begin
    Res := 0;
    if Length(Hex)>0 then
    for I := 0 to Length(Hex) - 1 do
    begin
      ch := Hex[I + 1];
      if (ch >= '0') and (ch <= '9') then
        Res := Res * 16 + Ord(ch) - Ord('0')
      else if (ch >= 'A') and (ch <= 'F') then
        Res := Res * 16 + Ord(ch) - Ord('A') + 10
      else if (ch >= 'a') and (ch <= 'f') then
        Res := Res * 16 + Ord(ch) - Ord('a') + 10
      else raise Exception.Create('Error: not a Hex String');
    end;
    Result := inttostr(Res);
end;
好了注册机主要部分我们做好了`~在程序上放两个Edit…(edit1和edit2)在edit1的OnKeyUp事件中加上
Edit2.text:=HexTostr(strtointex0(inttostr(strtointex(edit1.text))));
好了注册机搞定,呵呵。。。。。。。。函数写的有什么不好的地方希望高手提出,我的QQ:9674103希望大家一起交流。我是个菜鸟~~