Guitar Pro v3.0 的破文-----這一回真的破了 (12千字)

看雪資料發表於2001-09-14

下載:http://211.152.134.220/guitarpp/yu/GuitarPro300.zip 

  用 dede 找出“確定”按鈕的地址 004CEC8C 用 trw2k 下斷,
  輸入註冊資訊,使用者名稱:LANCELOT[CCG]  註冊碼:12345-67890-434343
  按確定到這裡

=================================================================================================

004CEC8C  55                    push    ebp

            ...... 略 ......

* Reference to control TFLicence.Cle1 : TEdit
|
004CECC5  8B83E4020000          mov    eax, [ebx+$02E4]

* Reference to: controls.TControl.GetText(TControl):System.String;<-------讀取註冊碼的第1段
|                                                                        12345
004CECCB  E81C74F6FF            call    004360EC
004CECD0  FF75F8                push    dword ptr [ebp-$08]
004CECD3  8D55F4                lea    edx, [ebp-$0C]

* Reference to control TFLicence.Cle2 : TEdit
|
004CECD6  8B83EC020000          mov    eax, [ebx+$02EC]

* Reference to: controls.TControl.GetText(TControl):System.String;<-------讀取註冊碼的第2段
|                                                                        67890
004CECDC  E80B74F6FF            call    004360EC
004CECE1  FF75F4                push    dword ptr [ebp-$0C]
004CECE4  8D55F0                lea    edx, [ebp-$10]

* Reference to control TFLicence.Cle3 : TEdit
|
004CECE7  8B83F4020000          mov    eax, [ebx+$02F4]

* Reference to: controls.TControl.GetText(TControl):System.String;<-------讀取註冊碼的第3段
|                                                                        43434
004CECED  E8FA73F6FF            call    004360EC
004CECF2  FF75F0                push    dword ptr [ebp-$10]
004CECF5  8D45FC                lea    eax, [ebp-$04]
004CECF8  BA03000000            mov    edx, $00000003

* Reference to: system.@LStrCatN;<----------------------------------------連線在一起
|                                                                        123456789043434
004CECFD  E8DA52F3FF            call    00403FDC
004CED02  8B45FC                mov    eax, [ebp-$04]
004CED05  50                    push    eax
004CED06  8D55F8                lea    edx, [ebp-$08]

* Reference to control TFLicence.Nom : TLabel
|
004CED09  8B83CC020000          mov    eax, [ebx+$02CC]

* Reference to: controls.TControl.GetText(TControl):System.String;<--------讀取使用者名稱
|
004CED0F  E8D873F6FF            call    004360EC
004CED14  8B45F8                mov    eax, [ebp-$08]
004CED17  B92C010000            mov    ecx, $0000012C
004CED1C  5A                    pop    edx

|
004CED1D  E8EECC0800            call    0055BA10<-------------------------核心計算,跟進去
004CED22  84C0                  test    al, al
004CED24  0F8460010000          jz      004CEE8A

===============================================================================================

0055BA10  55                    push    ebp

            ...... 略 ......

* Reference to: system.@LStrLen:Integer;
|          or: system.@DynArrayLength;
|          or: system.DynArraySize(Pointer):Integer;
|
0055BA69  E8AE84EAFF            call    00403F1C
0055BA6E  8BF0                  mov    esi, eax
0055BA70  85F6                  test    esi, esi
0055BA72  7E21                  jle    0055BA95
0055BA74  B901000000            mov    ecx, $00000001
0055BA79  8B45FC                mov    eax, [ebp-$04]
0055BA7C  0FB64408FF            movzx  eax, byte ptr [eax+ecx-$01]<-------使用者名稱的第一個字 L==0x4c
0055BA81  F7E9                  imul    ecx<-------------------------------乘上序號
0055BA83  03F8                  add    edi, eax<--------------------------和加上edi中的值
0055BA85  8BC7                  mov    eax, edi
0055BA87  BFE8030000            mov    edi, $000003E8
0055BA8C  99                    cdq
0055BA8D  F7FF                  idiv    edi<-------------------------------和除去 0x3e8
0055BA8F  8BFA                  mov    edi, edx<--------------------------餘數放到edi
0055BA91  41                    inc    ecx
0055BA92  4E                    dec    esi
0055BA93  75E4                  jnz    0055BA79<--------------------------迴圈計算,使用者名稱的13個字母
0055BA95  85FF                  test    edi, edi
0055BA97  7505                  jnz    0055BA9E
0055BA99  BF01000000            mov    edi, $00000001
0055BA9E  8B45F4                mov    eax, [ebp-$0C]<---------------------0x12c
0055BAA1  2DDC000000            sub    eax, $000000DC<---------------------0x12c-0xdc==0x50
0055BAA6  03C7                  add    eax, edi<---------------------------0x50+0x15==0x65
0055BAA8  40                    inc    eax<--------------------------------0x65+0x1==0x66
0055BAA9  B9E8030000            mov    ecx, $000003E8
0055BAAE  99                    cdq
0055BAAF  F7F9                  idiv    ecx
0055BAB1  8BFA                  mov    edi, edx<-------------------------- 0x66
0055BAB3  8D45F0                lea    eax, [ebp-$10]
0055BAB6  8B55F8                mov    edx, [ebp-$08]
0055BAB9  8A520A                mov    dl, byte ptr [edx+$0A]<--------------註冊碼的第11位

