首页
社区
课程
招聘
请问:这样的算法可以通过逆向来求出注册码吗?
发表于: 2005-1-27 19:42 4651

请问:这样的算法可以通过逆向来求出注册码吗?

2005-1-27 19:42
4651
这是键盘乐器2.2 里注册码的算法:

00406888 . FF15 DCE14000 call dword ptr ds:[<&USER32.GetDlg>; \GetDlgItemInt
0040688E . 8B35 74334100 mov esi,dword ptr ds:[413374] <----机器码:456320
<----Eax为假注册码:123456
00406894 . B9 20000000 mov ecx,20
00406899 . 83E6 1F and esi,1F
0040689C . 8BD0 mov edx,eax
0040689E . 2BCE sub ecx,esi
004068A0 . BD 15D30800 mov ebp,8D315
004068A5 . D3E8 shr eax,cl
004068A7 . 8BCE mov ecx,esi
004068A9 . BE 0F000000 mov esi,0F
004068AE . D3E2 shl edx,cl
004068B0 . 0BC2 or eax,edx
004068B2 . 2D 78DAEC00 sub eax,0ECDA78
004068B7 . 99 cdq
004068B8 . 83E2 03 and edx,3
004068BB . 03C2 add eax,edx
004068BD . 8BC8 mov ecx,eax
004068BF . 8BC7 mov eax,edi
004068C1 . 99 cdq
004068C2 . F7FE idiv esi
004068C4 . 8BC7 mov eax,edi
004068C6 . C1F9 02 sar ecx,2
004068C9 . 81F1 FE0F0F0F xor ecx,0F0F0FFE
004068CF . 8BF2 mov esi,edx
004068D1 . 99 cdq
004068D2 . 69F6 60A49A04 imul esi,esi,49AA460
004068D8 . F7FD idiv ebp
004068DA . 2BF2 sub esi,edx
004068DC . 03F7 add esi,edi
004068DE . 81F6 6F3D6400 xor esi,643D6F
004068E4 . F7D6 not esi
004068E6 . 81E6 FFFFFF0F and esi,0FFFFFFF
004068EC . 3BF1 cmp esi,ecx
004068EE . 75 35 jnz short 键盘乐器.00406925 <----跳转则玩完!
004068F0 . 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
004068F2 . 68 0C1A4100 push 键盘乐器.00411A0C ; |Title = "欢迎使用!"
004068F7 . 68 E4194100 push 键盘乐器.004119E4 ; |Text = "注册成功!谢谢您对国产共享软件的支持。"
004068FC . 53 push ebx ; |hOwner
004068FD . C705 70334100 010>mov dword ptr ds:[413370],1 ; |
00406907 . FF15 BCE14000 call dword ptr ds:[<&USER32.Messag>; \MessageBoxA

综上:
假设机器码=mc
注册码=key

a=mc and 31
b=32 -a
c=key shr b
d=key shl a
e=c or d
******

f=e - 15522424
g=0(f>0) or g=-1(f<0)
g=g and 3
h=f + g
i=mc mod 15
j=h /4
j=j xor 252645374
********

k=i * 77243488
l=mc mod 578325
k=k-l
k=k+mc
k=k xor 6569327
not k
k=k and fffffff
********
比较 k和 j 不相等则玩完!

我的问题是:
计算注册码的一开始 :
a=mc and 31(1F)
b=32(20) -a
c=key shr b
d=key shl a
e=c or d
******
而后面的运算都是对e进行的
而e是由c 和d "or"出来的,因此c和d有多种可能
而c和d又是由key得出来,请问这样的算法可以通过逆向法推出注册码key吗?

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
2
没有问题,注意a+b=32.然后把key右移b位左移a位,或起来以后,恰好是等于把key从(mc and 1F)(mc后五位)的地方断开交换位置
在这里or的时候必有一个数是0的
2005-1-27 20:59
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
贴个注册机,写得不好,请多多见谅!
#include <stdio.h>
main()
{
        unsigned long int mc,temp1,e,key;
        printf("\n键盘乐器2.2注册机\n\n**Make by 翼若云**\n\n请输入机器码:");
        scanf("%ld",&mc);
        temp1=(mc%0xF)*0x49AA460-(mc%0x8D315)+mc;
        temp1=(~(temp1^0x643D6F))&0x0FFFFFFF;
        e=(temp1^0x0F0F0FFE)*4+0x00ECDA78;
        key=(e<<(32-mc&0x1F))|(e>>(mc&0x1F));               
        printf("注册码为:%ld\n",key);

}
2005-1-28 00:07
0
雪    币: 200
活跃值: (75)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
很感谢楼上提供注册机,可是编译运行后

请输入机器码:456302
注册码为:-994009653
Press any key to continue

而且注册码提示错误。请问哪里有错?
2005-1-28 09:07
0
雪    币: 200
活跃值: (75)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
最初由 RoBa 发布
没有问题,注意a+b=32.然后把key右移b位左移a位,或起来以后,恰好是等于把key从(mc and 1F)(mc后五位)的地方断开交换位置
在这里or的时候必有一个数是0的


请问为什么是:  (mc后五位)的地方断开交换位置?
我觉得:因为开始的时候key是未知的,即你要求的,因此即使 a,b你知道,可是c,d却有许多可能。
谢谢.
2005-1-28 09:13
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
6
e是能够求得的吧。ab也知道,
c=key shr b
d=key shl a
从前面知道a+b=32,注意CPU的字长是32位,算术左移右移是对无符号数,即最高位不看作符号位,移出的会被丢弃而空位用0补。
比如 key=12345678,a=8,b=24
key shr b = 00000012
key shl a = 34567800
所以or以后恰好是34567812 不会出现别的情况,恰好是错开的。明白没有

3楼注册码应该对的,可能是符号的问题,试试无符号数14158100
2005-1-28 10:58
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这是我的第一个注册机,昨晚做的也比较匆忙,还请大家指教。
2005-1-28 12:20
0
雪    币: 200
活跃值: (75)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
谢谢楼上各位的帮忙,我终于弄明白了!
附上我的算法(Delphi):
a:=mc and 31;
b:=32-a;
i:=mc mod 15;
l:=mc mod 578325;
k:=i *77243488;
k:=k-l;
k:=k+mc;
k:=k xor 6569327;
k:=not k;
k:=k and 268435455;
j:=k;
j:=j xor 252645374;
h:=j*4;
f:=h;
e:=f+15522424;
tmp1:=e shr a;
tmp2:=e shl b;
key:=tmp1 or tmp2
2005-1-28 15:26
0
游客
登录 | 注册 方可回帖
返回
//