轉載一篇破解教程(vrv2000) 作者:飛刀浪子 (14千字)

看雪資料發表於2001-03-29

嗨,大家好,我是飛刀浪子。“什麼飛刀浪子,聽都沒聽說過。”我~!@#$#$#$#$$%&^&**&^$倒,(一個小時後)從桌下爬起。
好,聽好了,我乃中原人士,今年該21了,進的時男衛生間。好,廢話少說,切入正題!今天我講的是VRV2000 9.E(2000.11.22)版破解全攻略.
作案工具:TR  ,HIEW  先用TR 載VRV2000    BPINT 13 AH=2      .      .
2779:30F7  80E1C0          AND      CL,C0
2779:30FA  024E0E          ADD      CL,[BP+000E]                         
2779:30FD  8A6E0C          MOV      CH,[BP+000C]                         
2779:3100  8A760A          MOV      DH,[BP+000A]                         
2779:3103  8A5608          MOV      DL,[BP+0008]                         
2779:3106  CD13            INT      13            ;在此處攔下 CX=5011,DX=0100                       
2779:3108  807E0608        CMP      [BYTE BP+0006],08                   
2779:310C  750A            JNE      3118                                 
2779:310E  C45E12          LES      BX,[BP+0012]                         
2779:3111  26890F          MOV      [ES:BX],CX                           
2779:3114  26895702        MOV      [ES:BX+0002],DX                     
2779:3118  8AC4            MOV      AL,AH    ;!注                           
2779:311A  B400            MOV      AH,00    ;!意                         
2779:311C  5D              POP      BP                                   
2779:311D  CB              RETF      ;返回
3616:1612  6A02            PUSH      02                                   
3616:1614  9AE4307927      CALL FAR  2779:30E4  ;讀盤過程,讀1面50H道11H扇區                         
3616:1619  83C410          ADD      SP,10        ;返回到此
3616:161C  0BC0            OR        AX,AX        ;必須為0,因它為額外的正常扇區                       
3616:161E  7520            JNE      1640                                 
3616:1620  1E              PUSH      DS                                   
3616:1621  6818B8          PUSH      B818                                 
3616:1624  6A01            PUSH      01                                   
3616:1626  6A12            PUSH      12                                   
3616:1628  6A50            PUSH      50                                   
3616:162A  6A01            PUSH      01                                   
3616:162C  6A00            PUSH      00                                   
3616:162E  6A02            PUSH      02                                   
3616:1630  9AE4307927      CALL FAR  2779:30E4    ;讀盤過程,讀1面50H道12H扇區                     
3616:1635  83C410          ADD      SP,10                               
3616:1638  0BC0            OR        AX,AX      ;此扇區為壞區或沒有,所以應該不為0 
3616:163A  7404            JE        1640                                 
3616:163C  B001            MOV      AL,01      ;此處將AL=1  就OK了                   
3616:163E  EB08            JMP      1648                                 
3616:1640  46              INC      SI                                   
3616:1641  83FE02          CMP      SI,02                               
3616:1644  7CBE            JL        1604                                 
3616:1646  B000            MOV      AL,00                               
3616:1648  5E              POP      SI                                   
3616:1649  CB              RETF                                                .
    .避開此兩處判斷點,就OK 了。不過,VRV會說記憶體不夠,這一次它說的是真的。好,我們搜尋程式碼,咦,找不到,看來被壓過了。
UNP 試試看,還是不行。那就手脫吧。  TR載入VRV2000  EXE1  RELOAD  BPREG  G  G
                      ;此時出現 MOV DX,XXXX
                      ;        MOV [CS:0291],DX
                      ;        MOV AH,30                      ;        INT 21
  WEXE1  EXE2  RELOAD  G                  ;直到剛才哪個地方  WEXE2  Q  MAKEXE
