┌──────┐
│拷貝心得42集│           Soft-ICE 的死角
└──────┘
---------------------------------------------------------------------
前言:
    自從 Soft-ICE 被發掘起來以後 ,因為 Soft-ICE 的防當技術太高明 ,軟
體所做的各種防破手段逐漸無作用 ;同時市面上又有同級產品 GAMETOOLS ,使
得軟體防破進入了慘淡的時光 ,直到最近開始出現防這類除錯程式的軟體 ,且
幾乎都是針對 Soft-ICE 這套軟體 ,底下僅舉一個實例讓大家知道。

    再舉出例子之前 ,必需告訴讀者這套防破軟體使用大量的中斷向量 ,其中
如果使用INT_07的話 ,此中斷正好是S-ICE未處理到的向量 ,只要呼叫此中斷
就可以把S-ICE當的死死的(讀者可自行試試) ,如果你能避開這些問題的話 ,
就可以輕鬆的除錯。

---------------------------------------------------------------------
PRE2.COM (使用S-ICE除錯PC猿人主檔)

-U 189
08E5:0189 8BF8                  MOV     DI,AX
08E5:018B D1E7                  SHL     DI,01
08E5:018D D1E7                  SHL     DI,01
08E5:018F 368B14                MOV     DX,SS:[SI]
08E5:0192 368715                XCHG    DX,SS:[DI]
08E5:0195 368914                MOV     SS:[SI],DX
08E5:0198 E2E4                  LOOP    017E
08E5:019A CD0A                  INT     0A
08E5:019C CD08                  INT     08      <--- 防破程式進入點
08E5:019E EBA8                  JMP     0148         請切入此程式內

執行至 019C 後 ,看一看中斷向量表被改的情形

-D 0000:0000 0000:004F
0000:0000 97 03 E5 08 E3 03 E5 08-98 02 E5 08 B1 02 E5 08
0000:0010 CF 02 E5 08 0A 04 E5 08-D4 02 E5 08 A4 01 E5 08
0000:0020 34 04 E5 08 3B 03 E5 08-AF 03 E5 08 F9 02 E5 08
0000:0030 83 03 E5 08 79 03 E5 08-53 03 E5 08 53 03 E5 08
0000:0040 00 01 E5 08 46 4E E5 08-00 00 81 A0 5B EF 9C 01

-U 8E5:434 (看INT_8的程式)
08E5:0434 36C7062000E802        MOV     WORD PTR SS:[0020],02E8
08E5:043B B0FE                  MOV     AL,FE
08E5:043D E621                  OUT     21,AL
08E5:043F CD05                  INT     05
08E5:0441 CD08                  INT     08
08E5:0443 CD04                  INT     04
08E5:0445 CD08                  INT     08
08E5:0447 CD06                  INT     06
08E5:0449 CD08                  INT     08
08E5:044B CD07                  INT     07 <-- SICE 執行到此暫停 ,以免當機
08E5:044D FFE0                  JMP     AX

-G 44B
-RIP 1A4  (因為INT_7指向的位置在此 ,正常INT會將CS:IP FLAG送入堆疊 ,不可
           以直接改IP ,但因 1A4 的程式碼將 SS:SP 修改 ,所以有沒有此堆疊
           資料都無所謂 ,所以筆者直接改 IP )

-U 1A4
08E5:01A4 FB                    STI
08E5:01A5 8CCC                  MOV     SP,CS      <-+
08E5:01A7 8ED4                  MOV     SS,SP      < |堆疊被改 ,所以
08E5:01A9 BCFB00                MOV     SP,00FB    <-+可用上面方法改IP
08E5:01AC BE0001                MOV     SI,0100
08E5:01AF 2E8B0E3401            MOV     CX,CS:[0134]
08E5:01B4 D1E9                  SHR     CX,01
08E5:01B6 D1E9                  SHR     CX,01
08E5:01B8 33C0                  XOR     AX,AX
08E5:01BA CD0B                  INT     0B
08E5:01BC CD0E                  INT     0E
08E5:01BE F4                    HLT

                         .
                         .
                         . CS:100 會被執行 N 次
                         . 也就是程式一直重覆上
                         . 面的迴圈。
                         .
                         .




