首页
社区
课程
招聘
[原创]趣味crackeme之4
发表于: 2008-12-24 09:39 8295

[原创]趣味crackeme之4

2008-12-24 09:39
8295
最近忙得有点异常,写个简单的cm放松下.
难度:初级

无任何anti,就象一个猪蹄赤裸裸地暴露在大家面前
都来啃吧,味道好得很.
给出两组或两组以上注册码为通过
希望 写出算法分析 或者keygen
cm.rar

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (24)
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发,最喜欢玩你的cm了
2008-12-24 10:14
0
雪    币: 88
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
爆破!呵呵,晚上在跟踪注册码!
2008-12-24 13:31
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
有点意思,一会下课回来接着看。
2008-12-24 13:31
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
5
头都被绕晕了,好多比较!
2008-12-24 15:03
0
雪    币: 10936
活跃值: (3293)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
6
"头都被绕晕了,好多比较!"

呵呵 要的就是这个效果

猪蹄 里带点硬骨头 放松 ,
静下心来慢慢啃 啃出好味道
2008-12-24 15:07
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
确实有点晕,我也晕 ,跟你以前那个有一拼。
从中午,搞到现在了我。
我提供一个注册码,工作去了,keygen以后再写。

u:abcdef
k:abccbaabbcabacacbc
2008-12-24 15:33
0
雪    币: 222
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
疯了,受不了了.
2008-12-24 15:40
0
雪    币: 10936
活跃值: (3293)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
9
不错,我昨天调试这cm时 也有点晕 还有点困,迷迷糊糊的
按我最开始的思想设计 注册码可能有6*5*4*3*2*6位
太恐怖了,还是罢了.
然后注册码里还有些限制 后来脑袋不想工作了
就拿这个上来了,这个限制条件不完善,难度不大.
娱乐下
2008-12-24 15:48
0
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
好象只跟用户名前三位有关 注册吗则是前18位有效
u:finhhh
k:finniffiinfifnfnni

诸如此类都可以
u:finaaa
k:finniffiinfifnfnniasdasdasd

u:fincvb
k:finniffiinfifnfnnisdferer

所以只要搞出来一组 算法就没用了
2008-12-24 16:07
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
晕了。只能爆了。算法不会。绕都绕晕别说算了。
上传的附件:
2008-12-24 16:11
0
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不会吧,请问上面的老大是怎么弄的

我先下按钮的消息断点,run跟踪后,一点击
再alt + F9

00401501  |.  8BEC          mov     ebp, esp
00401503  |.  83EC 44       sub     esp, 44
00401506  |.  53            push    ebx
00401507  |.  56            push    esi
00401508  |.  57            push    edi
00401509  |.  894D FC       mov     dword ptr [ebp-4], ecx
0040150C  |.  B8 00334000   mov     eax, 00403300
00401511  |.  5F            pop     edi
00401512  |.  5E            pop     esi
00401513  |.  5B            pop     ebx
00401514  |.  8BE5          mov     esp, ebp
00401516  |.  5D            pop     ebp
00401517  \.  C3            retn

再看内存,在00401000下断,F9运行,再F9,
得到如下

77D3B04A    5E              pop     esi                              ; USER32.77D3AFFE
77D3B04B    5D              pop     ebp
77D3B04C    C2 1000         retn    10
77D3B04F    83E8 07         sub     eax, 7
77D3B052    0F85 13040000   jnz     77D3B46B
77D3B058    B8 00010000     mov     eax, 100
77D3B05D  ^ E9 1BB2FEFF     jmp     77D2627D
77D3B062    6A 01           push    1
77D3B064    FF75 14         push    dword ptr [ebp+14]
77D3B067    FF75 10         push    dword ptr [ebp+10]
77D3B06A    52              push    edx
77D3B06B    56              push    esi
77D3B06C    E8 9112FEFF     call    77D1C302
77D3B071  ^ EB D7           jmp     short 77D3B04A
77D3B073    E8 5B07FEFF     call    77D1B7D3
77D3B078  ^ E9 0671FFFF     jmp     77D32183
77D3B07D    33C0            xor     eax, eax
77D3B07F  ^ E9 0371FFFF     jmp     77D32187
77D3B084    33C0            xor     eax, eax
77D3B086  ^ E9 B24FFFFF     jmp     77D3003D
77D3B08B    6A 01           push    1
77D3B08D    6A 01           push    1
77D3B08F    68 F4000000     push    0F4
77D3B094    FF75 10         push    dword ptr [ebp+10]