* Reference to: system.@LStrFromChar(String;Char);
|          or: system.@LStrFromWChar(String;WideChar);
|          or: system.@WStrFromChar(WideString;Char);
|          or: system.@WStrFromWChar(WideString;WideChar);
|
0055BABC  E88383EAFF            call    00403E44
0055BAC1  8B45F0                mov    eax, [ebp-$10]
0055BAC4  50                    push    eax
0055BAC5  8D45EC                lea    eax, [ebp-$14]
0055BAC8  8B55F8                mov    edx, [ebp-$08]
0055BACB  8A12                  mov    dl, byte ptr [edx]<--------------註冊碼的第1位

* Reference to: system.@LStrFromChar(String;Char);
|          or: system.@LStrFromWChar(String;WideChar);
|          or: system.@WStrFromChar(WideString;Char);
|          or: system.@WStrFromWChar(WideString;WideChar);
|
0055BACD  E87283EAFF            call    00403E44
0055BAD2  8B45EC                mov    eax, [ebp-$14]

* Reference to: sysutils.StrToInt(System.AnsiString):System.Integer;
|
0055BAD5  E8CAD4EAFF            call    00408FA4
0055BADA  8BF0                  mov    esi, eax
0055BADC  8D45EC                lea    eax, [ebp-$14]
0055BADF  8B55F8                mov    edx, [ebp-$08]
0055BAE2  8A5201                mov    dl, byte ptr [edx+$01]<--------------註冊碼的第2位

* Reference to: system.@LStrFromChar(String;Char);
|          or: system.@LStrFromWChar(String;WideChar);
|          or: system.@WStrFromChar(WideString;Char);
|          or: system.@WStrFromWChar(WideString;WideChar);
|
0055BAE5  E85A83EAFF            call    00403E44
0055BAEA  8B45EC                mov    eax, [ebp-$14]

* Reference to: sysutils.StrToInt(System.AnsiString):System.Integer;
|
0055BAED  E8B2D4EAFF            call    00408FA4
0055BAF2  03F0                  add    esi, eax<--------------註冊碼的第1,2位之和
0055BAF4  8BC6                  mov    eax, esi
0055BAF6  F7EF                  imul    edi<-------------------乘上0x66
0055BAF8  B90A000000            mov    ecx, $0000000A<--------除與 0xa
0055BAFD  99                    cdq
0055BAFE  F7F9                  idiv    ecx
0055BB00  8BC2                  mov    eax, edx<-------------餘數放在eax
0055BB02  8D55EC                lea    edx, [ebp-$14]

* Reference to: sysutils.IntToStr(System.Integer):System.AnsiString;overload;
|
0055BB05  E836D4EAFF            call    00408F40
0055BB0A  8B55EC                mov    edx, [ebp-$14]
0055BB0D  58                    pop    eax

* Reference to: system.@LStrCmp;<-------------------------------餘數在與註冊碼的第10位比較
|
0055BB0E  E81985EAFF            call    0040402C
0055BB13  0F8596010000          jnz    0055BCAF<-------------不相等就完蛋了下面迴圈計算略


=================================================================================================

總結一下:

1) 使用者名稱:LANCELOT[CCG]==>0x4c,0x41,0x4e,0x43,0x45,0x4c,0x4f,0x54,0x5b,0x43,0x43,0x47,0x5d
2) (0x4c*0x1+0x0  ) % 0x3e8==0x4c
  (0x41*0x2+0x4c ) % 0x3e8==0xce
  (0x4e*0x3+0xce ) % 0x3e8==0x1b8
  (0x43*0x4+0x1b8) % 0x3e8==0x2c4
  (0x45*0x5+0x2c4) % 0x3e8==0x35
  (0x4c*0x6+0x35 ) % 0x3e8==0x1fd
  (0x4f*0x7+0x1fd) % 0x3e8==0x3e
  (0x54*0x8+0x3e ) % 0x3e8==0x2de
  (0x5b*0x9+0x2de) % 0x3e8==0x229
  (0x43*0xa+0x229) % 0x3e8==0xdf
  (0x43*0xb+0xdf ) % 0x3e8==0x3c0
  (0x47*0xc+0x3c0) % 0x3e8==0x32c
  (0x5d*0xd+0x32c) % 0x3e8==0x15<-------這個值如果為0,就用1代入
