能力值:
( LV2,RANK:10 )
|
-
-
26 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
27 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
28 楼
好象没这么麻烦,我在运行后,用万能断点,断下,返回用户代码后
直接来到 004011E5 . E8 56010000 CALL TraceMe.00401340
F7 进入,发现是算法 CALL (事前我把附件下了,但没看楼主的破文,这样先自己玩一下,锻炼一下)
00401340 /$ 55 PUSH EBP
00401341 |. 8B6C24 0C MOV EBP,DWORD PTR SS:[ESP+C] ; EBP 保存输入的用户名
00401345 |. 56 PUSH ESI
00401346 |. 57 PUSH EDI
00401347 |. 8B7C24 18 MOV EDI,DWORD PTR SS:[ESP+18] ; EDI = 5
0040134B |. B9 03000000 MOV ECX,3
00401350 |. 33F6 XOR ESI,ESI
00401352 |. 33C0 XOR EAX,EAX
00401354 |. 3BF9 CMP EDI,ECX 00401356 |. 7E 21 JLE SHORT TraceMe.00401379
00401358 |. 53 PUSH EBX
00401359 |> 83F8 07 /CMP EAX,7
0040135C |. 7E 02 |JLE SHORT TraceMe.00401360
0040135E |. 33C0 |XOR EAX,EAX
00401360 |> 33D2 |XOR EDX,EDX
00401362 |. 33DB |XOR EBX,EBX
00401364 |. 8A1429 |MOV DL,BYTE PTR DS:[ECX+EBP] ; [ECX+EBP] ECX =3+ EBP 就是取注册名的第三个字符
00401367 |. 8A98 30504000 |MOV BL,BYTE PTR DS:[EAX+405030] ; 将 0C 送入 BL
0040136D |. 0FAFD3 |IMUL EDX,EBX ; 将 两个字符相乘,结果送入 EDX
00401370 |. 03F2 |ADD ESI,EDX ; 把上面的结果和 ESI 相加,结果入 ESI
00401372 |. 41 |INC ECX ; 指向下一个字符(用户名)
00401373 |. 40 |INC EAX ; EAX 加 1,使下一个想乘的是 0A
00401374 |. 3BCF |CMP ECX,EDI ; 和 5 做比较,大就跳出
00401376 |.^ 7C E1 \JL SHORT TraceMe.00401359
00401378 |. 5B POP EBX
发现,算法中只计算用户名的 4,5 位,而相乘的两个数是固定的
0XC 和 OXA ,于是就写了注册机
#include<stdio.h>
#include<string.h>
main()
{
int i,bp,si=0,v=0xC,len;
char n[20];
printf("请输入用户名\n");
s:
gets(n);
len=strlen(n);
if(len<5)
{
printf("用户名不能小于 5 个字符,请重新输入\n");
goto s;
}
for(i=3;i<5;i++)
{
bp=n[i];
bp*=v;
v=v-2;
si+=bp;
}
printf("注册码是:%d\n",si);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
正在学注册机,支持一下!
|
能力值:
( LV12,RANK:460 )
|
-
-
30 楼
其实直接用字符串参考就行了,不是可以找到“你输入字符要大于四个!”吗!
说明在它附近调用过GetDlgItemText函数,向下翻两页就可以发现
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
写得不错,那天我也发一份破文,可惜汇编学得不行
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
写的不错,适合我这类菜鸟,学习中....
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
ANSON
1728
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
收下了,学习中...
|
|
|