再run踪,统计如下

统计用于 cm
计数       地址       第一个命令                        注释
99.        00401500   push    ebp
7.         004014E0   push    ebp
3.         00401000   push    ebp
3.         00401020   push    ebp
1.         00401003   sub     esp, 40
1.         00401023   sub     esp, 44
1.         004014E3   sub     esp, 40
1.         00401503   sub     esp, 44
1.         00401670   push    ebp
1.         00401750   mov     ecx, dword ptr [ebp-10]
1.         00401E70   push    ebp
1.         00401EF0   push    ebp

再点击1.         00401750   mov     ecx, dword ptr [ebp-10]
得到如下
0040173F  |.  C745 FC FFFFF>mov     dword ptr [ebp-4], -1
00401746  |.  8D4D 9C       lea     ecx, dword ptr [ebp-64]
00401749  |.  E8 580A0000   call    <jmp.&MFC42.#755>
0040174E  |.  EB 08         jmp     short 00401758
00401750  |>  8B4D F0       mov     ecx, dword ptr [ebp-10]
00401753  |.  E8 98070000   call    00401EF0
00401758  |>  8B4D F4       mov     ecx, dword ptr [ebp-C]
0040175B  |.  64:890D 00000>mov     dword ptr fs:[0], ecx
00401762  |.  5F            pop     edi
00401763  |.  5E            pop     esi
00401764  |.  5B            pop     ebx
00401765  |.  8BE5          mov     esp, ebp
00401767  |.  5D            pop     ebp
00401768  \.  C3            retn

怕遗漏,我打算在00401670  /.  55            push    ebp这个开始处下断,
----------------------------------------------------------------------------------

我找到了关键的代码没有啊
2008-12-24 16:15
0
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
老大,你是怎么暴的啊,这说明你找到了代码啊

怎么找到这部分代码的啊?
2008-12-24 16:26
0
雪    币: 222
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
你很强大呀
2008-12-24 16:33
0
雪    币: 10936
活跃值: (3293)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
15
你点右键 查找字符串,会看到
"sorry!"
"ok!good job!"
类似的串,点进去 
就是算法部分的代码,

建议 你多看看 别人写的 破文
或者你先去 按别人写的破文实践下 会更好
我就是那么走过来的.

跟着别人的破文走一边 对cm 就有个基本的框架了
加油!
2008-12-24 16:44
0
雪    币: 10936
活跃值: (3293)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
16
建议有兴趣的朋友把这段代码手工逆出来 有助提高能力!
可以把<《天书夜读》> 拿来当参考资料.
<《天书夜读》> 开头部分 有逆向介绍,比较基础,实用,
这个算法 就是几个while循环嵌套在里面 代码不长.
2008-12-24 16:55
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
17
name:painnn

code1:paipiaaipapiiapipa

code2:paipiaaipapiipaiap

code3:...

算法大致搞清楚了,呵呵。排列,分6组。看我给出的两组结果大家应该有所启发。

上个图吧。注意我图中的用户名,是paixxx,因为用户名只有前3位对注册码的验证有效哦



等我点完提交了,看到有人已经解出来了。

呵呵,慢了一步。
上传的附件:
2008-12-24 16:57
0
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
CCDebuger的消息断点与跟踪的办法来的
结果没有找到,唉,变化太多了,
2008-12-24 16:58
0
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
老大,还有个问题啊,如果他这里没有错误提示,只有正确提示

并且正确提示还是调用的一个函数来弹出的,