3) (0x12c-0xdc+0x15+0x1) % 0x3e8==0x66
4) 註冊碼:123456789043434
5) ((0x1+0x2)*0x66) % 0xa==0x6<----------註冊碼的第11位
  ((0x3+0x4)*0x66) % 0xa==0x4<----------註冊碼的第12位
  ((0x5+0x6)*0x66) % 0xa==0x2<----------註冊碼的第13位
  ((0x7+0x8)*0x66) % 0xa==0x0<----------註冊碼的第14位
  ((0x9+0x0)*0x66) % 0xa==0x8<----------註冊碼的第15位

所以:
 
  使用者名稱:LANCELOT[CCG]  註冊碼: 12345-67890-64208<--------完了嗎,還沒有
==========================================================================================
用這個註冊碼會有NAG,recently open file 無法顯示,主介面上有錯誤提示,也就是說這冊碼的前10位不是任意的。
估計程式將註冊碼的前10位,換算後當作給主介面和NAG視窗的Message......
修改了幾次註冊碼後得知:註冊碼的第10位如果為0,主介面上有錯誤提示,
不為0則主介面一閃就消失了,註冊碼第9位卻可以任意。
於是就輸入 使用者名稱: LANCELOT[CCG] 註冊碼:12345-67818-64208
這一次一進入主畫面,馬上就退出。
其後跟蹤多日無果......
今天突然想到,程式要退出,應該會呼叫 PostQuitMessage 的API,於是下中斷 bpx postquitmessage
用 W32Dasm + trw2k 不斷的找啊找啊,在 :00566549 mov eax,dword ptr [ebp-08] 的地方,
習慣性的下 d *(ebp-08),看到了什麼,“12345678”
==============================================================================================

:00566535 8BC6                    mov eax, esi<------------0x12c
:00566537 2DDC000000              sub eax, 000000DC<-------0x12c-0xdc==0x50
:0056653C 03C7                    add eax, edi<------------0x50+0x15==0x65
:0056653E 40                      inc eax<-----------------0x65+1==0x66   
:0056653F B9E8030000              mov ecx, 000003E8
:00566544 99                      cdq
:00566545 F7F9                    idiv ecx
:00566547 8BFA                    mov edi, edx<------------0x66
:00566549 8B45F8                  mov eax, dword ptr [ebp-08]<------12345678  似曾相識哦
:0056654C E8532AEAFF              call 00408FA4<--------------------轉換成16進位制
:00566551 8945B8                  mov dword ptr [ebp-48], eax<------0xbc614e
:00566554 DB45B8                  fild dword ptr [ebp-48]
:00566557 897DB4                  mov dword ptr [ebp-4C], edi<------0x66
:0056655A DB45B4                  fild dword ptr [ebp-4C]
:0056655D DEF9                    fdivp st(1), st(0)<---------------0xbc614e/0x66==0x1d8cc
:0056655F E8F8C5E9FF              call 00402B5C
:00566564 8BD8                    mov ebx, eax
:00566566 81FBA0860100            cmp ebx, 000186A0<----------------要大於或等於0x186a0
:0056656C 7C23                    jl 00566591
:0056656E 8B45F8                  mov eax, dword ptr [ebp-08]<------
:00566571 E82E2AEAFF              call 00408FA4                    |
:00566576 8945B8                  mov dword ptr [ebp-48], eax      |  這一段的意思是
:00566579 DB45B8                  fild dword ptr [ebp-48]          |  註冊碼的前8位
:0056657C 897DB4                  mov dword ptr [ebp-4C], edi      |  轉換成16進位制後的
:0056657F DB45B4                  fild dword ptr [ebp-4C]          |  數要能被0x66整除
:00566582 DEF9                    fdivp st(1), st(0)                |<--至於0x66重何而來
:00566584 895DB0                  mov dword ptr [ebp-50], ebx      |  請看上面的第一次總結
:00566587 DB45B0                  fild dword ptr [ebp-50]          |
:0056658A DED9                    fcompp                            |
:0056658C DFE0                    fstsw ax                          |
:0056658E 9E                      sahf                              |
:0056658F 740A                    je 0056659B<-----------------------
===============================================================================================
再總結一下:(這個人怎麼這麼喜歡總結)
假設:註冊碼的前8位轉換成16進位制後的值為 x 則 x/0x66 要能整除,其商要不小於 0x186a0
偷懶一下 0x186a0*0x66==0x9ba3c0==10200000

於是使用者名稱:LANCELOT[CCG]  註冊碼:102000001824008

搞定,好累啊,用了整整4個晚上,走了不少彎路。 


                                    Crack by lancelot[CCG][FCG] 2001.09.14

相關文章