好了,當前目錄下就有了一個MEM.EXE的程式,找到剛才的判斷點改掉,就OK了。不行,不行,怎麼用了第一次就不能用第二次,原來它還回寫了自己。
再次TR 設BPINT 21 AH=3D  透過堆疊 STACK 看它是什麼地方 CALL 此處,有好幾個耶,一個一個 U 看看,
分析一下前後程式碼,可疑就把這個 CALL 幹掉試試看(最好是用JMP 飛過去,但注意平衡堆疊)。
(透過STACK 看堆疊有時是很有用的,早期的VRV 追到後面的INT 13 會當機,我就是透過堆疊來解的)
另外,若用PKLITE將解壓過後的程式壓一偏也可以不用改。下面我們講一下用DEBUG脫殼,雖然有些煩,但可以增加功力啦。DEBUG VRV2000.EXE-U
3D96:001C  FC              CLD                                           
3D96:001D  2E806C1310      SUB      [BYTE CS:SI+0013],10                 
3D96:0022  73E8            JAE      000C                                 
3D96:0024  6619ED          SBB      EBP,EBP                             
3D96:0027  AF              SCASW                                         
3D96:0028  AD              LODSW                                         
3D96:0029  0E              PUSH      CS                                   
3D96:002A  0E              PUSH      CS                                   
3D96:002B  0E              PUSH      CS                                   
3D96:002C  06              PUSH      ES                                   
3D96:002D  1F              POP      DS                                   
3D96:002E  07              POP      ES                                   
3D96:002F  16              PUSH      SS                                   
3D96:0030  680500          PUSH      0005                                 
3D96:0033  6631DB          XOR      EBX,EBX                             
3D96:0036  CB              RETF-G36-T-P912E:0004  A4              MOVSB
912E:0005  E86D00          CALL      0075      ;解碼過程                                   
912E:0008  72FA            JB        0004      ;迴圈                         
912E:000A  6631C0          XOR      EAX,EAX                             
912E:000D  40              INC      AX                                   
912E:000E  E86400          CALL      0075                                 
912E:0011  6611C0          ADC      EAX,EAX                             
912E:0014  E85E00          CALL      0075                                 
912E:0017  73F5            JAE      000E                                 
912E:0019  6683E803        SUB      EAX,03                               
912E:001D  720D            JB        002C                                 
912E:001F  66C1E008        SHL      EAX,08                               
912E:0023  AC              LODSB                                         
912E:0024  6683F0FF        XOR      EAX,-01                             
912E:0028  7469            JE        0093                                 
912E:002A  6695            XCHG      EAX,EBP                             
912E:002C  E84100          CALL      0070                                 
912E:002F  11C9            ADC      CX,CX                               
912E:0031  7508            JNE      003B                                 
912E:0033  41              INC      CX                                   
912E:0034  E83900          CALL      0070                                 
912E:0037  73FB            JAE      0034                                 
912E:0039  41              INC      CX                                   
912E:003A  41              INC      CX                                   
912E:003B  6681FD00F3FFFF  CMP      EBP,FFFFF300                         
912E:0042  81D10100        ADC      CX,0001                             
912E:0046  89FA            MOV      DX,DI                               
912E:0048  8CC0            MOV      AX,ES                               
912E:004A  C1EA04          SHR      DX,04                               
912E:004D  83E70F          AND      DI,0F                               
912E:0050  01D0            ADD      AX,DX                               
912E:0052  1E              PUSH      DS                                   
912E:0053  8EC0            MOV      ES,AX                               
912E:0055  56              PUSH      SI                                   
912E:0056  66C1E004        SHL      EAX,04                               
912E:005A  01F8            ADD      AX,DI                               
912E:005C  6601E8          ADD      EAX,EBP                             
912E:005F  89C6            MOV      SI,AX                               
912E:0061  66C1E804        SHR      EAX,04                               
912E:0065  83E60F          AND      SI,0F                               
912E:0068  8ED8            MOV      DS,AX                               
912E:006A  F3              REPZ                                           
912E:006B  A4              MOVSB                                         
912E:006C  5E              POP      SI                                   
912E:006D  1F              POP      DS                                   
912E:006E  EB95            JMP      0005      ;繼續迴圈                         
912E:0070  E80200          CALL      0075                                 
912E:0073  11C9            ADC      CX,CX                               
912E:0075  6601DB          ADD      EBX,EBX                             
912E:0078  7518            JNE      0092                                 
912E:007A  B7B0            MOV      BH,B0                               
912E:007C  39DE            CMP      SI,BX                               
912E:007E  7609            JBE      0089                                 
912E:0080  29DE            SUB      SI,BX                               
912E:0082  8CDB            MOV      BX,DS                               
912E:0084  80C70B          ADD      BH,0B                               
912E:0087  8EDB            MOV      DS,BX                               
912E:0089  668B1C          MOV      EBX,[SI]                             
912E:008C  83EEFC          SUB      SI,-04                               
912E:008F  6611DB          ADC      EBX,EBX                             
912E:0092  C3              RET                                           
912E:0093  59              POP      CX                                   
912E:0094  8CC0            MOV      AX,ES      ;!!!!(ES-CX) SHL 4 + DI=檔案長  設為X                       
912E:0096  80EC04          SUB      AH,04                               
912E:0099  8ED8            MOV      DS,AX                               
912E:009B  2BBDFE3F        SUB      DI,[DI+3FFE]                         
912E:009F  8DB50040        LEA      SI,[DI+4000]                         
912E:00A3  5D              POP      BP        ;!!!BP值指向了程式的起始段                             
912E:00A4  31DB            XOR      BX,BX                               
912E:00A6  8EC1            MOV      ES,CX                               
912E:00A8  AC              LODSB              ; !!!重定位開始                       
912E:00A9  25FF00          AND      AX,00FF                             
912E:00AC  7405            JE        00B3                                 
912E:00AE  3CEF            CMP      AL,EF                               
912E:00B0  7710            JA        00C2     
912E:00B2  A8AD            TEST      AL,AD                               
912E:00B4  01C3            ADD      BX,AX                               
912E:00B6  7305            JAE      00BD                                 
912E:00B8  80C510          ADD      CH,10                         
912E:00BB  8EC1            MOV      ES,CX        ;!!!                       
912E:00BD  26012F          ADD      [ES:BX],BP  ;!!重定位                       
912E:00C0  EBE6            JMP      00A8                                 
912E:00C2  88C4            MOV      AH,AL                               
912E:00C4  AC              LODSB                                         
912E:00C5  25FF0F          AND      AX,0FFF                             
912E:00C8  75EA            JNE      00B4                                 
912E:00CA  AD              LODSW                                         
912E:00CB  01C1            ADD      CX,AX                               
912E:00CD  73D5            JAE      00A4                               
912E:00CF  07              POP      ES                                   
912E:00D0  AD              LODSW              ;取原SP ,記下AX等一下會用到。                     
912E:00D1  012C            ADD      [SI],BP    ;定位SS,記下SI的值                     
912E:00D3  8E14            MOV      SS,[SI]                             
912E:00D5  94              XCHG      AX,SP                               
912E:00D6  06              PUSH      ES                                   
912E:00D7  1F              POP      DS                                   
912E:00D8  EA0000963D      JMP FAR  3D96:0000  ;解碼完畢,進入程式-gd8-t-nvrv.dat-RBX
X  的高位  ---->X 看前面RCXX  的低位WCS:0  ;回寫程式的執行程式碼Q;下面寫重定位資料DEBUG VRV2000.EXE-G36-T
-GA8-R DI  ;將DI指向一個不影響我們工作的任意地址500-FES:500 L 1000 FF          ;為了方便找最後一個重定位
      ;將BB處的兩位元組NOP掉,將BD處的三位元組改為CALL 200  然後在200處寫我們的指令。-A200 MOV AX,BX STOSW
