拷貝心得第六集
             ┌─┐  ┌─┐  ┌─┐  ┌─┐  ┌∞
         └─┘  └─┘  └─┘  └─┘  └─┘
        ┌────────────────────┐
        │ 軟體蛀蟲站資料填寫 ,請勿修改其內容     │
        │  90 網之 2 ----> 597-1306   24Hr       │
        └────────────────────┘

Microsoft (R) Symbolic Debug Utility  Version 4.00
Copyright (C) Microsoft Corp 1984, 1985.  All rights reserved.
Processor is [80286] ,Files Name : S.EXE (RS2的遊戲保護)
-r

AX=0000  BX=0000  CX=9765  DX=0000  SP=0080  BP=0000  SI=0000  DI=0000
DS=1B5D  ES=1B5D  SS=333D  CS=24AF  IP=0012   NV UP EI PL NZ NA PO NC
24AF:0012 06             PUSH   ES

-u 12 70
24AF:0012 06             PUSH   ES  ─── 未來跳躍用,暫不用到
24AF:0013 0E             PUSH   CS  ┐ 斷落對齊
24AF:0014 1F             POP    DS  ┘
24AF:0015 8B0E0C00       MOV    CX,[000C]  ┐
24AF:0019 8BF1           MOV    SI,CX      │
24AF:001B 4E             DEC    SI         │一些沒營養的資料 ,待會
24AF:001C 89F7           MOV    DI,SI      │比對資料時的
24AF:001E 8CDB           MOV    BX,DS      │長度、位置 資料放入暫存器
24AF:0020 031E0A00       ADD    BX,[000A]  │
24AF:0024 8EC3           MOV    ES,BX      │請注意 BX=DS=CS
24AF:0026 B400           MOV    AH,00      │
24AF:0028 31ED           XOR    BP,BP      │
24AF:002A FD             STD               ┘
24AF:002B AC             LODSB             ┐ AX=DS:SI=0-525
24AF:002C 01C5           ADD    BP,AX      │ 將CS:0到CS:525的指令碼加起來
24AF:002E AA             STOSB             │ 放到 BP ,若有人單步執行則 BP
24AF:002F E2FA           LOOP   002B       ┘ 值就有誤 ,因但部執行會產生CC碼
24AF:0031 8B160E00       MOV    DX,[000E]  ─ 正常主程式碼相加後所得 1/2
24AF:0035 8AC2           MOV    AL,DL      ┐
24AF:0037 29C5           SUB    BP,AX      │ 等於 SUB BP,DX
24AF:0039 8AC6           MOV    AL,DH      │
24AF:003B 29C5           SUB    BP,AX      ┘
24AF:003D 39D5           CMP    BP,DX      ┐ 比對是否曾單步執行
24AF:003F 740C           JZ     004D       ┘ 未單步執行則跳越
24AF:0041 BA9101         MOV    DX,0191    ┐
24AF:0044 B409           MOV    AH,09      │ 印出 Crc Err 字樣
24AF:0046 CD21           INT    21         ┘
24AF:0048 B8FF4C         MOV    AX,4CFF    ┐ End files
24AF:004B CD21           INT    21         ┘
24AF:004D 53             PUSH   BX         ┐
24AF:004E B85300         MOV    AX,0053    │ 跳到 CS:53 去執行程式
24AF:0051 50             PUSH   AX         │
24AF:0052 CB             RETF              ┘
24AF:0053 2E8B2E0800     MOV    BP,CS:[0008] ┐
24AF:0058 8CDA           MOV    DX,DS        │
24AF:005A 89E8           MOV    AX,BP        │
24AF:005C 3D0010         CMP    AX,1000      │
24AF:005F 7603           JBE    0064         │ 主程式
24AF:0061 B80010         MOV    AX,1000      │
24AF:0064 29C5           SUB    BP,AX        │
24AF:0066 29C2           SUB    DX,AX        │
24AF:0068 29C3           SUB    BX,AX        ↓


    這個 Game 的保護有點類似 SoftGard ,都利用了計算程式碼的長度 ,這
  種保護可以 100%偵測出對方是否有過單步執行。
    "G 100" 這個指令看起來很單純 ,只是要求程式執行到 CS:100 時停下來
  讓使用者能夠Debug 自己的程式 ,事實上它真的就是這樣 ,不過在 Debug
  上是如何執行工作 ,首先它會將 CS:100 的指令碼暫時存起來 ,改放個 "CC"
  (INT 3) 碼來取代 CS:100 的指令碼 ,一但執行到此就會觸動 INT 3 的中斷
  而將程式復原 ,並暫時終止程式繼續執行 ,等使用者下命令。

  程式解說 :
           CS:0012 為主程式
                ↓
           設定 SI=523,CX=525
                ↓←────────┐
           取得 CS:SI 的指令碼      │
                ↓                  │還
           將此碼加入 BP 內         │未
                ↓                  │加
           將 SI 減 1 ,與 CX-1      │完
                ↓                  │程
           CX 是否為零              │式
           (是否將程式碼由頭加到尾  │碼
            即CS:0-CS:523)          │
                ├─────────┘
                ↓
            比對是否正確
                ├───────┐程
                ↓              │式
            印出 Crc Err        │碼
            結束程式            │正
                ┌───────┘確
                ↓
            執行程式


  後記 : 時代一直在變 ,觀念也在變 ,尊重版權 ,才能發展出更好用的軟體
         病毒才能因此滅跡。
         希望"防拷"在國內能夠早日滅跡 ,這就有賴各位大哥們不要任意將
         軟體複製給他人使用 (PD例外)。

         其實任何保護都是在磁片上製造某種錯誤 ,然後根據這個錯誤來判
         定是否原版。
         拷貝是利用程式來複製這個錯誤 ,讓軟體能正確無誤的執行。
         破解是保護的最大殺手 ,不但將這個錯誤砍掉 ,更使得軟體複製更
         為簡單容易 ,一道 DISKCOPY 即可搞定。

                             --- 拷貝心得就此暫告休息 ---