首页
社区
课程
招聘
[原创]CrackMe2.1.exe破解过程+注册机编写
发表于: 2006-8-28 19:12 13036

[原创]CrackMe2.1.exe破解过程+注册机编写

2006-8-28 19:12
13036

【文章标题】: CrackMe2.1.exe破解+注册机
【文章作者】: 壹只老虎
【作者邮箱】: tiger..tiger@163.com
【作者QQ号】: 609841314
【软件名称】: CrackMe2.1.exe
【软件大小】: 204KB
【下载地址】: http://bbs.pediy.com/attachment.php?s=&attachmentid=2600
【加壳方式】: 无壳
【保护方式】: 注册名+序列号
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: od+peid+windows记事本+delphi7.0
【操作平台】: xp
【软件介绍】: 看雪的一个兄弟的creakme,爆破就没什么意思了!算法!好玩!
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  1:PEID查壳,Microsoft Visual C++ 6.0,无壳
            
  2:运行程序,填写注册资料:name:tiger,serial:1111111111111111,注册,没反应,这不重要,看看再说!
  
  3: OD载入, bpx GetWindowTextA,F9运行,写注册资料name:tiger,serial:1111111111111111,注册,断下来了!
   
  在0041CD31   |.  FF15 10334200      call dword ptr ds:[<&USER32.GetW>; \GetWindowTextA 断下来了!
  这里别忙开始分析,f8走了一段又一段,终于看见注册名了!好了该开始分析了!
  具体分析如下!从断点下来全部f8,就可以到达这里!嘿嘿!
  
  4:这里是具体分析
  
  第1部分:
  
  00401750    .  8DBE 90000000      lea edi,dword ptr ds:[esi+90]
  00401756    .  8D4C24 14          lea ecx,dword ptr ss:[esp+14]
  0040175A    .  57                 push edi
  0040175B    .  E8 C2660100        call CrackMe2.00417E22
  00401760    .  8B17               mov edx,dword ptr ds:[edi]             ;  edx=注册名
  00401762    .  8B6A F8            mov ebp,dword ptr ds:[edx-8]           ;  ebp=注册名长度
  00401765    .  85ED               test ebp,ebp                           ;  长度=0就跳出
  00401767    .  0F84 F8000000      je CrackMe2.00401865
  0040176D    .  83FD 08            cmp ebp,8
  00401770    .  7D 0D              jge short CrackMe2.0040177F            ;  长度>=8就跳走
  00401772    .  68 44C14200        push CrackMe2.0042C144                 ;  ASCII "Prudence"
  00401777    .  55                 push ebp
  00401778    .  8BCF               mov ecx,edi
  0040177A    .  E8 43420100        call CrackMe2.004159C2                 ; 这个call的目的是当注册名不足8位的时候在注册名的末
                                                                           ; 尾加上Prudence,黑黑
  0040177F    >  55                 push ebp
  00401780    .  8BCF               mov ecx,edi
  00401782    .  E8 53670100        call CrackMe2.00417EDA
  00401787    .  8D4C24 24          lea ecx,dword ptr ss:[esp+24]
  0040178B    .  8D5424 1C          lea edx,dword ptr ss:[esp+1C]
  0040178F    .  51                 push ecx
  00401790    .  52                 push edx
  00401791    .  50                 push eax
  00401792    .  E8 B9FEFFFF        call CrackMe2.00401650                 ;  重要(Ok),核心算法,跟进去
  00401797    .  8B4424 2C          mov eax,dword ptr ss:[esp+2C]          ;  eax=核心算法计算出的一个数据
  0040179B    .  8B4C24 28          mov ecx,dword ptr ss:[esp+28]          ;  ecx=核心算法计算出的一个数据
  0040179F    .  50                 push eax                               ;  压栈
  004017A0    .  51                 push ecx                               ;  压栈
  004017A1    .  8D5424 20          lea edx,dword ptr ss:[esp+20]
  004017A5    .  68 3CC14200        push CrackMe2.0042C13C                 ;  ASCII "%x-%x"
  004017AA    .  52                 push edx
  004017AB    .  E8 CF450100        call CrackMe2.00415D7F                 ;  小写的"eax"-"ecx"
  004017B0    .  83C4 1C            add esp,1C
  004017B3    .  8D4C24 0C          lea ecx,dword ptr ss:[esp+C]
  004017B7    .  E8 B5670100        call CrackMe2.00417F71                 ;  大写的"eax"-"ecx"
  004017BC    .  8D4C24 0C          lea ecx,dword ptr ss:[esp+C]
  004017C0    .  E8 BE670100        call CrackMe2.00417F83                 ;  逆序"ecx"-逆序"eax",
  
  这里我试看出来的,也可以跟进去看一看
  
  004017C5    .  8B86 94000000      mov eax,dword ptr ds:[esi+94]          ;  eax=注册码字符串
  004017CB    .  50                 push eax                               ; /Arg2
  004017CC    .  8B4424 10          mov eax,dword ptr ss:[esp+10]          ; |
  004017D0    .  50                 push eax                               ; |Arg1
  004017D1    .  E8 10800000        call CrackMe2.004097E6                 ; \这里关键call,把真码和假码比较的结果放在eax里面
  004017D6    .  83C4 08            add esp,8
  004017D9    .  85C0               test eax,eax                           ;  eax不为0就失败!
  004017DB    .  0F85 84000000      jnz CrackMe2.00401865                  ;  失败了
  004017E1    .  68 30C14200        push CrackMe2.0042C130
  004017E6    .  8D4C24 1C          lea ecx,dword ptr ss:[esp+1C]
  004017EA    .  E8 68650100        call CrackMe2.00417D57
  004017EF    .  68 14C14200        push CrackMe2.0042C114
  004017F4    .  8D4C24 14          lea ecx,dword ptr ss:[esp+14]
  004017F8    .  C64424 44 02       mov byte ptr ss:[esp+44],2
  004017FD    .  E8 55650100        call CrackMe2.00417D57
  00401802    .  8D4C24 18          lea ecx,dword ptr ss:[esp+18]
  00401806    .  C64424 40 03       mov byte ptr ss:[esp+40],3
  0040180B    .  51                 push ecx
  0040180C    .  8BCE               mov ecx,esi
  0040180E    .  E8 AD000000        call CrackMe2.004018C0
  00401813    .  68 EE030000        push 3EE
  00401818    .  8BCE               mov ecx,esi
  0040181A    .  E8 53920100        call CrackMe2.0041AA72
  0040181F    .  8D5424 10          lea edx,dword ptr ss:[esp+10]
  00401823    .  8BCE               mov ecx,esi
  00401825    .  52                 push edx
  00401826    .  8BF8               mov edi,eax
  00401828    .  E8 93000000        call CrackMe2.004018C0
  0040182D    .  8B4424 14          mov eax,dword ptr ss:[esp+14]
  00401831    .  8D4C24 10          lea ecx,dword ptr ss:[esp+10]
  00401835    .  50                 push eax
  00401836    .  6A 00              push 0
  00401838    .  E8 85410100        call CrackMe2.004159C2
  0040183D    .  8B4C24 10          mov ecx,dword ptr ss:[esp+10]
  00401841    .  51                 push ecx
  00401842    .  8BCF               mov ecx,edi
  00401844    .  E8 E8920100        call CrackMe2.0041AB31
  00401849    .  8D4C24 10          lea ecx,dword ptr ss:[esp+10]
  0040184D    .  C64424 40 02       mov byte ptr ss:[esp+40],2
  00401852    .  E8 D6640100        call CrackMe2.00417D2D
  00401857    .  8D4C24 18          lea ecx,dword ptr ss:[esp+18]
  0040185B    .  C64424 40 01       mov byte ptr ss:[esp+40],1
  00401860    .  E8 C8640100        call CrackMe2.00417D2D
  00401865    >  8D4C24 14          lea ecx,dword ptr ss:[esp+14]
  00401869    .  C64424 40 00       mov byte ptr ss:[esp+40],0
  0040186E    .  E8 BA640100        call CrackMe2.00417D2D
  00401873    .  8D4C24 0C          lea ecx,dword ptr ss:[esp+C]
  00401877    .  C74424 40 FFFFFFFF mov dword ptr ss:[esp+40],-1
  0040187F    .  E8 A9640100        call CrackMe2.00417D2D
  00401884    .  8B4C24 38          mov ecx,dword ptr ss:[esp+38]
  00401888    .  5F                 pop edi
  00401889    .  5E                 pop esi
  0040188A    .  5D                 pop ebp
  0040188B    .  64:890D 00000000   mov dword ptr fs:[0],ecx
  00401892    .  83C4 38            add esp,38
  00401895    .  C3                 retn
  
  第2部分
  
  00401792    .  E8 B9FEFFFF        call CrackMe2.00401650                 ;  重要(Ok),核心算法,跟进去
  
  跟进00401650
  分析如下
  
  00401650   /$  83EC 08            sub esp,8
  00401653   |.  8B5424 14          mov edx,dword ptr ss:[esp+14]
  00401657   |.  8B4C24 0C          mov ecx,dword ptr ss:[esp+C]
  0040165B   |.  53                 push ebx
  0040165C   |.  55                 push ebp
  0040165D   |.  56                 push esi
  0040165E   |.  8B32               mov esi,dword ptr ds:[edx]
  00401660   |.  8B01               mov eax,dword ptr ds:[ecx]             ;  注册名前4位放eax
  00401662   |.  8B49 04            mov ecx,dword ptr ds:[ecx+4]           ;  后4位放ecx
  00401665   |.  897424 18          mov dword ptr ss:[esp+18],esi
  00401669   |.  8B72 04            mov esi,dword ptr ds:[edx+4]
  0040166C   |.  897424 20          mov dword ptr ss:[esp+20],esi
  00401670   |.  8B72 08            mov esi,dword ptr ds:[edx+8]
  00401673   |.  8B52 0C            mov edx,dword ptr ds:[edx+C]
  00401676   |.  897424 0C          mov dword ptr ss:[esp+C],esi
  0040167A   |.  895424 10          mov dword ptr ss:[esp+10],edx
  0040167E   |.  57                 push edi
  0040167F   |.  33D2               xor edx,edx                            ;  edx=0
  00401681   |.  BE 20000000        mov esi,20                             ;  esi=32
  00401686   |>  8B5C24 1C          /mov ebx,dword ptr ss:[esp+1C]         ;  ebx=1936287828
  0040168A   |.  8B6C24 24          |mov ebp,dword ptr ss:[esp+24]         ;  ebp=544434464
  0040168E   |.  8BF9               |mov edi,ecx                           ;  edi=ecx
  00401690   |.  33D9               |xor ebx,ecx                           ;  ebx=1936287828 xor ecx
  00401692   |.  81EA 4786C861      |sub edx,61C88647                      ;  edx=edx-1640531527
  00401698   |.  03DD               |add ebx,ebp                           ;  ebx=544434464+ebx
  0040169A   |.  C1EF 05            |shr edi,5                             ;  edi=edi shr 5
  0040169D   |.  33FA               |xor edi,edx                           ;  edi=edi xor edx
  0040169F   |.  8BE9               |mov ebp,ecx                           ;  ebp=ecx
  004016A1   |.  C1E5 04            |shl ebp,4                             ;  ebp=ebp shl 4
  004016A4   |.  03DF               |add ebx,edi                           ;  ebx=ebx+edi
  004016A6   |.  03EB               |add ebp,ebx                           ;  ebp=ebp+ebx
  004016A8   |.  8B5C24 10          |mov ebx,dword ptr ss:[esp+10]         ;  ebx=1919098977
  004016AC   |.  03C5               |add eax,ebp                           ;  eax=eax+ebp
  004016AE   |.  8B6C24 14          |mov ebp,dword ptr ss:[esp+14]         ;  ebp=778789729
  004016B2   |.  8BF8               |mov edi,eax                           ;  edi=eax
  004016B4   |.  33D8               |xor ebx,eax                           ;  ebx=ebx xor eax
  004016B6   |.  C1EF 05            |shr edi,5                             ;  edi =edi shr 5
  004016B9   |.  03DD               |add ebx,ebp                           ;  ebx=ebp+ebx
  004016BB   |.  33FA               |xor edi,edx                           ;  edi=edi xor edx
  004016BD   |.  8BE8               |mov ebp,eax                           ;  ebp=eax
  004016BF   |.  03DF               |add ebx,edi                           ;  ebx=edi+ebx
  004016C1   |.  C1E5 04            |shl ebp,4                             ;  ebp=ebp shl 4
  004016C4   |.  03EB               |add ebp,ebx                           ;  ebp=ebp+ebx
  004016C6   |.  03CD               |add ecx,ebp                           ;  ecx=ecx+ebp
  004016C8   |.  4E                 |dec esi                               ;  esi-1
  004016C9   |.^ 75 BB              \jnz short CrackMe2.00401686           ;  这里是循环32次
  004016CB   |.  8B5424 20          mov edx,dword ptr ss:[esp+20]          ;  eax,ebx,ecx各得到一个结果
  004016CF   |.  5F                 pop edi
  004016D0   |.  5E                 pop esi
  004016D1   |.  5D                 pop ebp
  004016D2   |.  8902               mov dword ptr ds:[edx],eax
  004016D4   |.  894A 04            mov dword ptr ds:[edx+4],ecx
  004016D7   |.  5B                 pop ebx
  004016D8   |.  83C4 08            add esp,8
  004016DB   \.  C3                 retn
  
  好了分析完了!嘿嘿!
  
  
  5:总结下算法!
  当注册名<8位的时候,用Prudence补在后面,
  
  然后把注册名的前四位和后四位做了一个32次的循环运算!
  
  得到两个数据放在 eax和ecx
  
  然后将这两个数据转换为字符串,然后按照"eax"-"ecx"构造新的字符串
  
  最后,逆序"ecx"-逆序"eax",即为注册码!
  
  6:注册机编写,代码有点长,小心看错了!我自己也看错了好多了!郁闷!呵呵!
  delphi版本的!
  
  unit key;
  
  interface
  
  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, WinSkinData, jpeg, ExtCtrls;
  
  type
    TForm1 = class(TForm)
      SkinData1: TSkinData;
      Label1: TLabel;
      Label2: TLabel;
      Edit1: TEdit;
      Edit2: TEdit;
      Button1: TButton;
      Button2: TButton;
      Button3: TButton;
      Image1: TImage;
      Label3: TLabel;
      procedure Button2Click(Sender: TObject);
      procedure Button3Click(Sender: TObject);
      procedure Button1Click(Sender: TObject);
    private
      { Private declarations }
    public
      { Public declarations }
    end;
  
  var
    Form1: TForm1;
  
  implementation
  
  {$R *.dfm}
  
  procedure TForm1.Button2Click(Sender: TObject);
  begin
        Application.MessageBox('本注册机由  壹只老虎  制作!QQ:609841314','关于',MB_ICONINFORMATION+MB_OK);
  end;
  
  procedure TForm1.Button3Click(Sender: TObject);
  begin
       Close;
  end;
  
  procedure TForm1.Button1Click(Sender: TObject);
  var
     name,code,str1,str2:string;
     name1,name2,edx,ebx,ecx,edi,eax,ebp:LongWord;
     i:integer;
     s:char;
  begin
       name:=edit1.Text;
       if length(name)<8 then
           name:=name+'Prudence';  //前面四位
       name1:=ord(name[1])+ord(name[2])*256+ord(name[3])*256*256+ord(name[4])*256*256*256;
       name2:=ord(name[5])+ord(name[6])*256+ord(name[7])*256*256+ord(name[8])*256*256*256;
       edx:=0;
       eax:=name1;
       ecx:=name2;
       for i:=1 to 32 do
           begin
                ebp:=544434464 ;
                edi:=ecx;
                ebx:=1936287828 xor ecx;
                edx:=edx-1640531527;
                ebx:=ebp+ebx;
                edi:=edi shr 5;
                edi:=edi xor edx;
                ebp:=ecx;
                ebp:=ebp shl 4;
                ebx:=ebx+edi;
                ebp:=ebp+ebx;
                ebx:=1919098977;
                eax:=eax+ebp;
                ebp:=778789729;
                edi:=eax;
                ebx:=ebx xor eax;
                edi:=edi shr 5;
                ebx:=ebp+ebx;
                edi:=edi xor edx;
                ebp:=eax;
                ebx:=edi+ebx;
                ebp:=ebp shl 4;
                ebp:=ebp+ebx;
                ecx:=ecx+ebp;
            end;
       str1:=inttohex(eax,2);
       str2:=inttohex(ecx,2);
       code:=str1+'-'+str2;
       for i:=1 to pos('-',code) do
           begin
                s:=code;
                code:=code[length(code)-i+1];
                code[length(code)-i+1]:=s;
           end;
       edit2.Text:=code;
  end;
  
  end.
  
  好了就这样了,嘿嘿!壹只老虎祝大家破解愉快!
  
--------------------------------------------------------------------------------
【经验总结】
  这个东西还是比较简单,思路很清晰的!要注意写代码的时候不要出错了!比较容易出错!(容易看花眼)
  
--------------------------------------------------------------------------------
【版权声明】: BY:壹只老虎

                                                       2006年08月27日 14:36:10


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (16)
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
2
支持呀,这是DCG群里的Crackme
name:wofan
====698C81D0-524DC93E 逆序为:E39CD425-0D18C896 就是注册码
我看到那个BT 32次循环,我就没有看了,不想在这里看到你的完美贴子,不支持不行呀。你很有耐心呀
2006-8-28 23:22
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
3
当注册名<8位的时候,用Prudence补在后面,

还有一点,当注册名大于8时,就不要补上Prudence,而是继续下面的循环算法。不知是不是我看错了,还是你没有留心。哈……
所以当注册名超过8位时,你的注册机就算不出正确的注册码了哟
2006-8-28 23:27
0
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
4
兄弟啊!反正只取八位,不足就补足八位,多了也用不上的!呵呵!
注册机测试过了!
例如:tiger-->B5BEB59E-39D2AFE2
admin888->61322423-06D2BB74
yizhilaohu-->A71EA012-AFC01497

测试通过!谢谢支持!!嘿嘿1
2006-8-29 00:22
0
雪    币: 264
活跃值: (30)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
5
看来是只真老虎,谢谢楼主的支持,答案我已经公布和我的完全符合。
2006-8-29 01:41
0
雪    币: 221
活跃值: (20)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
实在太厉害了,偶的偶像啊
2006-8-29 10:55
0
雪    币: 174
活跃值: (10)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
呵呵,这里你有好多地方兄弟没有解释.呵呵.其实,不是把用户的前四位和后四位送到EAX中还有ECX中,是把所以有十六进制ASCII码放到里面.

这里最扣出现正向的注册码是经过处理后的十六进制ASCII通过CALL出,的才是真正的注册码的逆向.
2006-8-29 16:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
虽然算法还是没有看懂,注册码在进行调试的时候就可以得到
2006-9-7 20:37
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
9
32次的循环可以简化:(其实就是3行)

TMP就是EDX,A 是 EAX , B 是 ECX

str1 ~ str4 是 "This is a crack." 这16个字符分成的4块

for(i=0;i<32;i++)
{
    TMP-=0x61c88647;

    A=A+(B<<4)+((str1^B)+str2)+((B>>5)^TMP);

    B=B+(A<<4)+((str3^A)+str4)+((A>>5)^TMP);
}
2006-9-8 21:26
0
雪    币: 174
活跃值: (10)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
不错不错都我们那里的兄弟,DCG,支持,呵呵,分析的不错,这个我也看过,32次,分析时是正好8位,不是大于或者小于.
2006-9-9 12:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不大看得懂(我--菜),收藏下来学习了

2006-11-8 14:08
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了
楼主辛苦了
2006-11-8 15:52
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
13
一个crackme,算法只有一个call的话,不吃香了。现在流行你找不到关键点了。
2006-11-8 16:14
0
雪    币: 323
活跃值: (589)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
14
出现了明码比较,可能是crackme的一个弱点。
delphi源码,这个我可喜欢
2006-11-10 11:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不错,挺适合我看的。
我在网站找了一个,弄了办法,没成功。帮我分析一下。
软件出自:http://free5.ys168.com/?duy2   就是里面那个超级红球自助版
2006-11-15 19:21
0
雪    币: 136
活跃值: (1480)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
16
呵呵,厉害,一开始下断的时候根本不出注册的对话框,试了好一会才成功,貌似中间出现明码了,呵呵。
2010-4-5 16:49
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
17
曹同学无限翻旧贴学习啊!很好,很好!
2010-4-5 17:06
0
游客
登录 | 注册 方可回帖
返回
//