这样的话,我即使用正确提示的字符找到了那一片关键代码,但是它是由谁跳过来的,我怎么确定啊?
2008-12-24 17:11
0
雪    币: 10936
活跃值: (3293)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
20
你太强了!
2008-12-24 17:27
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
OD载入后,运行了一下,看到有错误提示,直接F12暂停,看调用堆栈(Alt+K),返回后跟的。
还没看字符串。刚才看了下有字符提示,那就更好了。
一共改了3个地方吧。下班前弄的,时间急没记录。用人笨的方法,你每改一个跳过错误的地方存一份,然后在打开这存的这份在找错误的地方在改,在存在打开,当然做记录也可以。笨人用笨方法。
2008-12-24 18:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
00401C56为关键CALL。进去了,呵呵,因为刚学汇编,先查查资料才能看懂算法,不过认同findlakes说的,只与用户名的前三位有关,而且用户名好像必须是六位吧?LZ对吗
2008-12-25 11:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
搞定,00401871开始算法核心
2008-12-25 12:06
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
嗯,还是直接爆了有快感!
上传的附件:
2008-12-29 20:20
0
雪    币: 10936
活跃值: (3293)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
25
算法部分代码:
void fun1(char *u,char *key)
{
	char ub[6]={'&','(','@','!',')','^'}; //&38 (40  @64 (&@ (@& &(@ &@( @(& @&(
	char keyb[18];
	int keyn[18];
	int rn[6];
	int flag=0;
	int ren=0;
	int c1=0;
	int c2=0;
	int i=0;
	int j=0;
	int k=0;
	while(k<6)
	{
		i=0;
		j=0;
		while(i<3)
		{
			j=0;
			while(j<3)
			{
			//	if(!flag)
				if(u[j]==u[j-1]&&j!=0)
				{
					AfxMessageBox("sorry!");
					return;
				}
				if(key[c1]==u[j])
					break;	
				j++;
			}
			if(j>=3)
			{
				AfxMessageBox("sorry!");
				return;
			}
			else
			{
				keyb[c1]=ub[j];
				if(c1%3==0)
					keyn[c2++]=0;
				else
				{
					if(keyb[c1]>keyb[c1-1])
					keyn[c2]=keyn[c2-1]+1;
					else keyn[c2]=keyn[c2-1]-1;
					c2++;
				}
				
				c1++;
			}				
			i++;
		//	flag=1;
		}
        rn[ren++]=keyn[c2-1]+keyn[c2-2]+keyn[c2-3];
		k++;
	}
	ren=0;
	k=6;
	int c=0;
	i=j=0;
	int co=0;
	while(ren<6)
	{
		c=ren+1;
		while(c<k)
		{
			if(rn[ren]==rn[c])
			{
				co=0;
				i=0;
				while(i<3)
				{
					if(keyb[ren*3+i]!=keyb[c*3+i])
						co+=1;
					i++;
				}
				if(co!=2)
				{
					AfxMessageBox("sorry!");
					return;
				}
			}
			c++;
		}
		ren++;
	}
   AfxMessageBox("ok!good job!");
}

简单说明:
对应abcdef的注册码
就是把abc三个字符的全排列连接起来的字符串.
比如abc做一次全排列有如下结果:
abc acb bac bca cba cab
把这几个字符串连在一起就得到abcdef的注册码 这几个字符串连接时位置是可以任意的.
上面的代码就是来接测提供的注册码是否满足这样的条件.
检测方法如下:
把上面几个字符串的第一个字符 统一编号为0,后一个字符如果大于前一个字符,编号等于前一个的编号+1 ,否则-1,依次类推.
然后分别把几个字符串的字符的编号相加得到6个数字,比较这六个数字,如果有两个相等,在把对应的这两个字符串比较(按下标,0对0,1对1,2对2),如果字符串里至少有两个字符不一样那么就通过,否则出错.
例如:
字符串   编号  求和
abc      0,1,2    3
acb      0,1,0    1
bac      0,-1,0  -1
bca      0,1,0    1
cba      0,-1,-2  -3
cab      0,-1,0   -1
根据上面的结果,如果输入abc acb bac bca cba cab作为注册码程序会把第2组与第4组,把第3组与6组做比较.
另外程序缺少对注册码字符重复的验证.以至出现其他非预期的结果
2008-12-31 09:10
0
游客
登录 | 注册 方可回帖
返回
//