- UID
- 123
注册时间2005-2-5
阅读权限20
最后登录1970-1-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:[ebp+8] ; |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:[ebp-4],eax ****送位数
****开始循环
00401168 > /0FBE81 F32040>movsx eax,byte ptr ds:[ecx+4020F3] ****逐位取注册名 第一个“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:[ebp-4] ****比较是否读完注册名
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:[ecx+4020F2] ****循环开始 取注册名的最后一个
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:[ebp+8] ; |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:[ecx+402157] ****取假码
004011DB . 0FBE99 BB2140>movsx ebx,byte ptr ds:[ecx+4021BB] ****取真码
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:[ebp+8] ; |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:[ebp+8] ; |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 ] |
|