┌┐┌┐┌┐∞
 ┘└┘└┘└┘
┌───────┐
│拷貝心得第32集│
└───────┘
 前言:
 現在的軟體保護技巧不停的翻新 ,使的筆者也要不停的練功 ,直至最進手癢興
 起解保護模式的軟體時 ,發現手上的 SYMDEB 並不管用 ,甚至連 TURBO-DEBUG
 也無效 ,所以便四處搜刮程式 ,並研讀密笈 ,現在讓咱們來揭開這個神密的面
 紗吧。

 ┌────────────┐
 │ 1-1 真實模式 & 保護模式│
 └────────────┘
 很多學組合語言的人可能聽過保護模式 ,但並不知道保護模式長的是什麼樣子
  ,只知道是有著32Bit暫存器的模式 ,其實這只是一小部份罷了。

 [真實模式]
 當您進入 DEBUG 後 ,您便會發現記憶體是以位移方式計算程式所在位置 ,就像
 1234:5678 ,且暫存器只有16Bit , 其中又使用INT中斷方式呼叫DOS所提供的工
 作 ,但是由於暫存器小 ,所以您最多所能控制的記憶體量不過 1088K(FFFF:FFFF)
  ,當然對於真實模式大多數人都已非常了解 ,所以筆者就不多談了。

 [保護模式]
 DOS當初撰寫時是以8086語言來寫 ,所能使用到的記憶僅僅1088K ,所以當您主機
 升級時 ,電腦超過1MB的記憶體便無法使用到 ,後來就有EMS的出現 ,但是因為EMS
 設計的關係 ,只能拿來擺資料 ,無法拿來擺執行程式 ,所以比較龐大的程式便切進
 保護模式 ,藉以讓程式能夠有更大的空間 ,以筆者手上的軟體而言 ,切入保護模式
 的軟體有 PADS2000. Novell. 兩套軟體 ,但是WINDOW.AUTOCADR10.PADS405這些著
 名的軟體並沒有真的切進保護模式 ,只是利用XMS規格切頁 ,功能類似EMS, 拿來擺
 資料 ,並非拿來擺可執行的程式 ,且似乎只要掛上 HIMEM.SYS ,軟體便不能切入保
 護模式。

 由於筆者無法切入286保護模式 ,所以簡略帶過 ,286只有16Bit暫存器 ,保護模
 式長得怎樣沒看過 ,不過286CPU有個缺陷 ,就是切入保護模式後 ,除非重開機 ,
 否則回不了DOS ,當然此尚未查證。
 筆者成功的切入386保護模式 ,但由於尚無法完全控制 ,所以研究的僅一知半解
  ,只是想將此一消息告訴各位讀者罷了.....以下所指的保護模式皆指386。

 386保護模式下暫存器改為32Bit ,並從原來的 AX,BX....改成EAX,EBX....
 且簡化一些暫存器 ,僅剩下 EAX.EBX.ECX.EDX.ESI.EDI.EBP.ESP.EIP.FLAGS
 以及 (PF ZF IF)旗標 ,和除錯暫存器(筆者找不到此暫存器) ,而且記憶體分節
 也比較怪異 ,沒有冒號囉 ,記憶體位置從00000000-FFFFFFFF ,計32MB吧 ,而且
 指令也增減了一些 ,雖然程式仍可寫 int_xx ,但是皆不可呼叫 ,因為該中斷程
 式所執行的不再是真實模式 ,強要執行會當機。
 我想大家一定想更進一步知道什麼是保護模式 ,列一段程式給您看看吧 !

 # R
 EAX=7FFFFFFF  EBX=00000000   ECX=00000000   EDX=00000000
 ESI=00000000  EDI=00000000   EDI=00000000   ESP=00000000
 EIP=00000416  FLAGS=00007246 (PF ZF IF)
 # U 00000416
 00000416 E7 0F                OUT   0F,EAX
 00000418 0F 85 88 FE 66 83    JNZ   836702A6
 0000041E FA                   CLI
 0000041F 020F                 ADD   CL,[EDI]
 00000421 85 80 FE 33 02 B8    TEST  [EAX+B80233FE],EAX
 00000427 FA                   CLI
 00000428 00 CD                ADD   CH,CL
 0000042A 14 B4                ADC   AL,B4

 # U 0000205C
 0000205C 8B 1D 2F 07 00 00    MOV   EBX,[0000072F]
 00002062 E8 BF 15 00 00       CALL  00003626
 00002067 0F B7 05 39 07 00 00 MOVZX EAX,word ptr [00000739]
                               ^^^^^指令沒打錯唷

 現在再來看看指令與真實模式的不同點吧 ,以下指出的是筆者測試出的部份 ,
 因為市面沒有書籍介紹保護模式 ,加上筆者初學保護模式 ,所以沒有任何參考
 資料 ,故稍嫌簡陋。
 至於如何切入保護模式 ,由於筆者尚未學會 ,所以無可奉告。

 ┌───────┐
 │ 2-1 指令探討 │
 └───────┘
