破解GIF Movie Gear 3.01 (8千字)

看雪資料發表於2002-03-13

破解GIF Movie Gear 3.01:
為了找一個漢化的對像,我找到了它,根據介紹,這個軟體功能強大,我不會玩GIF動畫,但在漢化過程中它給我的感覺倒是很好的,小巧的身材,強大的功能...我喜歡這樣的軟體.在漢化中我順便想把它註冊了,於是今晚就請出了SICE把它給破了,呵呵...(也久沒有CRACK了,為了搞安裝程式的製作...哪天我要寫一個關於搞安裝程式的製作的教程,我在網上找了好久都發現有...)
好了,言歸正傳.開啟註冊視窗填入:
NAME:Vitamin C
CODE:1234abcd1234abcd
(不知從哪天起喜歡用長的NUM.了...)
在SICE裡用:BPX HMEMCPY.其實這個斷點是最好用的,以前我不太懂CRACK時很怕用它,現在次次都用.(因為用GETWINDOWTEXTA等有時會攔不到...)...
按'OK'中斷按F12後你會發現原來它是用GetWindowTextA的,按多幾次F12(我記不清是幾次了,好像不是很多次^_^)後到達我們的目的地:
...
* Reference To: USER32.GetWindowTextA, Ord:015Eh
                                  |
:00431959 8B1DF8834400            mov ebx, dword ptr [004483F8]/*它是把要CALL的偏移放入EBX
:0043195F 50                      push eax                      再呼叫的*/
:00431960 FFD3                    call ebx    /*這個CALL取NAME*/
:00431962 8D9424C4000000          lea edx, dword ptr [esp+000000C4]<-我們要在這裡停

* Possible Reference to Dialog: DialogID_0064
                                  |
:00431969 6A64                    push 00000064
:0043196B 52                      push edx

* Possible Reference to Dialog: DialogID_0091, CONTROL_ID:0450, ""
                                  |
:0043196C 6850040000              push 00000450
:00431971 56                      push esi
:00431972 FFD7                    call edi
:00431974 50                      push eax
:00431975 FFD3                    call ebx  /*這個CALL取CODE,和上面的CALL呼叫同一個偏移*/
:00431977 8D8424C4000000          lea eax, dword ptr [esp+000000C4]
:0043197E 8D4C2460                lea ecx, dword ptr [esp+60]
:00431982 50                      push eax  /*這裡是的兩個暫存器裡有一個是你輸入的CODE有一個
:00431983 51                      push ecx    是mvg21951736,呵呵不用我說了吧,可是它可不是*/
:00431984 E8F7FBFFFF              call 00431580/*這個是關鍵的CALL,這裡是一個經典的組合,CALL
:00431989 83C408                  add esp, 00000008了之後來一個TEST EAX,EAX,呵呵...^_^*/
:0043198C 85C0                    test eax, eax
:0043198E 0F84AD000000            je 00431A41
:00431994 8D542410                lea edx, dword ptr [esp+10]
...
試一試用F10跳過關鍵CALL,EAX就為00H,(那個CODE是亂來的嗎!)然後就完了...
那麼就是要跟進那個CALL:
...
* Referenced by a CALL at Addresses:
|:004316C9  , :00431984 
|
:00431580 53                      push ebx
:00431581 55                      push ebp/*EBP是你輸入的CODE的地址*/
:00431582 8B6C2410                mov ebp, dword ptr [esp+10]
:00431586 56                      push esi
:00431587 57                      push edi
:00431588 807D006D                cmp byte ptr [ebp+00], 6D/*CODE和第一個字元是:m*/
:0043158C 0F85A0000000            jne 00431632/*跳了就OVER,下面幾個一樣的,知道是怎麼回事了吧?*/
:00431592 807D0167                cmp byte ptr [ebp+01], 67/*第二個:g*/
:00431596 0F8596000000            jne 00431632
:0043159C 807D0233                cmp byte ptr [ebp+02], 33/*第三個:3*/
:004315A0 0F858C000000            jne 00431632
:004315A6 807D0337                cmp byte ptr [ebp+03], 37/*第四個:7*/
:004315AA 0F8582000000            jne 00431632

* Possible Indirect StringData Ref from Data Obj ->"mvg21951736"<-這個字串不知有什麼用?
                                  |
