-
-
[原创]键盘乐器算法分析
-
发表于:
2006-5-23 22:52
7461
-
【破文标题】键盘乐器算法分析
【破文作者】?幻刹那
【作者邮箱】lovecy616927@yahoo.com.cn
【所属组织】??游民
【软件名称】键盘乐器
【下载地址】http://kmxuyi.vip.myrice.com/chinese/
【破解工具】w32asm ,od
【保护方式】注册码保护方式
【软件限制】试用次数
【破解难度】简单
----------------------------------------------------
软件介绍:
键盘乐器是一个利用电脑键盘演奏乐器的软件。操作非常简单。用他你可以演奏包括钢琴,小提琴,吉他,萨克斯,古筝在内的一百多种乐器和音效!键盘乐器具有录制功能、调式的选择功能,键盘布局合理。
利用键盘乐器的录制功能你能将自己的得意之作录制下来,保存为文件,和朋友一起分享。
调式的选择使你可以根据乐谱选择各种调式,如C大调,F大调,c小调等,操作更加简便。
合理的键盘布局让你在弹奏乐器时手感舒适,无形中还能提高你的指法,当你成为键盘乐器高手时,说不定已炼成“弹指神通”。^_^
----------------------------------------------------
破解声名:我是一只小菜鸟,偶得一点心得,愿与大家分享:)
----------------------------------------------------
【破解分析】
用W32ASM找关键字,很快来到下面这里,下面是我找的关键算法部分
00406882 . 68 02010000 PUSH 102 ; |ControlID = 102 (258.)
00406887 . 53 PUSH EBX ; |hWnd
00406888 . FF15 DCE14000 CALL DWORD PTR DS:[<&USER32.GetDlgItemIn>; \取得我们输入的假注册码的16进制,放入eax中
0040688E . 8B35 74334100 MOV ESI,DWORD PTR DS:[413374] ; 取得我们的机器码的16进制2BFC631存入esi
00406894 . B9 20000000 MOV ECX,20 ; ecx加20
00406899 . 83E6 1F AND ESI,1F ; 16进制机器码和1f进行与运算=00000011
0040689C . 8BD0 MOV EDX,EAX ; eax传 给edx其中eax是我们输入的注册码的16进制
0040689E . 2BCE SUB ECX,ESI ; ecx减去 esi,ecx=0f
004068A0 . BD 15D30800 MOV EBP,8D315 ; 把8D315的值放到ebp=8D315
004068A5 . D3E8 SHR EAX,CL ; 逻辑右移cl位,输入注册码=932c,cl=0f=ecx的低八位
004068A7 . 8BCE MOV ECX,ESI ; 把esi的值放入ecx中,esi=11
004068A9 . BE 0F000000 MOV ESI,0F ; esi=0f
004068AE . D3E2 SHL EDX,CL ; 输入的注册码在逻辑左移动cl位,edx=5A40000 111
004068B0 . 0BC2 OR EAX,EDX ; 把2者在或运算 1111111111111
004068B2 . 2D 78DAEC00 SUB EAX,0ECDA78 ; eax减去0ECDA78 V111111111
004068B7 . 99 CDQ ; edx清零
004068B8 . 83E2 03 AND EDX,3 ; edx和3与运算
004068BB . 03C2 ADD EAX,EDX ; edx加eax,edx=3
004068BD . 8BC8 MOV ECX,EAX ; 把eax的值赋给ecx,也即我们输入计算的数放在ecx中
004068BF . 8BC7 MOV EAX,EDI ; 把edi的值赋给eax,edi存的是我们机器码的16进制
004068C1 . 99 CDQ ; edx清零
004068C2 . F7FE IDIV ESI ; eax除esi,商在eax余数在edx中
004068C4 . 8BC7 MOV EAX,EDI ; 继续把机器码放在eax中
004068C6 . C1F9 02 SAR ECX,2 ; 把我们输入得到的数逻辑右移2位
004068C9 . 81F1 FE0F0F0F XOR ECX,0F0F0FFE ; 把ecx和0f0F0FFFE
004068CF . 8BF2 MOV ESI,EDX ; EDX的值传给ESI,esi=edx=5
004068D1 . 99 CDQ ; edx清零
004068D2 . 69F6 60A49A04 IMUL ESI,ESI,49AA460 ; 49AA460*5
004068D8 . F7FD IDIV EBP ; eax除ebp商在eax,余数在edx
004068DA . 2BF2 SUB ESI,EDX ; esi=esi-edx
004068DC . 03F7 ADD ESI,EDI ; 把机器码加上esi
004068DE . 81F6 6F3D6400 XOR ESI,643D6F
004068E4 . F7D6 NOT ESI
004068E6 . 81E6 FFFFFF0F AND ESI,0FFFFFFF
004068EC . 3BF1 CMP ESI,ECX ; esi和ecx相等吗,相等就注册成功,不等就注册失败
004068EE . 75 35 JNZ SHORT JPYQ.00406925 ; 爆破点
004068F0 . 6A 40 PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
004068F2 . 68 0C1A4100 PUSH JPYQ.00411A0C ; |Title = "欢迎使用!"
004068F7 . 68 E4194100 PUSH JPYQ.004119E4 ; |Text = "注册成功!谢谢您对国产共享软件的支持。"
004068FC . 53 PUSH EBX ; |hOwner
004068FD . C705 70334100 010000>MOV DWORD PTR DS:[413370],1 ; |
00406907 . FF15 BCE14000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
0040690D > 6A 00 PUSH 0 ; /Result = 0; Case 2 of switch 0040684A
0040690F . 53 PUSH EBX ; |hWnd
00406910 . FF15 ECE14000 CALL DWORD PTR DS:[<&USER32.EndDialog>] ; \EndDialog
00406916 . 5F POP EDI
00406917 . 5E POP ESI
00406918 . 5D POP EBP
00406919 . B8 01000000 MOV EAX,1
0040691E . 5B POP EBX
0040691F . 83C4 08 ADD ESP,8
00406922 . C2 1000 RETN 10
00406925 > 6A 40 PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00406927 . 68 D4194100 PUSH JPYQ.004119D4 ; |Title = "请检查注册码"
0040692C . 68 B8194100 PUSH JPYQ.004119B8 ; |Text = "注册失败!请检查注册码。"
00406931 . 53 PUSH EBX ; |hOwner
00406932 . FF15 BCE14000 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
00406938 . 5F POP EDI
----------------------------------------------------
【总结】
总的算法是由机器码得到生成一个数,然后再由我们输入的数生成一个数,如果这两个数相等就注册成功,有机器码得到数的运算过程是:(我们设机器码是A)
1:A/0F=商B 余数C
2:余数C*49AA460=D
3: A/8D315 =商E 余数F
4: Z=D-F+A
5: Z=Z XOR 643D6F
6: Z=NOT Z
7: Z= AND 0FFFFFFFF
这个就是我们由机器码得到的一个数Z
我们输入的数他的运算过程如下:
设我们输入的数为H
1 H逻辑右移0f位得到一个数为I
2 H逻辑左移0F位得到一个数为J
3 I=I OR J
4 I=I-0ECDA78
5 I=I SAR 2
6 I=I XOR 0F0F0FFE( 这个就是由我们输入的数生成的数)
最后I=Z就注册成功 (我们可以逆向就可以得到注册码了,很累了,就到这里了
初次写算法表达可能不好,错误之处在所难免,恳请指正
----------------------------------------------------
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)