首页
社区
课程
招聘
[求助]帮忙破解两个crackme
发表于: 2011-2-26 05:31 5564

[求助]帮忙破解两个crackme

2011-2-26 05:31
5564
自己用易语言写得两个crackme程序结果自己破解不了啦。求高手帮忙啊。。。

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

上传的附件:
  • 1.rar (482.39kb,62次下载)
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 295
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这么简单的东西别发到论坛上来了 耽误大家时间。。。
2011-2-26 08:56
0
雪    币: 302
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
第一个,直接搜索字符串
00401067   /0F85 40000000   jnz     crackme0.004010A//nop
第二个也是一样的道理
2011-2-26 09:48
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
可您能帮我把算法流程找出来吗?这个很关键。
2011-3-2 11:35
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可您能帮我把算法流程找出来吗?这个很关键。
2011-3-2 11:35
0
雪    币: 167
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
本本鼠标被我砸了, 晚上再看看.. 这机上没工具
2011-3-2 11:42
0
雪    币: 28
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
既然楼主这么想知道算法流程,那我就随便写一点吧(对楼主的行为表示囧一下)

00449B0D  /$  53            PUSH EBX
00449B0E  |.  55            PUSH EBP
00449B0F  |.  56            PUSH ESI
00449B10  |.  57            PUSH EDI
00449B11  |.  8B7C24 14     MOV EDI,DWORD PTR SS:[ESP+14]
00449B15  |>  833D 50484800>/CMP DWORD PTR DS:[484850],1
00449B1C  |.  7E 0F         |JLE SHORT crackme0.00449B2D
00449B1E  |.  0FB607        |MOVZX EAX,BYTE PTR DS:[EDI]
00449B21  |.  6A 08         |PUSH 8
00449B23  |.  50            |PUSH EAX
00449B24  |.  E8 79710000   |CALL crackme0.00450CA2
00449B29  |.  59            |POP ECX
00449B2A  |.  59            |POP ECX
00449B2B  |.  EB 0F         |JMP SHORT crackme0.00449B3C
00449B2D  |>  0FB607        |MOVZX EAX,BYTE PTR DS:[EDI]
00449B30  |.  8B0D 44464800 |MOV ECX,DWORD PTR DS:[484644]           ;  crackme0.0048464E
00449B36  |.  8A0441        |MOV AL,BYTE PTR DS:[ECX+EAX*2]
00449B39  |.  83E0 08       |AND EAX,8
00449B3C  |>  85C0          |TEST EAX,EAX
00449B3E  |.  74 03         |JE SHORT crackme0.00449B43
00449B40  |.  47            |INC EDI
00449B41  |.^ EB D2         \JMP SHORT crackme0.00449B15
00449B43  |>  0FB637        MOVZX ESI,BYTE PTR DS:[EDI]
00449B46  |.  47            INC EDI
00449B47  |.  83FE 2D       CMP ESI,2D
00449B4A  |.  8BEE          MOV EBP,ESI
00449B4C  |.  74 05         JE SHORT crackme0.00449B53
00449B4E  |.  83FE 2B       CMP ESI,2B
00449B51  |.  75 04         JNZ SHORT crackme0.00449B57
00449B53  |>  0FB637        MOVZX ESI,BYTE PTR DS:[EDI]
00449B56  |.  47            INC EDI
00449B57  |>  33DB          XOR EBX,EBX
00449B59  |>  833D 50484800>/CMP DWORD PTR DS:[484850],1
00449B60  |.  7E 0C         |JLE SHORT crackme0.00449B6E
00449B62  |.  6A 04         |PUSH 4
00449B64  |.  56            |PUSH ESI
00449B65  |.  E8 38710000   |CALL crackme0.00450CA2
00449B6A  |.  59            |POP ECX
00449B6B  |.  59            |POP ECX
00449B6C  |.  EB 0B         |JMP SHORT crackme0.00449B79
00449B6E  |>  A1 44464800   |MOV EAX,DWORD PTR DS:[484644]
00449B73  |.  8A0470        |MOV AL,BYTE PTR DS:[EAX+ESI*2]
00449B76  |.  83E0 04       |AND EAX,4
00449B79  |>  85C0          |TEST EAX,EAX
00449B7B  |.  74 0D         |JE SHORT crackme0.00449B8A
00449B7D  |.  8D049B        |LEA EAX,DWORD PTR DS:[EBX+EBX*4]
00449B80  |.  8D5C46 D0     |LEA EBX,DWORD PTR DS:[ESI+EAX*2-30]
00449B84  |.  0FB637        |MOVZX ESI,BYTE PTR DS:[EDI]
00449B87  |.  47            |INC EDI
00449B88  |.^ EB CF         \JMP SHORT crackme0.00449B59
00449B8A  |>  83FD 2D       CMP EBP,2D
00449B8D  |.  8BC3          MOV EAX,EBX
00449B8F  |.  75 02         JNZ SHORT crackme0.00449B93
00449B91  |.  F7D8          NEG EAX
00449B93  |>  5F            POP EDI
00449B94  |.  5E            POP ESI
00449B95  |.  5D            POP EBP
00449B96  |.  5B            POP EBX
00449B97  \.  C3            RETN
上面是我跟踪到的算法函数,相信楼主自己能找到的吧?
算法虽然有两个循环,但是关键的是第二个循环,就直接说第二个吧
随便输入几次注册码,发现关键跳转
00401064   .  3945 F8       CMP DWORD PTR SS:[EBP-8],EAX             ;  (初始 CPU 选择)
每次EAX中的值都是固定的7DBh,而堆栈DWORD PTR SS:[EBP-8]中的值则是由算法中的ebx决定的:
00449B7D  |.  8D049B        |LEA EAX,DWORD PTR DS:[EBX+EBX*4]
00449B80  |.  8D5C46 D0     |LEA EBX,DWORD PTR DS:[ESI+EAX*2-30]
上面两句用数学描述就是:
eax=ebx*5
ebx=esi+eax*2-30
联立一下就变成ebx=esi+ebx*10-30(跟踪发现,其中esi中值是输入注册码中的每一位)
这里我们看到这是一个数列可以表达为:
An=Nn+An-1*10-30(其中n和n-1是通式的下标)
因为算法在开始阶段用xor ebx,ebx将ebx清零
所以A0就应该等于0,现在假设我输入的注册码是1234567890那么:
A1=N1+A0*10-30=1
A2=32+10-30=0C
A3=33+12*10-30=7B
一直求解到第十位数字0,如果求得结果和7DB相等则认为所输入的注册码是正确的注册码。
不知道楼主是不是这个意思,你可以把源码贴出来,我会帮你对照分析下。
2011-3-2 21:54
0
雪    币: 384
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
CM1的注册码为2011

CM2一组可用信息:
natyou

1234
2011-3-12 21:54
0
雪    币: 384
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
简单分析一下算法:
CM1是固定码的,所以不作分析了

CM2关键代码在下面:

00401175  |> \DB45 F4       fild [local.3]                                                         //用户名转十进制设为S1,字母则为0
00401178  |.  DD5D EC       fstp qword ptr ss:[ebp-14]
0040117B  |.  DD45 EC       fld qword ptr ss:[ebp-14]
0040117E  |.  DC05 6D9B4600 fadd qword ptr ds:[469B6D]                          //[469B6D]处固定为1234+S1
00401184  |.  DD5D E4       fstp qword ptr ss:[ebp-1C]
00401187  |.  DD45 E4       fld qword ptr ss:[ebp-1C]

最终比较:用户名=用户名+1234  则成功,也就是说,任意字母作为用户名,注册码都为1234,数字0作为用户名也OK,gtz
2011-3-12 22:22
0
雪    币: 630
活跃值: (570)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
natyou牛人啊 膜拜一下
2011-3-13 16:40
0
游客
登录 | 注册 方可回帖
返回
//