:004315B0 BBC4D44400              mov ebx, 0044D4C4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004315D6(C)
|
:004315B5 8B13                    mov edx, dword ptr [ebx]
:004315B7 83C9FF                  or ecx, FFFFFFFF
:004315BA 8BFA                    mov edi, edx
:004315BC 33C0                    xor eax, eax
:004315BE F2                      repnz
:004315BF AE                      scasb
:004315C0 F7D1                    not ecx
:004315C2 49                      dec ecx
:004315C3 8BFA                    mov edi, edx
:004315C5 8BF5                    mov esi, ebp
:004315C7 33C0                    xor eax, eax
:004315C9 F3                      repz
:004315CA A6                      cmpsb
:004315CB 7465                    je 00431632
:004315CD 83C304                  add ebx, 00000004
:004315D0 81FBC8D44400            cmp ebx, 0044D4C8
:004315D6 7CDD                    jl 004315B5
:004315D8 807D0473                cmp byte ptr [ebp+04], 73/*第五個字元:s(不是必須的,另有用處)*/
:004315DC 7501                    jne 004315DF
:004315DE 45                      inc ebp

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004315DC(C)
|
:004315DF 83C507                  add ebp, 00000007  /*取CODE第7位後的字元!CODE要>7位啊!*/
:004315E2 55                      push ebp
:004315E3 E8D0DD0000              call 0043F3B8/*這個CALL其實作用是這樣的:把CODE第8位起的字元
:004315E8 8B542418                mov edx, dword ptr [esp+18] '1234'->1234D*/
:004315EC 83C404                  add esp, 00000004
:004315EF 8BFA                    mov edi, edx
:004315F1 33C9                    xor ecx, ecx
:004315F3 8A12                    mov dl, byte ptr [edx]/*這裡開始是用NAME計算CODE了*/
:004315F5 BEDF0B0000              mov esi, 00000BDF
:004315FA 84D2                    test dl, dl
:004315FC 7426                    je 00431624

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431622(C)
|
:004315FE 0FBED2                  movsx edx, dl
:00431601 41                      inc ecx
:00431602 0FAFD1                  imul edx, ecx
:00431605 03F2                    add esi, edx
:00431607 81FEBE170000            cmp esi, 000017BE
:0043160D 7E06                    jle 00431615
:0043160F 81EEBE170000            sub esi, 000017BE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043160D(C)
|
:00431615 83F90A                  cmp ecx, 0000000A/*到了名字的第10個字元則要跳出去了!*/
:00431618 7E02                    jle 0043161C
:0043161A 33C9                    xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431618(C)
|
:0043161C 8A5701                  mov dl, byte ptr [edi+01]
:0043161F 47                      inc edi
:00431620 84D2                    test dl, dl
:00431622 75DA                    jne 004315FE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004315FC(C)
|
:00431624 3BF0                    cmp esi, eax/*將用NAME計算得到的CODE和CODE第8位起的字元->數字進
:00431626 750A                    jne 00431632  行比較!*/
:00431628 5F                      pop edi
:00431629 5E                      pop esi
:0043162A 5D                      pop ebp
:0043162B B801000000              mov eax, 00000001/*EAX置01H*/
:00431630 5B                      pop ebx
:00431631 C3                      ret



* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0043158C(C), :00431596(C), :004315A0(C), :004315AA(C), :004315CB(C)
|:00431626(C)
|
:00431632 5F                      pop edi
:00431633 5E                      pop esi
:00431634 5D                      pop ebp
:00431635 33C0                    xor eax, eax/*聽笨冬瓜兄說,這是我們的大敵!(EAX=00H)*/
:00431637 5B                      pop ebx
:00431638 C3                      ret
...
知道了CODE前4位是:mg37,那就讓它OVER我們把CODE改一改:mg37abc1234,好了,順利到了:004315E3這個CALL,這個CALL其實作用是這樣的:把CODE第8位起的字元(就是:'1234')變成十進位制的數字(就是:1234D)!我跟進了那個CALL但沒能找出不所以然來,還有一點,變是第8位起的字元不能是字母,要不會成為一個負數的!我一開始就是這樣,所以我走了彎路...
好了,之後就是用NAME計算了,得到一個數字和CODE第8位起的字元(就是:'1234')變成十進位制的數字(就是:1234D)進行比較,相等就OK!,我的NAME(Vitamin C)得到的是031DH=797D,那我的正確的CODE是:mg37xxx797(xxx可以為任何字元!)其實還有一個CODE,就是第5位是s的:mg37sxxx797(xxx可以為任何字元!),這個CODE是站點CODE(SITE LICENSE)那個是個人CODE(GIF Movie Gear這個軟體說的)這就是那個非必須比較的作用!
好了,到了這裡,也就完成了.其實那個計算NAME的演算法可以看出來的,不難,要你有能力,可以寫一個序號產生器!
演算法:
Vitamin C
取每個字元的16進位制數*它所在的位(第一位*1,第二位*2...)相加再加上0BDFH,要是>17BEH時就減去一個17BEH直到<17BEH(6078D)就行了,那個得到的數的10進位制數就是這個NAME的CODE.對了,還有一點,就是計算名字最多計算到第10個字元!其它的就不用算了!


OK!


NAME:Vitamin C
CODE:mg37xxx797/mg37sxxx797 (xxx可以為任何字元!)


Vitamin C[抗壞血酸].2002.2.18.HY.GD.CHI.

相關文章