-U 08E5:034A
08E5:034A BAC403                MOV     DX,03C4
08E5:034D B80205                MOV     AX,0502
08E5:0350 EF                    OUT     DX,AX      <-- 當掉VGA畫面
08E5:0351 9C                    PUSHF
08E5:0352 58                    POP     AX
08E5:0353 0D0001                OR      AX,0100    <-- 開啟"T"旗標
08E5:0356 50                    PUSH    AX
08E5:0357 9D                    POPF
08E5:0358 FB                    STI
08E5:0359 8CC8                  MOV     AX,CS
08E5:035B 8EC0                  MOV     ES,AX
08E5:035D 33C0                  XOR     AX,AX
08E5:035F 8ED8                  MOV     DS,AX
08E5:0361 33DB                  XOR     BX,BX
08E5:0363 B500                  MOV     CH,00
08E5:0365 B101                  MOV     CL,01
08E5:0367 B80104                MOV     AX,0401
08E5:036A 33D2                  XOR     DX,DX
08E5:036C 9C                    PUSHF
08E5:036D FF1E4C00              CALL    [004C]     <-- 呼叫 INT_13
                                                       用來找 INT_13 進入點
                                                       將進入點放在 0:C

-D 92B:0  (前幾個迴圈)
092B:0000 EB 38 08 08 3C 2D 20 0A 0A 0A 09 09 50 72 6F 74 .8..<- .....Prot
092B:0010 65 63 74 69 6F 6E 20 6B 69 74 2D 42 20 20 31 39  ection Kit-B  19
092B:0020 39 33 20 62 79 20 45 2E 5A 4D 49 52 4F 21 0A 0D  93 by E.ZMIRO!..

-D 92B:0 (後幾個迴圈 ,此為 DIET 所壓)
092B:0000 4D 5A F3 00 49 00 00 00 02 00 BF 0C FF FF C5 15  MZ..I...........
092B:0010 80 00 9D 89 00 00 00 00 1C 00 40 00 64 69 65 74  ..........@.diet


-U 828
1E2F:0828 7313                  JAE     083D
1E2F:082A FA                    CLI
1E2F:082B 81C50000              ADD     BP,0000
1E2F:082F 8ED5                  MOV     SS,BP
1E2F:0831 BC0002                MOV     SP,0200
1E2F:0834 FB                    STI
1E2F:0835 33ED                  XOR     BP,BP
1E2F:0837 90                    NOP
1E2F:0838 EA08001509            JMP     0915:0008    <-- DIET 程式進入點


-U 0915:0008
0915:0008 FA                    CLI                  <-- DIET 檔頭
0915:0009 FC                    CLD
0915:000A BAFFFF                MOV     DX,FFFF
0915:000D BE8000                MOV     SI,0080
0915:0010 AC                    LODSB
0915:0011 98                    CBW
0915:0012 8BC8                  MOV     CX,AX
0915:0014 E35E                  JCXZ    0074


    當解壓完畢以後 ,在 0000:000C 仍然保留著 INT_13 的正確進入點


-U 1A84 (遊戲主程式內的保護程式)
0915:1A84 E8D500                CALL    1B5C  <-- 驗證保護
0915:1A87 7365                  JAE     1AEE  <-- 正確則跳躍
0915:1A89 E8D000                CALL    1B5C
0915:1A8C 7360                  JAE     1AEE
0915:1A8E 8036E02301            XOR     BYTE PTR [23E0],01
0915:1A93 E8C600                CALL    1B5C
0915:1A96 7356                  JAE     1AEE

   PS:驗證保護軌的動作將會呼叫 0000:000C 的 INT_13 的進入點。
      只要在 1A87.1A8C.1A96 任一個改成 JMP 即可免 KEY DISK
      未進入程式進入點之前 ,修改任一位元將導至解碼不正確。

追蹤過程:
  G44B.RIP1A4.G44B.RIP1A4.G48D.RIP17B.閃過350當營幕.G44B
  RIP1A4.G44B.RIP1A4.G44B.RIP1A4.G44B.RIP1A4.G44B.RIP1A4
  G297.T.G2D.T.G46.G838.T.遊戲程式進入點



---------------------------------------------------------------------
結論:
    S-ICE 總有一天將無法再拿來 DEBUG 軟體。