这是键盘乐器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吗?
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)