Muse软件,是一款柔韧性很强的综合乐谱排版软件,拥有世界上唯一能够将五线谱、简谱、吉他谱、歌词无缝整合的能力。灵活快捷的编辑输入方式,清晰的乐谱屏幕渲染能力,还有高保真矢量打印输出,使它必然成为您优雅的音乐生活的好帮手。  
前些日子要用这个软件,用OD调试了一下,在看雪搜了一下,没有关于这个软件的记录,今天把当时调试时的手记发一下,也为看雪贡献一些力量。


下 bp MessageBoxA 断点,


0012F734   004C16A9  /CALL 到 MessageBoxA 来自 Muse.004C16A3

0012F74C   00403592  返回到 Muse.00403592 来自 Muse.004C167B


一步步回溯,找到关键跳:
00403547     /75 78         je     short 004035C1


改jne

打印是跳过了,可是不行,预览不出内容。继续向上找一下,到了段首,找eax的条件,进了一个call,到了下面的地址。

00403535   .  8B0D 64770801 mov     ecx, dword ptr [1087764]

到了这个地址,寄存器里出了数字:2637142136。

EAX 017075C8 ASCII "2637142136"
ECX 0012F768
EDX 00000000
EBX 00000001
ESP 0012F75C
EBP 0012F780
ESI 019C89E8
EDI 019C89E8
EIP 00403535 Muse.00403535


这就是真的注册码与假的进行的比较。在解释窗口里出现了假的注册码。也就是
00403530   .  A1 60770801   mov     eax, dword ptr [1087760]

这个地址是放入了真的注册码。

写一个内存注册机就是了,只是需要页面视图点打印,才能出现注册码,而不是一打开就出现注册码,继续做的完美点儿。



实际上,真正的内容全在这里。

0040351D   .  50            push    eax
0040351E   .  64:8925 00000>mov     dword ptr fs:[0], esp
00403525   .  83EC 08       sub     esp, 8
00403528   .  56            push    esi
00403529   .  8BF1          mov     esi, ecx
0040352B   .  E8 5D310D00   call    004D668D
00403530   .  A1 60770801   mov     eax, dword ptr [1087760]
00403535   .  8B0D 64770801 mov     ecx, dword ptr [1087764]        //将1087764改成1087760 实现爆破  ,这里只爆破了打印问题,而没有从根本上解决预览问题。
0040353B   .  50            push    eax
0040353C   .  51            push    ecx
0040353D   .  E8 A9440A00   call    004A79EB
00403542   .  83C4 08       add     esp, 8
00403545   .  85C0          test    eax, eax
00403547      74 78         je      short 004035C1


因为没有解决页面视图的问题,所以这里不是关键点。搜注册表。


发现,这是一个注册表保存注册信息的程序。

可以下注册表断点: bp RegOpenKeyExA  

断下后,返回单步走。注意在返回的地方下好断。

注册,拦下后,F8单步,反复跟了几遍,到了下面的这个地址,

004D6D8A    E8 F533FDFF     call Muse.004AA184

堆栈里出现了

0012FDAC   00509060  ASCII "REGSECTION"
0012FDB0   0050906C  ASCII "REGCODE"



有注册码的地方就快了,下好断,第二次运行,


shift+F9,Alt+F9返回,走到"REGSECTION"的地方单步走。


到了下面的地址,注册码出现在堆栈里。

004530B4    50              push eax


堆栈内容:
0012FDB8   0108A1C0  Muse.0108A1C0
0012FDBC   0108A1C0  Muse.0108A1C0
0012FDC0   FFFFFFFF
0012FDC4   01707758  ASCII "2637142136"
0012FDC8   5ADC1B25  uxtheme.5ADC1B25
0012FDCC   5ADF1C78  uxtheme.5ADF1C78

是不是可以做注册机了。

出现在寄存器里最好。继续追试一下。有一个key.def的文件,不过没有结果。

向上找一下进了这个call。
004530AC    E8 9F8B0100     call Muse.0046BC50


下面是算注册码的地方,在堆栈里逐渐出现的注册码,这段应该仔细分析算法,发现蛛丝马迹。

0046BD47    8A17            mov dl,byte ptr ds:[edi]
0046BD49    8D4C24 10       lea ecx,dword ptr ss:[esp+10]
0046BD4D    80C2 30         add dl,30
0046BD50    52              push edx
0046BD51    E8 6D3A0500     call Muse.004BF7C3
0046BD56    83C7 04         add edi,4
0046BD59    4E              dec esi
0046BD5A  ^ 75 EB           jnz short Muse.0046BD47






重跟了几次下了几次断,下面注释里出现了REGSECTION,应该仔细跟了。下好断,分别跟。

00452F66    6A 00           push 0
00452F68    68 109B5000     push Muse.00509B10                               ; ASCII "EXITCODE"
00452F6D    68 60905000     push Muse.00509060                               ; ASCII "REGSECTION"


