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 ] 附件问题已经解决! 不错啊,兄弟!
支持! 很厉害啊,支持 支持,成长的过程是充满喜悦的。 鼎!清冽支持
! 我刚刚入门,爆破过几个小软件(不到1m的),可是算法一巧不通,,,,就象天书一样》》》》》》》郁闷《〈〈〈〈 看到那么多代码就头昏 偶作为菜鸟,深知想破点东西不容易啊
页:
[1]