mask 发表于 2005-2-15 16:47:19

mask【成长经历】破解crackme(1)

我的第1篇破解文章.
适合菜鸟中的菜鸟学习及讨论(在学习和讨论中成长)   
爆破不是目的
这个crackme 已经出现很久了!可能有的人曾经写过破文
我忘了在什么地方下的了
(今天也是想试试手)
工具:flyODBG      黄金版W32dsm          软件无壳

用W32dsm载入找到成功或失败信息找到关键call和关键跳关键call是真假注册码比较的地方



我们不去爆破   主要是算法         跳死的地方向上可找到00401150这是第1个跳死的地方.我们从这里入手



00401139   $6A 32         push 32                                  ; /Count = 32 (50.)
0040113B   .68 F3204000   push Crackme1.004020F3                   ; |Buffer = Crackme1.004020F3
00401140   .68 C8000000   push 0C8                                 ; |ControlID = C8 (200.)
00401145   .FF75 08       push dword ptr ss:                ; |hWnd
00401148   .E8 DE000000   call <jmp.&USER32.GetDlgItemTextA>       ; \GetDlgItemTextA ****取用户名
0040114D   .83F8 00       cmp eax,0                                 ****比较是否小于0
00401150   .0F84 99000000 je Crackme1.004011EF                      ****小于0跳死               
00401156   .83F8 04       cmp eax,4                                 ****比较是否小于4
00401159   .0F82 90000000 jb Crackme1.004011EF                      ****小于4跳死
0040115F   .33C9          xor ecx,ecx                               ****清零
00401161   .33DB          xor ebx,ebx
00401163   .33F6          xor esi,esi
00401165   .8945 FC       mov dword ptr ss:,eax            ****送位数
                                                                      ****开始循环
00401168   > /0FBE81 F32040>movsx eax,byte ptr ds:      ****逐位取注册名   第一个“m”既6D
0040116F   . |83F8 20       cmp eax,20                              ****和20比较
00401172   . |74 07         je short Crackme1.0040117B                ****等于就结束,不等就继续
00401174   . |6BC0 04       imul eax,eax,4                            ****带符号乘法eax=eax*4=6D*4=1B4
00401177   . |03D8          add ebx,eax                               ****ebx=ebx+eax=0+1B4=1B4
00401179   . |8BF3          mov esi,ebx                               ****保存ebx进esi      
0040117B   > |41            inc ecx                                 ****计数器加1
0040117C   . |3B4D FC       cmp ecx,dword ptr ss:            ****比较是否读完注册名
0040117F   .^\75 E7         jnz short Crackme1.00401168               ****没完继续
00401181   .83FE 00       cmp esi,0                                 ****比较esi是否为0
00401184   .74 69         je short Crackme1.004011EF                ****如果为0 跳死
                  
                                                                      ****循环结束
****算法:ebx=ebx+注册名的ASCII*4
N1=0+6D*4=1B4
N2=1B4+61*4=338
N3=338+73*4=504
N4=504+6B*4=6B0
N5=6B0+6D*4=864
N6=864+61*4=9E8
N7=9E8+73*4=BB4
N8=BB4+6B*4=D60(十进制=3424)             完成后保存在esi



第二个循环   ecx=8



00401186   .BB 89476500   mov ebx,654789                     ****赋值ebx 654789
0040118B   >0FBE81 F22040>movsx eax,byte ptr ds:   ****循环开始 取注册名的最后一个
00401192   .4B            dec ebx                              ****ebx=ebx-1=654788
00401193   .6BC3 02       imul eax,ebx,2                     ****eax=ebx*2=CA8F10
00401196   .03D8          add ebx,eax                        ****ebx=ebx+eax=12FD698
00401198   .4B            dec ebx                              ****ebx=ebx-1=12FD697
00401199   .49            dec ecx                              ****计数器减1
0040119A   .^ 75 EF         jnz short Crackme1.0040118B          ****计数器等于0循环结束




****算法:ebx=(ebx-1)*2+(ebx-1)-1=3*ebx-4
N1 = 654789*3-4 = 12FD697
N2 = 12FD697*3-4 = 38F83C1
N3 = 38F83C1*3-4 = AAE8B3F
N4 = AAE8B3F*3-4 = 200BA1B9
N5 = 200BA1B9*3-4 = 6022E527
N6 = 6022E527*3-4 = 12068AF71 (因为ebx寄存器只保留8 bit,所以这里实际上只取2068AF71)
N7 = 2068AF71*3-4 = 613A0E4F
N8 = 613A0E4F*3-4 = 123AE2AE9 (因为ebx寄存器只保留8 bit,所以这里实际上只取23AE2AE9)



循环8次得23AE2AE9



0040119C   .56            push esi                                 ; /<%lu>****第一次码入栈
0040119D   .53            push ebx                                 ; |<%lX>****第二次码入栈
0040119E   .68 C7204000   push Crackme1.004020C7                   ; |Format = "BS-%lX-%lu"****注册码格式
004011A3   .68 BB214000   push Crackme1.004021BB                   ; |s = Crackme1.004021BB
004011A8   .E8 6C000000   call <jmp.&USER32.wsprintfA>             ; \wsprintfA            ****合并
004011AD   .58            pop eax
004011AE   .58            pop eax
004011AF   .58            pop eax
004011B0   .58            pop eax
004011B1   .E8 01000000   call Crackme1.004011B7                              ****比较注册码
004011B6   .C3            retn
004011B7   $33C9          xor ecx,ecx                                       ****进call
004011B9   .6A 32         push 32                                  ; /Count = 32 (50.)
004011BB   .68 57214000   push Crackme1.00402157                   ; |Buffer = Crackme1.00402157
004011C0   .68 C9000000   push 0C9                                 ; |ControlID = C9 (201.)
004011C5   .FF75 08       push dword ptr ss:                ; |hWnd
004011C8   .E8 5E000000   call <jmp.&USER32.GetDlgItemTextA>       ; \GetDlgItemTextA ****获得假码
004011CD   .83F8 00       cmp eax,0                                                   ****是否为0
004011D0   .74 1D         je short Crackme1.004011EF                                  ****为0结束
004011D2   .33C9          xor ecx,ecx                                                 ****ecx清0
004011D4   >0FBE81 572140>movsx eax,byte ptr ds:                        ****取假码
004011DB   .0FBE99 BB2140>movsx ebx,byte ptr ds:                        ****取真码
004011E2   .3BC3          cmp eax,ebx                                                 ****比较
004011E4   .75 09         jnz short Crackme1.004011EF                                 ****不同跳死
004011E6   .83F8 00       cmp eax,0                                                
004011E9   .74 19         je short Crackme1.00401204                                  ****eax等于0跳到成功
004011EB   .41            inc ecx                                                   ****ecx计数器减1
004011EC   .^ EB E6         jmp short Crackme1.004011D4                                 ****跳回循环
004011EE   .C3            retn



004011EF   > \6A 10         push 10                                  ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004011F1   .68 E4204000   push Crackme1.004020E4                   ; |Title = "Nope"
004011F6   .68 E9204000   push Crackme1.004020E9                   ; |Text = "Try again"
004011FB   .FF75 08       push dword ptr ss:                ; |hOwner
004011FE   .E8 34000000   call <jmp.&USER32.MessageBoxA>         ; \MessageBoxA
00401203   .C3            retn
00401204   >6A 40         push 40                                  ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401206   .68 D2204000   push Crackme1.004020D2                   ; |Title = "Solved"
0040120B   .68 D9204000   push Crackme1.004020D9                   ; |Text = "Well done."
00401210   .FF75 08       push dword ptr ss:                ; |hOwner
00401213   .E8 1F000000   call <jmp.&USER32.MessageBoxA>         ; \MessageBoxA
00401218   .C3            retn



算法分析完毕    Name:maskmask      S/N:BS-23AE2AE9-3424

请各位提出意见.我汇编语言还不太会
做keygen的工作交给各位高手了
希望能把keygen帖出

[ Last edited by mask on 2005-2-15 at 09:12 PM ]

飘云 发表于 2005-2-15 18:52:41

附件问题已经解决!

crack123 发表于 2005-2-15 21:27:10

不错啊,兄弟!
支持!

hyd009 发表于 2005-2-15 23:52:39

很厉害啊,支持

jackily 发表于 2005-2-16 08:42:29

支持,成长的过程是充满喜悦的。

云瑞 发表于 2005-3-6 20:30:20

鼎!清冽支持

hjyzzz8888 发表于 2005-3-7 15:25:48

我刚刚入门,爆破过几个小软件(不到1m的),可是算法一巧不通,,,,就象天书一样》》》》》》》郁闷《〈〈〈〈

lovexy 发表于 2005-3-16 15:32:11

看到那么多代码就头昏

le-xy 发表于 2005-3-17 17:18:11

偶作为菜鸟,深知想破点东西不容易啊

6928120 发表于 2005-8-7 15:08:09

页: [1]
查看完整版本: mask【成长经历】破解crackme(1)