00452F88    53              push ebx
00452F89    68 109B5000     push Muse.00509B10                               ; ASCII "EXITCODE"
00452F8E    68 60905000     push Muse.00509060                               ; ASCII "REGSECTION"   

0045305B    6A 00           push 0
0045305D    68 6C905000     push Muse.0050906C                               ; ASCII "REGCODE"     //这应该是关键地方。
00453062    8D4C24 14       lea ecx,dword ptr ss:[esp+14]
00453066    68 60905000     push Muse.00509060                               ; ASCII "REGSECTION"     //上面有几个call跟进去看,没有什么。
0045306B    51              push ecx

继续追,下面这个地址,堆栈里又出现注册码。
004530B4    50              push eax
004530B5    B9 60770801     mov ecx,Muse.01087760
004530BA    C68424 5C010000>mov byte ptr ss:[esp+15C],3
004530C2    E8 32C40600     call Muse.004BF4F9


堆栈

0012FDB4   0012FDC4
0012FDB8   0108A1C0  Muse.0108A1C0
0012FDBC   0108A1C0  Muse.0108A1C0
0012FDC0   FFFFFFFF
0012FDC4   01707758  ASCII "2637142136"
0012FDC8   5ADC1B25  uxtheme.5ADC1B25
0012FDCC   5ADF1C78  uxtheme.5ADF1C78

与前面的相同了。继续,有Call就F7进去看一下。
004530C2    E8 32C40600     call Muse.004BF4F9

这个call进去,F8单步走,
这个地址,
004BF503    8B07            mov eax,dword ptr ds:[edi]   //这个地址实际上,打开软件后被调用了很多次,第次内容都不用,只有顺着上面走下来,才会下列内容,所以破解要有耐心。

寄存器出现,出现了一组数,可能是机器码。

EAX 0012FDC4
ECX 01707668 ASCII "51982612"
继续F8单步,那么

004BF501    8B0E            mov ecx,dword ptr ds:[esi]    //ds:[01087760]=01707668, (ASCII "51982612")       ecx=01087760 (Muse.01087760)
004BF503    8B07            mov eax,dword ptr ds:[edi]    //堆栈 ds:[0012FDC4]=01707758, (ASCII "2637142136")   eax=0012FDC4
004BF505    3BC8            cmp ecx,eax
这就是机器码与注册码比较的地方了。寄存器里就是

EAX 01707758 ASCII "2637142136"
ECX 01707668 ASCII "51982612"
EDX 0012FD14
EBX 00000001
ESP 0012FDA8
EBP 0012FFC0
ESI 01087760 Muse.01087760
EDI 0012FDC4
EIP 004BF505 Muse.004BF505

注册码出现在寄存器里,可以做注册机了。要个好地方写注册机吧,继续单步走,找到这个有call的地方,就比较好了

004BF52F    E8 C3FDFFFF     call Muse.004BF2F7,这在这里拉。做内存注册机吧。

寄存器内容:
EAX 01707758 ASCII "2637142136"
ECX 01087760 Muse.01087760
EDX 0012FD14
EBX 00000001
ESP 0012FDA8
EBP 0012FFC0

不过不行啊。中断1次不行啊。可能注册机运用的不熟练。

还是到算注册码的地方另来吧。


0046BD41   /7E 19           jle short Muse.0046BD5C      //这也是一个爆破的地方了,改成jmp也不行。
0046BD43   |8D7C24 1C       lea edi,dword ptr ss:[esp+1C]


0046BD47   |8A17            mov dl,byte ptr ds:[edi]
0046BD49   |8D4C24 10       lea ecx,dword ptr ss:[esp+10]
0046BD4D   |80C2 30         add dl,30
0046BD50   |52              push edx
0046BD51   |E8 6D3A0500     call Muse.004BF7C3
0046BD56   |83C7 04         add edi,4
0046BD59   |4E              dec esi
0046BD5A  ^|75 EB           jnz short Muse.0046BD47
0046BD5C   \B8 67666666     mov eax,66666667




在下面的这个Call F7进去
0046BD51    E8 6D3A0500     call Muse.004BF7C3 

在下面的这个Call F7进去,也不行。


在下面这个地址注册码在堆栈里调齐。那么下面的这个call一定是一个关键call跟进去。

0046BD7F    E8 3F3A0500     call Muse.004BF7C3

在下面这个地址注册码在寄存器里齐了。
004BF77E   /EB 16           jmp short Muse.004BF796   //这一个下断,被调用过很多次的

寄存器内容
EAX 01707758 ASCII "2637142136"
ECX 0000000A
EDX 00000003
EBX 0170774C
ESP 0012FCE0
EBP 00000007
ESI 0012FD14
EDI 00000001
EIP 004BF77E Muse.004BF77E

做注册机吧

第一次中断在0046BD7F

第二次中断在004BF77E


成功



比较困难不往下追了。