┌────────┐   軟體保護落伍了 ,智慧財產權保護要得
    │ 拷貝心得第22集 │   -_-_-_-_-_- ∞
    └────────┘   ★ 一句話 : 天下沒有解不開的鎖 ★
===========================================================================
┌────┐
│1-1 前言│
└────┘
    本集主要是介紹 Lotus 2.2T 上所用的 CopyLock-][ 保護
  的技巧 ,使其無法被破解。

    首先您必需了解 Debug 的工作原理 ;電腦有一個叫做T旗標的東西 ,當它
  被設定的時候 ,每執行一個指令 ,就會產生一個 INT_01 的中斷 ,而 INT_03
  事實上並沒有特殊意義 ,只是它只佔一個 "CC" 碼較易處理 ,比其它 "CD??"
  容易被處理。

    所以您執行 Debug 的"T" 指令時 ,Debug 會將 "T" 旗標打開 ,然後執行程
  式 ,攔截 INT_01 即可 ,因為執行完一個指令即會發生此中斷 ,這也就是為何
  BIOS 內也可單步執行。

    當您執行 Debug 的 "G" 指令時 ,則程式會在中斷點寫下一個 "CC" 碼 ,當
  執行到此即會發生 INT_03 的中斷 ,然後中斷程式執行。

    但是在 BIOS 內即不可寫入 "CC" 碼 ,因 BIOS 是 ROM ,無法寫入資料 ,故
  無法在 BIOS 內下達 "G" 指令。
    ( PS: "CC" 碼解譯為 INT_03 )

===========================================================================
            ★★★  以下均為解碼後之程式  ★★★
===========================================================================
┌─────┐
│2-1 程式壹│  (防破又兼具解碼能力的程式)
└─────┘
  CS:11E4 FA             CLI
  CS:11E5 FC             CLD
  CS:11E6 B80000         MOV    AX,0000         ┐
  CS:11E9 8EC0           MOV    ES,AX           │
  CS:11EB 8CC8           MOV    AX,CS           │
  CS:11ED 26A30600       MOV    ES:[0006],AX    │
  CS:11F1 E80000         CALL   11F4            │將 INT_01 指向自己的程式
  CS:11F4 8BEC           MOV    BP,SP           │
  CS:11F6 5F             POP    DI              │
  CS:11F7 81C70800       ADD    DI,0008         │
  CS:11FB 90             NOP                    │
  CS:11FC BB8300         MOV    BX,0083         │
  CS:11FF 03DF           ADD    BX,DI           │
  CS:1201 26891E0400     MOV    ES:[0004],BX    ┘
  CS:1206 BB9700         MOV    BX,0097
  CS:1209 03DF           ADD    BX,DI
  CS:120B 2E899D9E00     MOV    CS:[DI+009E],BX
  CS:1210 9C             PUSHF                                 ┐
  CS:1211 814E000001     OR     Word Ptr [BP+00],0100          │打開"T"旗標
  CS:1216 9D             POPF             ^^(因11F4已將SP=BP)  ┘
  CS:1217 8ACE           MOV    CL,DH
  CS:1219 2E898D6C00     MOV    CS:[DI+006C],CX         ┐
  CS:121E 80E107         AND    CL,07                   │
  CS:1221 80C107         ADD    CL,07                   │障眼法 ,看起來
  CS:1224 BB9C00         MOV    BX,009C                 │好像是解碼程式
  CS:1227 2E3311         XOR    DX,CS:[BX+DI]           │其實是一堆無用
  CS:122A 83EB02         SUB    BX,+02                  │的程式
  CS:122D 73F8           JNB    1227                    │(主程式有被編碼)
  CS:122F 2E8B9D9E00     MOV    BX,CS:[DI+009E]         │
  CS:1234 26891E0400     MOV    ES:[0004],BX            │其目地是觸動固
  CS:1239 D1CA           ROR    DX,1                    │定次的 INT_01
  CS:123B FEC9           DEC    CL                      │達到解碼目地
  CS:123D 75E5           JNZ    1224                    │
  CS:123F 8CC0           MOV    AX,ES                   │解碼程式放在INT_01
  CS:1241 03D0           ADD    DX,AX                   │
  CS:1243 26890E0C00     MOV    ES:[000C],CX            ┼ 當掉 INT_03
  CS:1248 2689160E00     MOV    ES:[000E],DX            ┼ 當掉 INT_03
  CS:124D FECD           DEC    CH                      │
  CS:124F 75AB           JNZ    11FC                    │
  CS:1251 5B             POP    BX                      │
  CS:1252 5E             POP    SI                      │
  CS:1253 83FE32         CMP    SI,+32                  │
  CS:1256 D1DA           RCR    DX,1                    │
  CS:1258 83EE02         SUB    SI,+02                  │
  CS:125B 2E3110         XOR    CS:[BX+SI],DX           │
  CS:125E 42             INC    DX                      │
  CS:125F D1CA           ROR    DX,1                    │
  CS:1261 83EE02         SUB    SI,+02                  │
  CS:1264 73F5           JNB    125B                    ┘
  CS:1266 FFE3           JMP    BX                      ─ 跳回原呼叫此程式
                                                           之副程式。

  CS:127F 8B46FC         MOV    AX,[BP-04]              ┐
  CS:1282 2BC7           SUB    AX,DI                   │
  CS:1284 2D2200         SUB    AX,0022                 │
  CS:1287 7509           JNZ    1292                    │ INT_01 指向之
  CS:1289 B86E00         MOV    AX,006E                 │ 程式
  CS:128C 03C7           ADD    AX,DI                   │
  CS:128E 26A30400       MOV    ES:[0004],AX            │ 每次皆指向不同
  CS:1292 CF             IRET                           │ 位址
                                                        │
  CS:1293 816600FFFE     AND    Word Ptr [BP+00],FEFF   │
  CS:1298 CF             IRET                           ┘

  PS: 該程式是執行一段就解碼一段 ,不是一次全解碼完畢。


┌─────┐
│2-2 程式貳│     (自己擁有磁碟讀寫程式『僅列出部份』)
└─────┘
  CS:0FDC 53             PUSH   BX
  CS:0FDD D1C3           ROL    BX,1
  CS:0FDF 8AC3           MOV    AL,BL
  CS:0FE1 EE             OUT    DX,AL
  CS:0FE2 8AC7           MOV    AL,BH
  CS:0FE4 EB01           JMP    0FE7
  CS:0FE6 90             NOP
  CS:0FE7 EE             OUT    DX,AL
  CS:0FE8 5B             POP    BX
  CS:0FE9 C3             RET

  CS:1022 EC             IN     AL,DX
  CS:1023 8804           MOV    [SI],AL
  CS:1025 46             INC    SI
  CS:1026 EB01           JMP    1029
  CS:1028 90             NOP
  CS:1029 EC             IN     AL,DX
  CS:102A 8804           MOV    [SI],AL
  CS:102C 46             INC    SI
  CS:102D 42             INC    DX
  CS:102E EC             IN     AL,DX
  CS:102F 8804           MOV    [SI],AL
  CS:1031 46             INC    SI
  CS:1032 EB01           JMP    1035
  CS:1034 90             NOP
  CS:1035 EC             IN     AL,DX
  CS:1036 8804           MOV    [SI],AL
  CS:1038 46             INC    SI
  CS:1039 C3             RET

┌─────┐
│2-3 程式參│   (只能安裝三次的保護)
└─────┘
  CS:23A5 8B1E011E       MOV    BX,[1E01]
  CS:23A9 81C3E000       ADD    BX,00E0
  CS:23AD 8A0F           MOV    CL,[BX]
  CS:23AF B500           MOV    CH,00
  CS:23B1 890E0600       MOV    [0006],CX   → CX = 剩餘可安裝的次數
  CS:23B5 53             PUSH   BX
  CS:23B6 51             PUSH   CX
  CS:23B7 80F900         CMP    CL,00       ┐ 是否為零次 ,是則跳越
  CS:23BA 7403           JZ     23BF        ┘ 顯示 **無法再安裝**
  CS:23BC EB46           JMP    2404

┌─────┐
│2-4 程式肆│   (驗證防寫措施)
└─────┘
  CS:25BD E84902         CALL   2809
  CS:25C0 7201           JB     25C3    ─ 防寫則跳 ,顯示 WRITE FAILURE
  CS:25C2 C3             RET

┌───────┐
│3-1 無限安裝法│
└───────┘
 原:
  CS:23AD 8A0F           MOV    CL,[BX]
  CS:23AF B500           MOV    CH,00
  CS:23B1 890E0600       MOV    [0006],CX   → CX = 剩餘可安裝的次數
 改:
  CS:23AD                MOV    [BX],CL     → 因程式末還會檢查 [BX]
  CS:23AF                MOV    CH,00          是否與 [0006] 相同
  CS:23B1                MOV    [0006],CX      且 CL 執行至此因不為
                                               00 故改成這樣子。

  找 BF 40 DF 9D 5D 34 AF
  改 BD 40 ..............  <---- 此為反編碼值

┌────────┐
│3-2 防寫仍要安裝│
└────────┘
 原:
  CS:25BD E84902         CALL   2809
  CS:25C0 7201           JB     25C3    ─ 防寫則跳 ,顯示 WRITE FAILURE
  CS:25C2 C3             RET
 改:
  CS:25BD                CALL   2809
  CS:25C0                NOP *2
  CS:25C2                RET

  找 A7 9D 69 B9 6D 8B 8A
  改 45 0C ..............  <---- 此為反編碼值


┌───────────┐
│3-3 破解時隨時會當鍵盤│
└───────────┘
  本軟體在破解時 ,隨時都會當掉鍵盤 ,其當鍵盤方式為:
    IN   AL,21h
    OR   AL,02
    OUT  21,AL

  至於如何防被當 ,可利用 INT_1C 指向自己的程式。
    PUSH  AX
    MOV   AL,B8
    OUT   21,AL
    POP   AX
    IRET
  這樣就可免除當鍵盤的苦處啦 !