> ┌───────┐
> │ 拷貝心得43集 │       S-ICE 當機程式/閃過地雷
> └───────┘            談 XOE 撥殼術
> =======================================================================
> 前言:
> 
>     前幾天 Ming Sing 撥 XOE 發現很多營養劑 ,筆者順便將其防破能力資料整
> 理 ,在這裡提出來供大家參考 ,若有筆誤請來指正。
> 
> -----------------------------------------------------------------------
> 軟體簡介:
> 
>     XOE 是一套類似 UNP 的解壓縮軟體 ,此軟體有極強的外殼 ,我想大概是為了
> 防止人家用 PCTOOLS 註冊吧。
> 
>     有人會問 S-ICE 屬於保護模式下的軟體 ,要如何才能當掉它呢 ,我目前所知
> 的有兩點 ,第一:在KeyPro(旗標的新書)提到只要呼叫 INT_7 即可當掉 S-ICE ;
> 第二:因為 S-ICE 載入後 ,會跟使用者的鍵盤衝 ,也就是說它沒有辦法分辨出
> INT_9 的產生是因輸入鍵、保護模式錯誤、軟體本身呼叫。
> 
>     用講的可能您還不懂 ,我們做一個小實驗:
> 
> code    segment
>         assume  cs:code,ds:code
> start   proc    near
>         jmp     next
> old_9   dw      0000h,0000h
> new_9 :
>         inc     ax
>         iret
> next :
>         mov     ax,3509h
>         int     21h
>         mov     cs:old_9,bx
>         mov     cs:old_9+2,es
>         xor     ax,ax
>         mov     ds,ax
>         cli
>         mov     word ptr ds:[0024h],offset new_9
>         mov     ds:[0026h],cs
>         mov     ax,0000h
>         mov     cx,8000h
> L1 :
>         int     09h
>         loop    L1
>         push    ax
>         mov     ax,cs:old_9
>         mov     ds:[0024h],ax
>         mov     ax,cs:old_9+2
>         mov     ds:[0026h],ax
>         pop     ax
>         sti
>         int     3h              ;斷點
>         mov     ax,4cffh
>         int     21h
> start   endp
> code    ends
>         end     start
> 
>     這個測試軟體是測試 INT_9 共被執行了幾次 ,正常的情況下斷點的AX
> 值為8000 ,可是如果您載入 S-ICE 的話可能會造成當機 ,即使載入 S-ICE
> 後您使用 DEBUG 執行也一樣會當機 ,因為 S-ICE 把所有發生 INT_9 的命
> 令當做鍵盤輸入 ,而加以處理。
> 
>     p果您在 S-ICE 下來追這程式時 ,可以發現每次執行過 INT_9 後 ,
> AX暫存器仍不會被加一 ,表示此中斷向量根本沒有被執行 ;緊接著筆者將
> 8259重置 ,並將鍵盤中斷改到別的位置(筆者改到INT_A0) ,再用 S-ICE去
> 追這個測試軟體 ,發現每次發生 INT_9 時 ,AX已可以正常加一了 , 這個
> 實驗告訴我們 ,軟體中斷會跟鍵盤中斷向量互搶。
> 
>     後來我再撥 XOE 時又發現即使利用 RESET 8259 來閃過鍵盤互搶問題
>  ,追起來喇叭竟然會嗶嗶叫 ,原來當發生 IN1 的中斷時 ,S-ICE 會去檢查
> 除錯暫存器 ,如果發生原因是硬體中斷則啟動 S-ICE 視窗 ,如果是 T 旗
> 標打開而引起的 ,則決定是否啟動 S-ICE ,或去呼叫 REAL MODE 的中斷 ,
> 至於軟體去呼叫的話 ,除錯暫存器根本沒反應 ,這種不明原因 S-ICE 會解
> 釋成『重入』而發出警告聲(三聲) ,您可以嘗試在軟體內加上 INT_01 並
> 在 DOS 內執行即可。或許您又會問 ,軟體觸動 INT_1 時 ,到底有沒有被
> 執行 ,答案是 INT_1 確實有被執行到。
> 
>     寫了這麼多 ,我們來看看 XOE 到底有什麼難撥之處呢 ,底下是XOE320
> 部份程式碼。
> 
> u 14a 1c3
> 12BE:014A B95517         MOV    CX,1755
> 12BE:014D BE7501         MOV    SI,0175
> 12BE:0150 2E8036570151   XOR    Byte Ptr CS:[0157],51  ;註一
> 12BE:0156 BFC101         MOV    DI,01C1
> 12BE:0159 D1E1           SHL    CX,1
> 12BE:015B 03F9           ADD    DI,CX
> 12BE:015D D1E9           SHR    CX,1
> 12BE:015F 0E             PUSH   CS
> 12BE:0160 1F             POP    DS
> 12BE:0161 33C0           XOR    AX,AX
> 12BE:0163 26C6066C04CD   MOV    Byte Ptr ES:[046C],CD
> 12BE:0169 8BE8           MOV    BP,AX
> 12BE:016B 8BD0           MOV    DX,AX
> 12BE:016D 8BD8           MOV    BX,AX
> 12BE:016F EB3A           JMP    01AB
> 
> 12BE:0193 8036B40108     XOR    Byte Ptr [01B4],08
> 12BE:0198 268A1E6C04     MOV    BL,ES:[046C]    ;註二
> 12BE:019D 2E881EB301     MOV    CS:[01B3],BL
> 12BE:01A2 8B1E9801       MOV    BX,[0198]       ;檢查註二
> 12BE:01A6 32C7           XOR    AL,BH
> 12BE:01A8 02E3           ADD    AH,BL
> 12BE:01AA CF             IRET
> 12BE:01AB AC             LODSB
> 12BE:01AC CC             INT    3
> 12BE:01AD 354441         XOR    AX,4144
> 12BE:01B0 056121         ADD    AX,2161
> 12BE:01B3 CD09           INT    09              ;註三
> 12BE:01B5 3105           XOR    [DI],AX
> 12BE:01B7 4F             DEC    DI
> 12BE:01B8 4F             DEC    DI
> 12BE:01C1 E2E8           LOOP   01AB
> 12BE:01C3 CC             INT    3
> 
> 註一:詐看之下它會把行號156的程式改成 MOV DI,190 ,其實執行後才發
>       現 DI 仍被搬入 1C1 ,詳情請看前兩集...CPU的缺陷。
> 
> 註二:行號198所指的地方是時間記錄地 ,這裡的時間會跳動 ,但是前面已
>       執行過 CLI ,MOV [],CD ,所以此處值為 CD ,但是又為了怕您修改
>       此處的程式碼 ,底下兩行還會檢查此處的程式碼是否被改過。
> 
> 註三:行號193會把1B3改成 INT_9、INT_1 ,當您載入 S-ICE 時 ,發生INT_9
>       中斷將不會被執行(前面已說原因) ,如發生的是INT_1 ,則喇叭會嗶
>       嗶叫。如果您能閃過這兩個問題 ,這軟體您應該就會撥殼了。
> 
> -解碼後的程式
> AX=77AA  BX=8A26  CX=0000  DX=0000  SP=FFFE  BP=0005  SI=01A2  DI=01C1
> DS=18D6  ES=0000  SS=18D6  CS=18D6  IP=01C3   NV UP DI PL ZR NA PE NC
> 18D6:01C3 31C0           XOR    AX,AX
> 18D6:01C5 8ED8           MOV    DS,AX
> 18D6:01C7 BF0400         MOV    DI,0004
> 18D6:01CA BE0201         MOV    SI,0102
> 18D6:01CD E81400         CALL   01E4       ;還原被幹掉的INT_1.3.9
> 18D6:01D0 BF0C00         MOV    DI,000C
> 18D6:01D3 BE0601         MOV    SI,0106
> 18D6:01D6 E80B00         CALL   01E4       ;
> 18D6:01D9 BF2400         MOV    DI,0024
> 18D6:01DC BE7101         MOV    SI,0171
> 18D6:01DF E80200         CALL   01E4       ;
> 18D6:01E2 EB09           JMP    01ED
> -u 1e4 21f
> 
> 18D6:01E4 2EC404         LES    AX,CS:[SI]
> 18D6:01E7 8905           MOV    [DI],AX
> 18D6:01E9 8C4502         MOV    [DI+02],ES
> 18D6:01EC C3             RET
> 18D6:01ED 0E             PUSH   CS
> 18D6:01EE 1F             POP    DS
> 18D6:01EF 8CC8           MOV    AX,CS
> 18D6:01F1 C70635020001   MOV    Word Ptr [0235],0100
> 18D6:01F7 A33702         MOV    [0237],AX
> 18D6:01FA 05F00F         ADD    AX,0FF0
> 18D6:01FD 8EC0           MOV    ES,AX
> 18D6:01FF BE2002         MOV    SI,0220
> 18D6:0202 8BFE           MOV    DI,SI
> 18D6:0204 B91900         MOV    CX,0019
> 18D6:0207 FC             CLD
> 18D6:0208 F3             REPZ
> 18D6:0209 A4             MOVSB
> 18D6:020A BE3902         MOV    SI,0239
> 18D6:020D BF0001         MOV    DI,0100
> 18D6:0210 8B0E4B01       MOV    CX,[014B]
> 18D6:0214 8CC2           MOV    DX,ES
> 18D6:0216 0E             PUSH   CS
> 18D6:0217 07             POP    ES
> 18D6:0218 8CC8           MOV    AX,CS
> 18D6:021A 52             PUSH   DX
> 18D6:021B B82002         MOV    AX,0220
> 18D6:021E 50             PUSH   AX
> 18D6:021F CB             RETF
> -u 10 2d
> 
> 1F89:0010 8CCA           MOV    DX,CS           <--- 壓縮程式進入點
> 1F89:0012 8EDA           MOV    DS,DX
> 1F89:0014 8B0E0800       MOV    CX,[0008]
> 1F89:0018 8BF1           MOV    SI,CX
> 1F89:001A 83EE02         SUB    SI,+02
> 1F89:001D 8BFE           MOV    DI,SI
> 1F89:001F D1E9           SHR    CX,1
> 1F89:0021 FD             STD
> 1F89:0022 F3             REPZ
> 1F89:0023 A5             MOVSW
> 1F89:0024 53             PUSH   BX
> 1F89:0025 B82E00         MOV    AX,002E
> 1F89:0028 50             PUSH   AX
> 1F89:0029 8B2E0A00       MOV    BP,[000A]
> 1F89:002D CB             RETF
> -u 2e 1b0
> 
> 1F89:002E B80010         MOV    AX,1000   <--- 解壓縮
> 1F89:0031 3BC5           CMP    AX,BP
> 1F89:0033 7602           JBE    0037
> 1F89:0035 8BC5           MOV    AX,BP
> 1F89:0037 2BE8           SUB    BP,AX
> 1F89:0039 2BD0           SUB    DX,AX
> 1F89:003B 2BD8           SUB    BX,AX
> 1F89:003D 8EDA           MOV    DS,DX
> 1F89:003F 8EC3           MOV    ES,BX
> 1F89:0041 B103           MOV    CL,03
> 1F89:0043 D3E0           SHL    AX,CL
> 1F89:0045 8BC8           MOV    CX,AX
> 1F89:0047 D1E0           SHL    AX,1
> 1F89:0049 48             DEC    AX
> 1F89:004A 48             DEC    AX
> 1F89:004B 8BF0           MOV    SI,AX
> 1F89:004D 8BF8           MOV    DI,AX
> 1F89:004F F3             REPZ
> 1F89:0050 A5             MOVSW
> 1F89:0051 0BED           OR     BP,BP
> 1F89:0053 75D9           JNZ    002E
> 1F89:0055 FC             CLD
> 1F89:0056 8EC2           MOV    ES,DX
> 1F89:0058 8EDB           MOV    DS,BX
> 1F89:005A BE1200         MOV    SI,0012
> 1F89:005D 33FF           XOR    DI,DI
> 1F89:005F 06             PUSH   ES
> 1F89:0060 F9             STC
> 1F89:0061 AC             LODSB
> 1F89:0062 12C0           ADC    AL,AL
> 1F89:0064 02C0           ADD    AL,AL
> 1F89:0066 E98A00         JMP    00F3
> 1F89:0069 AC             LODSB
> 1F89:006A 12C0           ADC    AL,AL
> 1F89:006C EB31           JMP    009F
> 1F89:006E AC             LODSB
> 1F89:006F 12C0           ADC    AL,AL
> 1F89:0071 EB32           JMP    00A5
> 1F89:0073 AC             LODSB
> 1F89:0074 12C0           ADC    AL,AL
> 1F89:0076 EB33           JMP    00AB
> 1F89:0078 AC             LODSB
> 1F89:0079 12C0           ADC    AL,AL
> 1F89:007B EB3A           JMP    00B7
> 1F89:007D AC             LODSB
> 1F89:007E 12C0           ADC    AL,AL
> 1F89:0080 EB06           JMP    0088
> 1F89:0082 B104           MOV    CL,04
> 1F89:0084 02C0           ADD    AL,AL
> 1F89:0086 74F5           JZ     007D
> 1F89:0088 12FF           ADC    BH,BH
> 1F89:008A E2F8           LOOP   0084
> 1F89:008C B103           MOV    CL,03
> 1F89:008E 02CF           ADD    CL,BH
> 1F89:0090 02C9           ADD    CL,CL
> 1F89:0092 F3             REPZ
> 1F89:0093 A5             MOVSW
> 1F89:0094 EB5D           JMP    00F3
> 1F89:0096 AC             LODSB
> 1F89:0097 12C0           ADC    AL,AL
> 1F89:0099 726E           JB     0109
> 1F89:009B 02C0           ADD    AL,AL
> 1F89:009D 74CA           JZ     0069
> 1F89:009F 12C9           ADC    CL,CL
> 1F89:00A1 02C0           ADD    AL,AL
> 1F89:00A3 74C9           JZ     006E
> 1F89:00A5 730C           JNB    00B3
> 1F89:00A7 02C0           ADD    AL,AL
> 1F89:00A9 74C8           JZ     0073
> 1F89:00AB 49             DEC    CX
> 1F89:00AC 12C9           ADC    CL,CL
> 1F89:00AE 80F909         CMP    CL,09
> 1F89:00B1 74CF           JZ     0082
> 1F89:00B3 02C0           ADD    AL,AL
> 1F89:00B5 74C1           JZ     0078
> 1F89:00B7 7321           JNB    00DA
> 1F89:00B9 02C0           ADD    AL,AL
> 1F89:00BB 7503           JNZ    00C0
> 1F89:00BD AC             LODSB
> 1F89:00BE 12C0           ADC    AL,AL
> 1F89:00C0 12FF           ADC    BH,BH
> 1F89:00C2 02C0           ADD    AL,AL
> 1F89:00C4 7503           JNZ    00C9
> 1F89:00C6 AC             LODSB
> 1F89:00C7 12C0           ADC    AL,AL
> 1F89:00C9 7257           JB     0122
> 1F89:00CB 0AFF           OR     BH,BH
> 1F89:00CD 750B           JNZ    00DA
> 1F89:00CF FEC7           INC    BH
> 1F89:00D1 02C0           ADD    AL,AL
> 1F89:00D3 7503           JNZ    00D8
> 1F89:00D5 AC             LODSB
> 1F89:00D6 12C0           ADC    AL,AL
> 1F89:00D8 12FF           ADC    BH,BH
> 1F89:00DA 8A1C           MOV    BL,[SI]
> 1F89:00DC 46             INC    SI
> 1F89:00DD 8BEE           MOV    BP,SI
> 1F89:00DF 8BF7           MOV    SI,DI
> 1F89:00E1 4E             DEC    SI
> 1F89:00E2 2BF3           SUB    SI,BX
> 1F89:00E4 FA             CLI
> 1F89:00E5 F3             REPZ
> 1F89:00E6 26A4           MOVSB  ES:
> 1F89:00E8 FB             STI
> 1F89:00E9 8BF5           MOV    SI,BP
> 1F89:00EB EB06           JMP    00F3
> 1F89:00ED AC             LODSB
> 1F89:00EE 12C0           ADC    AL,AL
> 1F89:00F0 720C           JB     00FE
> 1F89:00F2 A4             MOVSB
> 1F89:00F3 02C0           ADD    AL,AL
> 1F89:00F5 7205           JB     00FC
> 1F89:00F7 A4             MOVSB
> 1F89:00F8 02C0           ADD    AL,AL
> 1F89:00FA 73F6           JNB    00F2
> 1F89:00FC 74EF           JZ     00ED
> 1F89:00FE B90200         MOV    CX,0002
> 1F89:0101 2AFF           SUB    BH,BH
> 1F89:0103 02C0           ADD    AL,AL
> 1F89:0105 748F           JZ     0096
> 1F89:0107 7392           JNB    009B
> 1F89:0109 02C0           ADD    AL,AL
> 1F89:010B 742C           JZ     0139
> 1F89:010D 73CB           JNB    00DA
> 1F89:010F 41             INC    CX
> 1F89:0110 02C0           ADD    AL,AL
> 1F89:0112 742A           JZ     013E
> 1F89:0114 739D           JNB    00B3
> 1F89:0116 8A0C           MOV    CL,[SI]
> 1F89:0118 46             INC    SI
> 1F89:0119 0AC9           OR     CL,CL
> 1F89:011B 7426           JZ     0143
> 1F89:011D 83C108         ADD    CX,+08
> 1F89:0120 EB91           JMP    00B3
> 1F89:0122 02C0           ADD    AL,AL
> 1F89:0124 7503           JNZ    0129
> 1F89:0126 AC             LODSB
> 1F89:0127 12C0           ADC    AL,AL
> 1F89:0129 12FF           ADC    BH,BH
> 1F89:012B 80CF04         OR     BH,04
> 1F89:012E 02C0           ADD    AL,AL
> 1F89:0130 7503           JNZ    0135
> 1F89:0132 AC             LODSB
> 1F89:0133 12C0           ADC    AL,AL
> 1F89:0135 72A3           JB     00DA
> 1F89:0137 EB98           JMP    00D1
> 1F89:0139 AC             LODSB
> 1F89:013A 12C0           ADC    AL,AL
> 1F89:013C EBCF           JMP    010D
> 1F89:013E AC             LODSB
> 1F89:013F 12C0           ADC    AL,AL
> 1F89:0141 EBD1           JMP    0114
> 1F89:0143 50             PUSH   AX
> 1F89:0144 8BDF           MOV    BX,DI
> 1F89:0146 83E70F         AND    DI,+0F
> 1F89:0149 81C70080       ADD    DI,8000
> 1F89:014D B104           MOV    CL,04
> 1F89:014F D3EB           SHR    BX,CL
> 1F89:0151 8CC0           MOV    AX,ES
> 1F89:0153 03C3           ADD    AX,BX
> 1F89:0155 2D0008         SUB    AX,0800
> 1F89:0158 8EC0           MOV    ES,AX
> 1F89:015A 8BDE           MOV    BX,SI
> 1F89:015C 83E60F         AND    SI,+0F
> 1F89:015F D3EB           SHR    BX,CL
> 1F89:0161 8CD8           MOV    AX,DS
> 1F89:0163 03C3           ADD    AX,BX
> 1F89:0165 8ED8           MOV    DS,AX
> 1F89:0167 58             POP    AX
> 1F89:0168 02C0           ADD    AL,AL
> 1F89:016A 7503           JNZ    016F
> 1F89:016C AC             LODSB
> 1F89:016D 12C0           ADC    AL,AL
> 1F89:016F 7282           JB     00F3
> 1F89:0171 5A             POP    DX
> 1F89:0172 0E             PUSH   CS
> 1F89:0173 1F             POP    DS
> 1F89:0174 32ED           XOR    CH,CH
> 1F89:0176 BEB301         MOV    SI,01B3
> 1F89:0179 AC             LODSB
> 1F89:017A 8AC8           MOV    CL,AL
> 1F89:017C E313           JCXZ   0191
> 1F89:017E AD             LODSW
> 1F89:017F 03C2           ADD    AX,DX
> 1F89:0181 8EC0           MOV    ES,AX
> 1F89:0183 33FF           XOR    DI,DI
> 1F89:0185 32E4           XOR    AH,AH
> 1F89:0187 AC             LODSB
> 1F89:0188 03F8           ADD    DI,AX
> 1F89:018A 260115         ADD    ES:[DI],DX
> 1F89:018D E2F8           LOOP   0187
> 1F89:018F EBE8           JMP    0179
> 1F89:0191 8B360400       MOV    SI,[0004]
> 1F89:0195 8B3E0600       MOV    DI,[0006]
> 1F89:0199 03FA           ADD    DI,DX
> 1F89:019B 01160200       ADD    [0002],DX
> 1F89:019F 83EA10         SUB    DX,+10
> 1F89:01A2 8EC2           MOV    ES,DX
> 1F89:01A4 8EDA           MOV    DS,DX
> 1F89:01A6 33C0           XOR    AX,AX
> 1F89:01A8 33DB           XOR    BX,BX
> 1F89:01AA FA             CLI
> 1F89:01AB 8BE6           MOV    SP,SI
> 1F89:01AD 8ED7           MOV    SS,DI
> 1F89:01AF FB             STI
> 1F89:01B0 2EFF2F         JMP    FAR CS:[BX]  <-- 跳到程式進入點
> -u 4b3 500
> 
> 12F1:04B3 E84AFB         CALL   0000         <-- 程式進入點
> 12F1:04B6 890ED629       MOV    [29D6],CX
> 12F1:04BA C7064E042505   MOV    Word Ptr [044E],0525
> 12F1:04C0 E88119         CALL   1E44
> 12F1:04C3 BF0000         MOV    DI,0000
> 12F1:04C6 0E             PUSH   CS
> 12F1:04C7 07             POP    ES
> 12F1:04C8 B90A00         MOV    CX,000A
> 12F1:04CB B090           MOV    AL,90
> 12F1:04CD FC             CLD
> 12F1:04CE F3             REPZ
> 12F1:04CF AA             STOSB
> 12F1:04D0 BF441E         MOV    DI,1E44
> 12F1:04D3 B91400         MOV    CX,0014
> 12F1:04D6 32C0           XOR    AL,AL
> 12F1:04D8 F3             REPZ
> 12F1:04D9 AA             STOSB
> 12F1:04DA B90404         MOV    CX,0404
> 12F1:04DD D1E9           SHR    CX,1
> 12F1:04DF 03F9           ADD    DI,CX
> 12F1:04E1 0E             PUSH   CS
> 12F1:04E2 07             POP    ES
> 12F1:04E3 FC             CLD
> 12F1:04E4 BFB304         MOV    DI,04B3
> 12F1:04E7 B93600         MOV    CX,0036
> 12F1:04EA F3             REPZ
> 12F1:04EB AA             STOSB
> 12F1:04EC E8AC08         CALL   0D9B
> 12F1:04EF E83E19         CALL   1E30
> 12F1:04F2 F606D91F08     TEST   Byte Ptr [1FD9],08
> 12F1:04F7 7407           JZ     0500
> 12F1:04F9 E8380F         CALL   1434
> 12F1:04FC 32C0           XOR    AL,AL
> 12F1:04FE EB58           JMP    0558
> 12F1:0500 F606DA1F40     TEST   Byte Ptr [1FDA],40
> 
> ============================================================
> 結論:
>     有沒有辦法可以閃過這個相衝的問題呢 ,別忘了 S-ICE 還有個
> BPINT X 可以加以利用.....您會不會閃這種地雷呢 ?
> 
>     8259 重置方法請看前面幾集(筆者忘了是那一集了)
> 
>                                        -- 軟蛀 1993/12/12 --

--