MOV AX,CX SUB AX,BP        ;BP值指向了程式的起始段 STOSW RET-G D8
      ;搜尋ES:500後什麼地方出現連續的FF,找到的第一個FF的地址-500    假設結果為 Y
      ;將 Y/4 的結果記下,等一下要用。-NRELOCAL.DAT-RCXY      ;若Y不是16的整倍數,將它補為16的整倍數。-RBX0
-WES:500      ;寫RELOCAL.DAT-N HEADER.DAT-FDS:100 L 20 0-RCX -20
-WDS:100      ;寫HEADER.DAT-QCOPY /B HEADER.DAT+RELOCAL.DAT+VRV.DAT  VRV.EXE
此時,我們已經得到了一個程式,但他還不能執行,下面修補檔頭,用HIEW開啟
4D 5A XX XX XX XX XX XX XX XX 00 00 FF FF XX XX XX XX
      ----  ----  ----  ----              ----  ----
        |_____|_____|_____|_________________|_____|___________VRV.EXE 的長度除以200H的餘數
              |_____|_____|_________________|_____|___________商,若餘數不為0,還應再加1
                    |_____|_________________|_____|___________剛才Y/4的結果
                          |_________________|_____|___________(HEADER.DAT+RELOCAL.DAT)長度/10H
                                            |_____|___________剛才記的SS值
                                                  |___________剛才記的SP值
00 00 XX XX 00 00 20 00 00 00 00 00 00 00      -----
        |________HEADER.DAT+RELOCAL.DAT  的長度注:上面都是十六進位制,且是字方式,所以請注意儲存的反向問題。
好了,大功告成,親個嘴兒。注:若我們將任意盤格式化一個正常的1面50H道11H扇區,就可以做它的加密盤。
    若有原版加密盤,可將其所讀資料寫入我們自做的加密盤中,這樣更好。    不過,我解的加密盤都沒有原盤,所以只有這樣啦。
                                                            飛刀浪子  留

相關文章