?? dosje.txt
字號:
DOS下軟件解淺談
清華大學 計算機系 何開川
Email:hyj-dmp@mail.tsinghua.edu.cn
一、概述∶
在當今五彩繽紛的軟件世界里,有很多被加過密的軟件,給軟件的使用和
研究帶來諸多不便,然而由于軟件保護法的推行需要一定時間,軟件開發商們為
了維護自身的利益,不可能在短時間內放棄對軟件的加密。因此為了更好地利用
現有軟件和研究軟件技術,我們有必要對軟件的加解密知識有所了解。
考慮到讀者大多對軟件解密不太了解,本文僅以比較簡單的DOS下軟件
解密(特別是游戲軟件的PASSWORD的解拆)為對象,向大家介紹一下軟件解密
的基本思路。
二、有關的基礎知識∶
應該說,在任何操作系統下的解密工作都是建立在對此操作系統的高度
熟悉的基礎上的。你對系統的原理理解的越透徹,在進行剖析解密之類的工作時
也就越如魚得水。當然,僅僅為了解一些簡單的DOS下軟件,也沒有必要完整地
研究DOS的體系結構,但下列BASIC KNOWLEDGE不可不知∶
?。保模希拥闹袛鄼C制∶
Intel80X86處理器系列藉助于一張256個四字節向量的
中斷向量表提供最多256種不同中斷動作的服務能力。這張表存在實地址的
0∶0-0∶256處。每個向量由32位的地址組成,形成對相應中斷作出響
應時自動調用的例程的"段址∶偏址"
觸發這樣一個例程有3種方式∶⑴由處理器芯片本身從內部產生;
⑵由外部中斷請求信號產生(所謂的"硬中斷");⑶由一條軟中斷(INT)
指令產生。我們關心的通常是后兩種。
最常用的中斷有∶
⑴?。桑危浴。埂? 鍵盤硬中斷,每當有鍵按下時自動產生。游戲程序常接管此中斷。
(2) INT 10∶
BIOS的顯示中斷例程,當軟件改變屏幕模式或做屏幕顯示時常調中
斷。
⑶ INT?。保场? BIOS的磁盤低級輸入、輸出服務例程。有些加密軟件把密鑰信息存
在磁盤上,則其在運行時常會調此中斷。
INT13 AH=02
目的∶ 讀絕對扇區入內存。
入口參數∶ AL=要讀扇區數
CH=磁道號或
柱面號8低位 (對硬盤)
CL=扇區號(bit0-bit5)
柱面號高2位(bit6-bit7) (對硬盤)
DH=磁頭號
DL=驅動器號 (00H∶A驅,01H∶B驅 80H∶C盤)
ES∶BX 數據緩沖區
返回∶ CF置位-- 出錯
CF 清零 -- 成功
⑷ INT?。保丁? BIOS提供的鍵盤服務軟中斷,程序通常主動調此中斷以讀取鍵盤狀
態。
INT16 AH=00H:
目的∶ 得到擊鍵狀態。
返回∶ AX=掃描碼
AL=ASCII字符
INT16 AH=01H
目的∶檢查是否有有效擊鍵。
返回∶ ZF置位 -- 無有效擊鍵
ZF清零 -- 若擊鍵有效,此時∶AH=掃描碼, AL=ASCII字符
INT16 AH=02H
目的∶返回BIOS保存的狀態鍵的按下狀態。
返回 ∶AL=狀態鍵的標志位。
⑸ INT 40
可看作是INT 13的一個子集,它只提供軟盤的中斷例程,其調用接口與
INT13基本相同。
⑹ INT?。常? 鼠標服務例程。
INT33 AX=0003H
目的∶ 返回位置和按鈕狀態。
返回∶ BX=按鈕狀態
bit0:左按鈕按下;
bit1:右按扭按下;
bit2:中按扭按下;
CX=列坐標;
DX=行坐標。
⑺ INT?。玻? DOS編程的最主要的API,最好都有所了解。
INT21 AH=3D
目的∶ 打開文件(句柄方式)
入口參數∶AL∶訪問方式
DS∶DX 指向ASCIIZ文件名字符串。
INT21 AH=4B
目的∶ 執行程序(EXEC)
入口參數∶ AL--執行方式
ES∶BX--參數塊指針
DS∶DX--指向EXEC的結構指針,
其中的偏移04H∶指向程序名的
ASCIIZ字符
串
INT21 AH=4CH
目的∶ 帶返回碼的程序中止。
2) Assembler語言∶
我們都知道,匯編語言是直接與CPU對話的最低級的語言,也是我們在
解密過程中唯一可以看到的語言形式。因此對匯編語言程序設計的基本了解是解
密必不可少的基礎。
3)其它∶
由于本文意不在講述DOS編程,因此還有很多相關知識沒有列出,讀
者若有興趣深如研究DOS,不妨參考下列書籍∶
《深入DOS編程》--求伯君
《PC?。桑危裕牛遥遥眨校裕印罚alf Brown & Jim Kyle
《Advanced MS-DOS Programming》-- Ray Duncan
三、解密工具∶
“.工欲善其事,必先利其器",軟件解密的實現在很大程度上依賴于強
有力的工具軟件,下面介紹一下DOS下解密用的常見工具∶
1)DEBUG∶
雖說土了點,但DEBUG畢竟是各類工具程序的鼻祖,也是早期
解密者的唯一工具。不過,時至今日,DEBUG早已過時,除非要體會用石頭
和木棒作戰的辛苦,否則還是換一個先進點的調試器為好。
2)GAME BUSTER 4.0∶
我不用說大家也都明白了,GB4一向被游戲玩家視為工具經典,
其實它在解密場合也可派上用場。?。ㄔ斠姡嵗治觯ⅲ? 3)GAME TOOL?。常啊? Game Tool 亦為一個與Game Buster相仿的"游戲改命工具",但值得
一提的是它的新版本中帶了一個Internal Debug非常好使, 可在找到存命單元后
直接在上面設內存斷點,然后跟蹤追擊找到減命指令,從而把游戲改為"不死
版"。遺憾的是其內置 DEBUG目前還不支持A(匯編)指令,好在其漂亮的彩
色U(反匯編)指令算是對此做出了補償。
4) PCTOOLS/NORTON UTILITIES:
很多加密、解密的初學者似乎很喜歡用這兩種工具對公用機房的分區
表、子目錄做些手腳。其實這兩種工具的真正用途在與"數據修復"和"反病毒"等
等,用在解密過程中通常是作為程序的PATCH(修補)工具。
5)TURBO DEBUG
對BORLAND公司有感情的用戶對這個名字應該不會陌生,
TURBO DEBUG 在DOS的調試器里"界面"算是一流的,它的優點在于調
BORLAND系列的目標代碼,特別是調高級語言,用于調解密時的機器碼則顯得
不夠靈活。
6)Soft Ice for Dos:
如果說上面所述的各種調試器各有所長的話,那么NuMega
Technologies公司的Soft-Ice可謂是集調試器之大成者,它充分發揮了80386的
保護模式特性,例如分頁、I/O特權級、斷點寄存器........,來實現對程序的硬件
級動態調試,而不需額外的電路嵌入式仿真器(ICE),這也正是Soft Ice名字的由
來。 SOFT ICE 有命令行裝入和作為設備驅動程序裝入兩種裝入方式 ,利用后
者裝入時可以發揮其全部特性。
下面對 SOFT ICE 功能作簡要介紹∶
一般調試器只有一種中斷程序的方法,即在特定的代碼處設置斷點;有
的調試器(TURBO DEBUG)雖能用鍵盤把當前程序中斷,但由于優先級太低,常
常在想斷的時候斷不下來。而SOFT-ICE 是以虛擬機方式運行DOS,工作在
DOS之上,所以凡是DOS實模式的程序幾乎沒有斷不下來的。
SOFT ICE 支持DEBUG的所有命(除N、L、W)外, 而且提供了功能
強大的斷點命令∶
⑴BPM:
語法∶ BPM [size] address
size:B、W、D分別代表Byte,Word,Double Word
功能 ∶ 在指定內存處設讀、寫斷點
舉例∶ bpm ds:1234 (ds=2000)
當地址2000∶1234處的BYTE被、寫時激活斷點。
⑵ BPR:
語法∶ BPR start-address end-address [verb]
verb: R,W,RW,T,TW (R、W代表讀、寫;T代表跟蹤)
功能∶ 設內存范圍斷點,利用其中的T或TW選項可以實現"逆指令流"
跟蹤的高級調試方法。
⑶?。拢校桑希? 語法∶BPIO port
功能∶在I、O端口上設斷點。
舉例∶BPIO 378 在端口378H設斷點。
這條在解軟件狗、加密卡等利用外設加密的軟件時非常有用,如果
在高級操作(DOS、BIOS調用)中沒有發現程序的加密方法,可以通過設I/O斷
點來進行更深入的考察。
⑷ BPINT
語法∶BPINT int-number [<AL|AH|AX>=value]
功能∶在中斷上設斷點。
距例∶ BPINT 13 AX=0201 當對BIOS的13號中斷得功能02(讀盤)發出
調用時激活斷點;
BPINT 21 AH=3D 當用INT21H打開文件時激活斷點。
此命令是最常用的斷點命令,用于在某一中斷號上設斷點,有與DOS編程
要頻繁地調用DOS、BIOS中斷,因此對中斷進行監視,就可對程序的來龍去
脈有一個大至的把握。
⑸ 其它命令∶
EXIT:用于強迫從當前DOS程序退出。
VECS∶顯示中斷向量列表。
MAP∶查看DOS的內存圖(MCB鏈)
? 或 H∶聯機幫助,對其它諸多命令,可以通過幫助了解其用法。
DOS下軟件解淺談 (二)
| 清華大學 計算機科學與技術系 何開川
| EMAIL:hyj-dmp@mail.tsinghua.edu.cn
四、解密?。健「櫋??
如果要用兩個字概括解密的實質的話,那就是∶跟蹤;是的,就是跟蹤。
我們在調試一般程序的時候也需要跟蹤,但兩者的目的是不盡相同的。后者是為
了排錯、而前者是為了窺探,具體地說,就是找出程序在哪兒加的密、如何加的,
從而找到"修改點",以便將其改為解密版。
先介紹解密的幾條思路∶
?。保念^至尾式∶
拿到一個軟件,從第一條指令開始,逐條跟蹤,直至找到"修改
點",這就是最基本的解密方法。但要注意,跟蹤過程中應采?。⑾却趾蠹?,偶
而回溯"的方針。比如下面一段程序∶
* * *
Initialize
|
?。? Call Module1
|
V
Call Module2-->Call Module3
| |
V V
... Call Module4 -> Call Module 5
|
|
V
檢查Password Or ax,ax
我們要找的修改點 ======> jz 游戲入口
jnz 顯示"Password" 不對
...
* * *
我們要找的"修改點"藏在Module 4里面,如果我們從Module1開始一條一條
跟的話,恐怕要看幾千條指令,但如果我們按"先粗后細"的原則,先用P 命令,
即Step方式跟蹤,當發現Step過Module2時,游戲已檢查過Password,說明跟"過"
了,于是用"偶而回溯"策略,從新執行程序,這次跟入Module2, 再用P粗
線條跟蹤,發現Step過Module4后又錯過了"修改點",于是返回頭來跟入Module4,
這次終于發現在一處由 Or ax,ax / jz XXXX 產生的分支與程序是否"認
為"Password正確直接相關,不妨試著把jz XXXX改為jmp XXXX--成功了,
游戲已正常進入主畫面。這說明我們找到了"修改點",解密的主要工作也就完成
了,關于如何把這一修改"固化"下來,參見后文。
2)中途攔截式∶
抗日影片《鐵道游擊隊》中,機警勇敢的游擊隊戰士在同日寇交鋒時常
常不是正面進攻,而是早早地埋伏在鐵路旁,等敵人的火車經過時,給它來個"
中途攔截",從而達到出其不意的制勝效果。 在軟件解密的過程中亦有同樣的戰
術∶拿到一個軟件后,先不忙著從頭跟起,而是考慮一下,有沒有辦法跳過程序
的初始化部分,直接切入程序判斷密鑰的"關鍵點"或是"關鍵點"附近的部分。若
是存在這樣的捷徑,就可省去不少跟蹤之苦。
這里,僅以解拆游戲PASSWORD為例。讓我們思考這樣一個問題∶程
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -