能力值:
( LV2,RANK:10 )
|
-
-
7 楼
这个破解得算法原来大概已经跟出来 但是在写注册机的时候发现问题
1.用户名每一位取出来的asc码相加 假设结果为x
则通过用户计算出的最终结果为 -x * ( x + 用户名长度 )
2.注册码算法是
假设注册码为1234 一开始反序 变成 4321 假设这个值为 y
然后取 y的补 然后 求平方 并且乘以 用户名长度
y = (-y) * ( -y)
即 y * 用户名长度 假设 为z
最后 如果 x + y + z = 0 则表示成功
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
刚学逆向,这个CrackMe就花了n小时,呵呵.
写了个注册机 c代码
最终只要
(ss+ns)(ss-ns-nl)=0 即可
所以有两种注册码:
ss = -ns ;
ss = ns + nl;
其中,ns是注册名各位的ascii码和,nl是注册名长度
------------------------------------
#include <stdio.h>
void keygen(char* name);
void main(int argc, char* argv[])
{
if(argc == 2)
{
keygen(argv[1]);
}
else
{
printf("Usage:\r\n\t%s <name>\r\n", argv[0]);
}
}
void keygen(char* name)
{
int i=0, namesum=0, namelen=strlen(name);
for(i; i<namelen; i++)
{
namesum = name[i]+namesum;
}
printf("Name:\t%s\r\n", name);
printf("Serial[1]:\t%u\r\n", -namesum);
printf("Serial[2]:\t%u\r\n", namesum+namelen);
}
|
能力值:
( LV4,RANK:50 )
|
-
-
17 楼
004023C0 /> \55 push ebp
004023C1 |. 8BEC mov ebp,esp
004023C3 |. 81EC 90000000 sub esp,0x90
004023C9 |. 53 push ebx
004023CA |. 56 push esi
004023CB |. 57 push edi
004023CC |. 51 push ecx
004023CD |. 8DBD 70FFFFFF lea edi,[local.36]
004023D3 |. B9 24000000 mov ecx,0x24
004023D8 |. B8 CCCCCCCC mov eax,0xCCCCCCCC
004023DD |. F3:AB rep stos dword ptr es:[edi]
004023DF |. 59 pop ecx
004023E0 |. 894D FC mov [local.1],ecx
004023E3 |. 6A 01 push 0x1
004023E5 |. 8B4D FC mov ecx,[local.1]
004023E8 |. E8 7DEDFFFF call <jmp.&MFC42D.#5056>
004023ED |. C745 F8 00000>mov [local.2],0x0
004023F4 |. C745 F0 00000>mov [local.4],0x0
004023FB |. 8B4D FC mov ecx,[local.1]
004023FE |. 83C1 60 add ecx,0x60
00402401 |. E8 8EFBFFFF call <jmp.&MFC42D.#880> ; 得到用户名
00402406 |. 50 push eax ; /src
00402407 |. 8D45 D0 lea eax,[local.12] ; |
0040240A |. 50 push eax ; |dest
0040240B |. E8 24EDFFFF call <jmp.&MSVCRTD.strcpy> ; \strcpy
00402410 |. 83C4 08 add esp,0x8 ; 并把用户名放到局部变量local.12中
00402413 |. 8D4D D0 lea ecx,[local.12]
00402416 |. 51 push ecx ; /s
00402417 |. E8 1EEDFFFF call <jmp.&MSVCRTD.strlen> ; \strlen
0040241C |. 83C4 04 add esp,0x4 ; 得到用户名长度
0040241F |. 8945 E8 mov [local.6],eax ; 把用户名长度放在local.6变量中
00402422 |. C745 EC 00000>mov [local.5],0x0
00402429 |. EB 09 jmp short Bxm_Crac.00402434
0040242B |> 8B55 EC /mov edx,[local.5] ; 求用户名的ASCII和,并将结果放在local.2中
0040242E |. 83C2 01 |add edx,0x1
00402431 |. 8955 EC |mov [local.5],edx
00402434 |> 8B45 EC mov eax,[local.5]
00402437 |. 3B45 E8 |cmp eax,[local.6] ; 0与用户名长度比较
0040243A |. 7D 12 |jge short Bxm_Crac.0040244E
0040243C |. 8B4D EC |mov ecx,[local.5]
0040243F |. 0FBE540D D0 |movsx edx,byte ptr ss:[ebp+ecx-0x30]
00402444 |. 8B45 F8 |mov eax,[local.2]
00402447 |. 03C2 |add eax,edx
00402449 |. 8945 F8 |mov [local.2],eax
0040244C |.^ EB DD \jmp short Bxm_Crac.0040242B
0040244E |> 8B4D F8 mov ecx,[local.2]
00402451 |. F7D9 neg ecx ; 将用户名ASCII码和进行neg运算,结果放在ecx中
00402453 |. 8B55 F8 mov edx,[local.2]
00402456 |. 0355 E8 add edx,[local.6] ; 名ASCII和+用户名长度,结果放在edx中
00402459 |. 0FAFCA imul ecx,edx
0040245C |. 894D F4 mov [local.3],ecx ; 将上述两者的积放入local.3中
0040245F |. 8B4D FC mov ecx,[local.1]
00402462 |. 83C1 64 add ecx,0x64
00402465 |. E8 2AFBFFFF call <jmp.&MFC42D.#880>
0040246A |. 50 push eax ; /src
0040246B |. 8D45 B8 lea eax,[local.18] ; |
0040246E |. 50 push eax ; |dest
0040246F |. E8 C0ECFFFF call <jmp.&MSVCRTD.strcpy> ; \strcpy
00402474 |. 83C4 08 add esp,0x8 ; 把注册码拷到local.18变量中
00402477 |. C745 B0 01000>mov [local.20],0x1
0040247E |. 8D4D B8 lea ecx,[local.18]
00402481 |. 51 push ecx ; /s
00402482 |. E8 B3ECFFFF call <jmp.&MSVCRTD.strlen> ; \strlen
00402487 |. 83C4 04 add esp,0x4 ; 求出code的长度
0040248A |. 83E8 01 sub eax,0x1
0040248D |. 8945 B4 mov [local.19],eax ; code的长度-1放到local.19变量中
00402490 |. EB 09 jmp short Bxm_Crac.0040249B ; 下面的循环取出注册码的16进制值,结果放local.4变量中
00402492 |> 8B55 B4 /mov edx,[local.19]
00402495 |. 83EA 01 |sub edx,0x1
00402498 |. 8955 B4 |mov [local.19],edx
0040249B |> 837D B4 00 cmp [local.19],0x0
0040249F |. 7C 22 |jl short Bxm_Crac.004024C3
004024A1 |. 8B45 B4 |mov eax,[local.19]
004024A4 |. 0FBE4C05 B8 |movsx ecx,byte ptr ss:[ebp+eax-0x48]
004024A9 |. 83E9 30 |sub ecx,0x30
004024AC |. 0FAF4D B0 |imul ecx,[local.20]
004024B0 |. 8B55 F0 |mov edx,[local.4]
004024B3 |. 03D1 |add edx,ecx
004024B5 |. 8955 F0 |mov [local.4],edx
004024B8 |. 8B45 B0 |mov eax,[local.20]
004024BB |. 6BC0 0A |imul eax,eax,0xA
004024BE |. 8945 B0 |mov [local.20],eax
004024C1 |.^ EB CF \jmp short Bxm_Crac.00402492
004024C3 |> 8B4D F0 mov ecx,[local.4]
004024C6 |. 6BC9 FF imul ecx,ecx,-0x1 ; 将上述结果乘以-0x1
004024C9 |. 894D F0 mov [local.4],ecx ; 把结果放回local.4变量
004024CC |. 837D E8 00 cmp [local.6],0x0 ; 用户名长度不为0
004024D0 |. 74 2F je short Bxm_Crac.00402501 ; 不能跳
004024D2 |. 8B55 F0 mov edx,[local.4]
004024D5 |. 0FAF55 F0 imul edx,[local.4] ; 将上述结果平方
004024D9 |. 8B45 F0 mov eax,[local.4] ; local.4是第一阶段的结果..在上面
004024DC |. 0FAF45 E8 imul eax,[local.6] ; 乘以用户名长度
004024E0 |. 8B4D F4 mov ecx,[local.3] ; 第一阶段的结果,在上面
004024E3 |. 03CA add ecx,edx
004024E5 |. 03C1 add eax,ecx
004024E7 |. 85C0 test eax,eax
004024E9 |. 75 16 jnz short Bxm_Crac.00402501 ; 不能跳
004024EB |. 6A 00 push 0x0
004024ED |. 68 20514100 push Bxm_Crac.00415120
004024F2 |. 68 14514100 push Bxm_Crac.00415114
004024F7 |. 8B4D FC mov ecx,[local.1]
004024FA |. E8 71ECFFFF call <jmp.&MFC42D.#3517>
004024FF |. EB 14 jmp short Bxm_Crac.00402515
00402501 |> 6A 00 push 0x0
00402503 |. 68 08514100 push Bxm_Crac.00415108
00402508 |. 68 58504100 push Bxm_Crac.00415058
0040250D |. 8B4D FC mov ecx,[local.1]
00402510 |. E8 5BECFFFF call <jmp.&MFC42D.#3517> ; 失败
00402515 |> 6A 00 push 0x0
00402517 |. 8B4D FC mov ecx,[local.1]
0040251A |. E8 4BECFFFF call <jmp.&MFC42D.#5056>
0040251F |. 5F pop edi
注释:A= (neg 用户名ASCII和)*(用户名ASCII和 + 用户名长度);
B= (注册码ASCII和 * (-0x1)) +A
result = B+(注册码ASCII和*(-0x1)) * 用户名长度
如果result==0,就成功
否则,注册失败....
|