能力值:
( LV2,RANK:10 )
|
-
-
2 楼
沙发,最喜欢玩你的cm了
|
能力值:
( LV3,RANK:30 )
|
-
-
3 楼
爆破!呵呵,晚上在跟踪注册码!
|
能力值:
(RANK:260 )
|
-
-
4 楼
有点意思,一会下课回来接着看。
|
能力值:
( LV13,RANK:760 )
|
-
-
5 楼
头都被绕晕了,好多比较!
|
能力值:
(RANK:520 )
|
-
-
6 楼
"头都被绕晕了,好多比较!"
呵呵 要的就是这个效果
猪蹄 里带点硬骨头 放松 ,
静下心来慢慢啃 啃出好味道
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
确实有点晕,我也晕 ,跟你以前那个有一拼。
从中午,搞到现在了我。
我提供一个注册码,工作去了,keygen以后再写。
u:abcdef
k:abccbaabbcabacacbc
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
疯了,受不了了.
|
能力值:
(RANK:520 )
|
-
-
9 楼
不错,我昨天调试这cm时 也有点晕 还有点困,迷迷糊糊的
按我最开始的思想设计 注册码可能有6*5*4*3*2*6位
太恐怖了,还是罢了.
然后注册码里还有些限制 后来脑袋不想工作了
就拿这个上来了,这个限制条件不完善,难度不大.
娱乐下
|
能力值:
( LV5,RANK:60 )
|
-
-
10 楼
好象只跟用户名前三位有关 注册吗则是前18位有效
u:finhhh
k:finniffiinfifnfnni
诸如此类都可以
u:finaaa
k:finniffiinfifnfnniasdasdasd
u:fincvb
k:finniffiinfifnfnnisdferer
所以只要搞出来一组 算法就没用了
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
晕了。只能爆了。算法不会。绕都绕晕别说算了。
|
能力值:
( 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这个开始处下断,
----------------------------------------------------------------------------------
我找到了关键的代码没有啊
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
老大,你是怎么暴的啊,这说明你找到了代码啊
怎么找到这部分代码的啊?
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
你很强大呀
|
能力值:
(RANK:520 )
|
-
-
15 楼
你点右键 查找字符串,会看到
"sorry!"
"ok!good job!"
类似的串,点进去
就是算法部分的代码,
建议 你多看看 别人写的 破文
或者你先去 按别人写的破文实践下 会更好
我就是那么走过来的.
跟着别人的破文走一边 对cm 就有个基本的框架了
加油!
|
能力值:
(RANK:520 )
|
-
-
16 楼
建议有兴趣的朋友把这段代码手工逆出来 有助提高能力!
可以把<《天书夜读》> 拿来当参考资料.
<《天书夜读》> 开头部分 有逆向介绍,比较基础,实用,
这个算法 就是几个while循环嵌套在里面 代码不长.
|
能力值:
(RANK:260 )
|
-
-
17 楼
name:painnn
code1:paipiaaipapiiapipa
code2:paipiaaipapiipaiap
code3:... 算法大致搞清楚了,呵呵。排列,分6组。看我给出的两组结果大家应该有所启发。
上个图吧。注意我图中的用户名,是paixxx,因为用户名只有前3位对注册码的验证有效哦
等我点完提交了,看到有人已经解出来了。
呵呵,慢了一步。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
CCDebuger的消息断点与跟踪的办法来的
结果没有找到,唉,变化太多了,
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
老大,还有个问题啊,如果他这里没有错误提示,只有正确提示
并且正确提示还是调用的一个函数来弹出的,
这样的话,我即使用正确提示的字符找到了那一片关键代码,但是它是由谁跳过来的,我怎么确定啊?
|
能力值:
(RANK:520 )
|
-
-
20 楼
你太强了!
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
OD载入后,运行了一下,看到有错误提示,直接F12暂停,看调用堆栈(Alt+K),返回后跟的。
还没看字符串。刚才看了下有字符提示,那就更好了。
一共改了3个地方吧。下班前弄的,时间急没记录。用人笨的方法,你每改一个跳过错误的地方存一份,然后在打开这存的这份在找错误的地方在改,在存在打开,当然做记录也可以。笨人用笨方法。
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
00401C56为关键CALL。进去了,呵呵,因为刚学汇编,先查查资料才能看懂算法,不过认同findlakes说的,只与用户名的前三位有关,而且用户名好像必须是六位吧?LZ对吗
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
搞定,00401871开始算法核心
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
嗯,还是直接爆了有快感!
|
能力值:
(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组做比较.
另外程序缺少对注册码字符重复的验证.以至出现其他非预期的结果
|
|
|