• 标 题:MIDI软件COMPOSER2.0暴破
  • 作 者:chummer  
  • 时 间:2002/01/14 10:05pm
  • 链 接:http://bbs.pediy.com


这个软件是MID修改和编辑用的,不注册不能存盘,所以要破.用TRW2000,W32DSM,HIEW三种兵器.
点注册,在两个空行里填入自己的信箱和一组自编的密码,运行TRW2000,下断,最普通的HMEMCPY就可以了,GO之后,回到程序界面,点注册,被断,直接用BC *,PMODULE,再次来到程序领空,一下子就到了,不用按F12,按一下就出错了.程序代码如下:

:0040435B 6804010000              push 00000104
按F10走.
:00404360 68C1EB4100              push 0041EBC1

* Possible Reference to Dialog: DialogID_03E7, CONTROL_ID:03FC, ""
                                 |
:00404365 68FC030000              push 000003FC
:0040436A 53                      push ebx

* Reference To: USER32.GetDlgItemTextA, Ord:0000h
                                 |
:0040436B E8CA980100              Call 0041DC3A  
来到下面这个CALL.
:00404370 E8DBF6FFFF              call 00403A50  
注意这个CALL,下面有比较,有跳转,说明有问题.按F8进入:
* Possible StringData Ref from Data Obj ->"镱溧痤?
                                 |
:00403A55 B8CBF64100              mov eax, 0041F6CB
:00403A5A BAC1EB4100              mov edx, 0041EBC1  
这里下D 0041EBC1可以看到自己刚才输入的注册码,那么上面的0041F6CB里的乱七八糟的东西就可能是真正的注册码了.但是我看不出来是什么.还请高手指点.往下走是比比跳跳.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403A79(C)
|
:00403A5F 8A08                    mov cl, byte ptr [eax]
:00403A61 3A0A                    cmp cl, byte ptr [edx]
:00403A63 7516                    jne 00403A7B
程序在这里显示要跳,因为上面的比较肯定不相等.当然如果不跳就会注册成功的.所以在这里就可以下手了.不过改这里的话下面的JE也得改,不如让它走下去,直接跳到00403A7B处再改.
 {:00403A65 84C9                    test cl, cl
 :00403A67 743C                    je 00403AA5  (注意)
 :00403A69 8A4801                  mov cl, byte ptr [eax+01]
 :00403A6C 3A4A01                  cmp cl, byte ptr [edx+01]
 :00403A6F 750A                    jne 00403A7B
 :00403A71 83C002                  add eax, 00000002
 :00403A74 83C202                  add edx, 00000002
 :00403A77 84C9                    test cl, cl
 :00403A79 75E4                    jne 00403A5F}
以上是跳过的代码.下面来到了真正要改的地方:
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00403A63(C), :00403A6F(C)

:00403A7B 7428                    jne 00403AA5  (和上面的跳一样,只有在这里跳才能成功)
* Possible StringData Ref from Data Obj ->"镱溧痤?
                                 |
:00403A7D B8D3F64100              mov eax, 0041F6D3
:00403A82 BABCEA4100              mov edx, 0041EABC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403AA1(C)
|
:00403A87 8A08                    mov cl, byte ptr [eax]
:00403A89 3A0A                    cmp cl, byte ptr [edx]
:00403A8B 7524                    jne 00403AB1
:00403A8D 84C9                    test cl, cl
:00403A8F 7412                    je 00403AA3
:00403A91 8A4801                  mov cl, byte ptr [eax+01]
:00403A94 3A4A01                  cmp cl, byte ptr [edx+01]
:00403A97 7518                    jne 00403AB1
:00403A99 83C002                  add eax, 00000002
:00403A9C 83C202                  add edx, 00000002
:00403A9F 84C9                    test cl, cl
:00403AA1 75E4                    jne 00403A87

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403A8F(C)
|
:00403AA3 750C                    jne 00403AB1  
以上就是反复比比跳跳,总之不让你跳到正地方.那么究竟为什么非要跳到0403AA5这个地方呢?现在我们来看看这个地方有什么.

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
:00403A67(C), :00403A7B(C)
* Possible Reference to String Resource ID=00001: "AKoff Music Composer - Version 2.0"
                                 |
:00403AA5 C705C8EC410001000000    mov dword ptr [0041ECC8], 00000001
上面的代码现在把一个00000001放到了[0041ECC8]里.然后程序开始回去.
:00403AAF EB72                    jmp 00403B23
.
.
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00403AAF(U), :00403AE9(U), :00403B1A(U)
|
:00403B23 83C414                  add esp, 00000014
:00403B26 5F                      pop edi
:00403B27 5E                      pop esi
:00403B28 C3                      ret
回去了,回到呼叫子程序的地方.
:00404370 E8DBF6FFFF              call 00403A50 (刚才就是从这个CALL里出来的.)
:00404375 833DC8EC410000          cmp dword ptr [0041ECC8], 00000000
现在我们再来注意这上面的一行,刚才在子程序里,经过运算比较后,得到了一个[0041ECC8],现在又来比较这个[0041ECC8],刚才这个地址里是00000001,现在要拿00000000来和它比,然后下面一行说得很清楚,如果等于就跳走,走到哪儿呢?走到004043CE.
:0040437C 7450                    je 004043CE
这个004043CE是个什么东西呢?经过反汇编我们会看到,那是一个ERROR,紧接着就是那个出错对话框里的话
"Not valid Code or E-mail." 如下所示:

:004043CE 6A30                    push 00000030

* Possible StringData Ref from Data Obj ->"Error"
                                 |
:004043D0 6890F84100              push 0041F890

* Possible StringData Ref from Data Obj ->"Not valid Code or E-mail."
肯定是不能让他跳过来的啦!这里不跳就说明成功了,下面的代码一行行走向了" - Registered".
                                 

:004043D5 6876F84100              push 0041F876
:004043DA 53                      push ebx
:0040437E 33C0                    xor eax, eax
:00404380 83C9FF                  or ecx, FFFFFFFF
:00404383 BF81E14100              mov edi, 0041E181
:00404388 8DB5F0FEFFFF            lea esi, dword ptr [ebp+FFFFFEF0]
:0040438E F2                      repnz
:0040438F AE                      scasb
:00404390 F7D1                    not ecx
:00404392 2BF9                    sub edi, ecx
:00404394 8BD1                    mov edx, ecx
:00404396 87F7                    xchg edi, esi
:00404398 C1E902                  shr ecx, 02
:0040439B 8BC7                    mov eax, edi
:0040439D F3                      repz
:0040439E A5                      movsd
:0040439F 8BCA                    mov ecx, edx
:004043A1 8D85F0FEFFFF            lea eax, dword ptr [ebp+FFFFFEF0]
:004043A7 83E103                  and ecx, 00000003
:004043AA F3                      repz
:004043AB A4                      movsb

* Possible StringData Ref from Data Obj ->" - Registered"
下略.

也不知道你看懂了没有,反正我的思路比较业余一些,只是从那个出错的对话框,找到了那几个跳转,现在要改的是子程序里面的那个JNE,就是:00403A7B 7428 jne 00403AA5,因为改了它,判断密码正确与否的子程序就不起作用了,而是直接把这个版本认为是经过注册的正式版.好了,现在动手:
用HIEW把COMPOSER打开,F4切换,F5输入它的偏移地址0000307B,F3修改,把74改为75,F9存盘.退出,好了现在再启动COMPOSER,直接就是"Registered"了.把你的MID载入,可以任意修改各种音色,成为自己的MID,存盘.真爽!