真實模式下的程式執行結果筆者略過不談 ,因為真實模式相信學過組合語言的人
都十分了解 ,所以懶得再講一次 ,以下是保護模式執行的結果:

 # A 00020000 MOV EAX,12345678
              MOV AL,FF
              INT 3
 # T2  ("#"是類似真實模式DEBUG的"-"號 ,T2是單步執行兩次)

 結果 EAX = 12345678 =123456FF
 表示保護模式下也接受 AH,AL修改 ,不過好像沒有程式可改前四碼的指令 ,因為
 386Debugger不接受 MOV EAH,?? 的指令 ,且我觀看其它斷落也沒看到相關的指令
 所以就當做沒有這個指令吧。


 ┌───────┐
 │ 2-2 指令探討 │
 └───────┘

 再來就是指令的變化囉 ,一般學過組合的人都知道 JNZ 條件跳越僅可跳一小段距
 離 ,但是保護模式似乎並無此限制 ,因為我看到一些特殊的碼 ,也列出來讓大家
 看看吧。

 # U 000020B5
 000020B5 0F 85 7F 00 00 00    JNZ   0000213A
 # U 00002111
 00002111 75 27                JNZ   0000213A

 從這裡可看到程式碼很明顯有著不同長度 ,不過條件跳越指令碼雙方似乎不同 ,一
 個是用 "0F" 另一個用 "75" 難怪保護模式保護的軟體沒幾個人看的懂。

 對了 INT_3 似乎不是觸動 0000000C-0000000F 所指的位置 ,因為我把它指向令一
 塊記憶體 ,然後執行 INT_3 ,竟沒當機耶 ,而且也中斷下來了。
 不要問我為什麼 ,因為我也是一知半解。

 ┌─────────┐
 │ 2-3 記憶段落換算 │
 └─────────┘

 接著咱們再來比較真實模式與保護模式下的記憶體位置吧:
 真實模式與保護模式記憶體的換算方式書上有介紹 ,但與筆者的所研讀有點偏差 ,所
 我們來看看吧 ,例如記憶體位置 1234:5678 ,轉換真實模式記憶位置可看成

          12340
        +  5678
     -------------
          179B8 = 1000:79B8  <-----這是真實的

但是保護模式下與真實模換算就有點出入
因為 0000:0000 在保護模式下所看到的位置是 FFF00000
  而 1234:5678 在保護模式下的位置是       FFF179B8
所以於保護模式下要讀寫 VIDEO 記憶體應該是 FFFB0000 or FFFB8000
不過有個地方蠻奇怪的 ,記憶位置為 FFFF:10 的記憶體保護模式下的記憶體
資料竟是從00000000開始放起 ,令人難以相信硬體如何設計 ,看來真實模式與
保護模式要有另一套的計算公式囉。

 ┌───────┐
 │ 2-4 中斷向量 │
 └───────┘
 真實模式下有幾個中斷是很重要的 ,稍一修改就會當機 ,如INT_8或者是
 INT_1C 這些中斷每秒會被呼叫 18.2 次 , 以及INT_9(鍵盤中斷) ,這些
 中斷若被改 ,應該會當機 ,但是切入保護模式後 ,這些中斷似乎就沒用到
 了 ,因為我故意將這些中斷指向 0000 ,也就是將 FFF00000-FFF00100 全
 部塗零 ,竟然沒有當機 ,難怪 TURBO DEBUG 不怕鍵盤被鎖死。
 奇怪 ,那INT_3是指向那一塊記憶體程式呢 ?

 另外程式本身也有用到 CLI 指令 ,表示仍然有程式在電腦某個腳落執行著
 時間計數的功能 ,只是我找不到。

 我想各位一定想再多看一些保護模式下的指令吧 ,我多列出一些碼 ,讓各位
 多了解保護模式 ,與保護模式下的指令吧。

 # U 2044
00002044 8B 44 24 24         MOV    EAX,[ESP+24]
00002048 89 10               MOV    [EAX],EDX
0000204A 8B 1D 2F 07 00 00   MOV    EBX,[0000072F]
00002050 E8 D1 15 00 00      CALL   00003626
00002055 33 C0               XOR    EAX,EAX
00002057 5F                  POP    EDI
00002058 5E                  POP    ESI
00002059 5B                  POP    EBX
0000205A 5D                  POP    EBP
0000205B C3                  RET
0000205C 8B 1D 2F 07 00 00   MOV    EBX,[0000072F]
00002062 E8 BF 15 00 00      CALL   00003626
00002067 0F B7 05 39 07 00 00MOVZX  EAX,word ptr [00000739]
0000206E 5F                  POP    EDI

接著咱們來看看其它指令 ,因為有軟體是進入保護模式後 ,才去讀寫KeyPro
指令               指令碼
OUT DX,EAX         EF
CMP EDI,ESP        39 E7
OUT 6E,AL          E6 6E
IN  AL,DX          EC
TEST [ECX],EDI     85 39
IN AL,02           E4 02
OUT 60,AL          E6 60
IN AL,64           E4 64
TEST AL,02         A8 02
IN EAX,85          E5 85
IN EAX,DX          ED
OUT DX,EAX         EF
POPFD              9D  <---指令沒打錯唷
NOP                90
既然真實模式與保護模式指令差不多 ,要DEBUG保護模式下的軟體應該不是很難
才對 ,好啦 ,筆者講到此為止 ,您是不是對保護模式已稍有概念了。

如果您對保護模式追蹤有概念的話 ,希望您也能教教筆者 ,因為保護模式的軟體
已逐漸增多 ,而我僅只有概念 ,太慘了.....