由于TRW2000命令和操作完全兼容SoftICE,因此如不特殊說明,在本文對SoftICE的敘說都適合TRW2000。
SoftICE的所有操作都發(fā)生在一個可以隨時(shí)可激活的調(diào)試窗口中,在這個窗口中可以監(jiān)視Windows應(yīng)用程序和系統(tǒng)的運(yùn)行。
一、 調(diào)試窗口簡介
我們假設(shè)你的SoftICE己經(jīng)正常運(yùn)行,此時(shí)在Windows里按"Ctrl+D"鍵就可以呼出SoftICE的調(diào)試窗口,當(dāng)需要返回到Windows系統(tǒng)時(shí),再按"Ctrl+D"鍵,也可使用X命令或按F5鍵。激活的調(diào)試窗口如圖2.14所示,分為寄存器窗口、數(shù)據(jù)窗口、代碼窗口、浮點(diǎn)窗口和命令窗口等部分。
如是在TRW2000環(huán)境下,激活是按"CTRL+N",和SoftICE不同的是TRW2000中沒有浮點(diǎn)窗口,不過有一個堆棧窗口。
(圖一)SoftICE或TRW2000調(diào)試截圖
1、寄存器窗口
在這里可以觀察到各種寄存器的當(dāng)前值,如數(shù)據(jù)寄存器EAX、EBX、ECX、EDX和控制寄存器(EIP和PSW)等,有一點(diǎn)要注意了,由于我們是在Windows平臺下,所以看到的都是80386寄存器集,其與16位寄存器差別在前多了一字符"E",意為16位寄存器擴(kuò)展。
2、數(shù)據(jù)窗口
在數(shù)據(jù)窗口顯示指定內(nèi)存處中的數(shù)據(jù),以十六進(jìn)制和ASCII同時(shí)顯示,這可以說是我們的眼睛,因此有必要了解一下各部分的含義。
(圖二)
①號位置的0030:這是段選擇器。
在Windows的保護(hù)模式下CS、DS、ES、SS、FS和GS不叫段寄存器,叫段選擇器。在保護(hù)模式中,內(nèi)存分為了好多的段,在TRW200下用GDT就可以看到段的編號、類型、開始物理地址、大小、屬性。讓我們看看編號0030是什么東西:
(圖三)
這個段是32位數(shù)據(jù)類型,長度為4G ,我們還可以看到很多的段,它們有可能會指向同一個物理地址,但它們的類型,屬性可能不同。如一些段指向的地址是不可讀寫的,但另外一個段指向的同一物理地址是可讀寫的!如果我們通過不可寫的那段的編號放到段選擇器,然后進(jìn)行讀寫操作,肯定死掉了。 但換了另外一個段對同一個地方讀寫那就沒問題!保護(hù)模式的內(nèi)存管理挺有趣的,感興趣的不妨看看這方面的書,當(dāng)然作為初學(xué)者只需稍微了解就可。
②號位置00000000:此處表示內(nèi)存的虛擬地址。
③號位置的值是當(dāng)前內(nèi)存的數(shù)據(jù),以十六進(jìn)制表示。
④號位置的值是"③"處值的另一種表示方法:ASCII碼。
3、代碼窗口
此處顯示的是當(dāng)前程序的代碼,因?yàn)椴还苁鞘裁闯绦颍罱K在CPU執(zhí)行時(shí)都是以機(jī)器語言方式,而匯編語言和機(jī)器語言是一一對應(yīng)的,因此SoftICE為了方便我們理解,把所監(jiān)視的代碼以匯編代碼形式顯示在我們面前。例如:
(圖四)
①段選擇器;
②虛擬地址;
③機(jī)器碼:這就是CPU執(zhí)行的機(jī)器代碼,此處是以十六進(jìn)制表示。你可用Code on/off打開或關(guān)閉這項(xiàng)的顯示。
④匯編指令:和機(jī)器碼對應(yīng)的程序代碼。
4、堆棧窗口
這個是TRW2000特有的,通過它很方便監(jiān)視堆棧的狀況。
5、命令窗口
這是各種命令執(zhí)行的地方,在屏幕底部的動作狀態(tài)行顯示執(zhí)行命令的各種提示,以及可提供指令語法幫助。
6、程序領(lǐng)空
所謂領(lǐng)空,實(shí)際上是指:在某一時(shí)刻,CPU 的 CS:IP(EIP) 所指向的某一段代碼的所有者所在的區(qū)域。此例中SoftICE所停下來時(shí)光標(biāo)所指的那一句代碼是屬于KERNEL32.DLL的,因此就叫KERNEL32.DLL領(lǐng)空,在圖2.14中,可看到的領(lǐng)空名是KERNEL32!.text,那我怎么知道它就是KERNEL32.DLL文件呢?這個主要是經(jīng)驗(yàn),KERNEL32.DLL是Windows系統(tǒng)文件,在SoftICE里顯示領(lǐng)空名時(shí)不顯示擴(kuò)展名,只是顯示前一部份。
二、SoftICE常用命令簡介
由于SoftICE命令操作較多,在此就把幾個常用的命令介紹一下,其它詳細(xì)說明請參考附錄的"SoftICE手冊"。
1、 G命令
語法:G [=start-address] [break-address]
作用:執(zhí)行程序,后面如果加地址,則執(zhí)行到該地址為止。
注意: TRW2000 中G命令與SoftICE稍有不同,SoftICE中G命令必須是在當(dāng)前段中,這時(shí)IP(EIP)為指定值才中斷;而TRW2000則不管段址如何,只要IP(EIP)是指定的值便停下,TRW2000這個特性大大方便我們的操作。
2、P命令
語法: P [ret]
作用:單步執(zhí)行程序。
只執(zhí)行P時(shí),相當(dāng)于按下F10鍵。在匯編模式中,當(dāng)遇到 CALL、INT、LOOP、REP指令時(shí),P將不跟蹤進(jìn)去,直到這些指令執(zhí)行完畢,控制才返回SoftICE,換句話說,P命令是"跨"過這些指令的。
P RET 命令相當(dāng)于快捷鍵 F12。SoftICE將一直單步執(zhí)行直到它找到一條返回語句(RET、RETF),也就是說讓SoftICE一直執(zhí)行代碼,直到出現(xiàn) RET (XXXX) 命令,再跳出來攔截,這時(shí),當(dāng)前 IP(EIP) 會是停在 RET (XXXX) 后的某一條語句上,通常是在某一個CALL XXXXXXXX 后面。由于我們通常用SoftICE在某些底層的Windows函數(shù)上設(shè)置斷點(diǎn),所以 F12 是很管用的。因?yàn)槌绦虻淖髡哂玫氖歉呒壵Z言,Windows又是提倡"透明",不希望程序員知道底層的操作,而只提供給他們高層的接口,而相當(dāng)多的高級函數(shù)調(diào)用某個一定的底層函數(shù),所以當(dāng)你在底層函數(shù)上下斷點(diǎn),再用F12,就可以知道他用的是什么函數(shù)了。
3、T命令
語法:T [=start-address] [count]
start-address:執(zhí)行起始地址;
count:指定SoftICE將單步跟蹤多少次才停止。
作用:單步跟蹤。
T命令相當(dāng)于功能鍵F8,如沒指定起始地址,將從CS:IP(EIP)指向的指令開始執(zhí)行,此時(shí)當(dāng)遇到 CALL、LOOP等指令時(shí),T將跟蹤進(jìn)去。
注意: F8和F10功能鍵的主要差別就在這,遇到 CALL、LOOP等指令時(shí),F(xiàn)10是路過,而F8是跟進(jìn)去。
4、BPX命令
語法:BPX [address] [IF expression] [DO "command1;command2;..."]
address :斷點(diǎn)所在的線性地址;
IF expression:條件表達(dá)式,只有條件為"真"時(shí),SoftICE才在斷點(diǎn)處彈出;
Do command:當(dāng)SoftICE彈出時(shí),自動執(zhí)行的一些命令。
作用:在可執(zhí)行語句上設(shè)置(或清除)斷點(diǎn)。
BPX 用來在指令處下斷點(diǎn),程序一旦執(zhí)行到此,SoftICE就會彈出。當(dāng)光標(biāo)在代碼窗口中時(shí),直接打入BPX就會在光標(biāo)所在語句處設(shè)斷點(diǎn),再打BPX 就取消。BPX的快捷鍵是 F9,當(dāng)光標(biāo)在代碼窗口中時(shí),按F9就是設(shè)定(取消)。
BPX 也可用函數(shù)名來作地址參數(shù):格式為"BPX 函數(shù)名"。
這個函數(shù)名可以是任意一個API函數(shù)、虛擬機(jī)指令、DLL文件的引出函數(shù)等等,功能強(qiáng)勁。例:
:bpx messageboxa(不用區(qū)分大小寫)//只要程序調(diào)用了此函數(shù),SoftICE將中斷;
:bpx GetWindowTexta if EAX==8 // 當(dāng)調(diào)用GetWindowTexta函數(shù)時(shí)EAX=8,SoftICE將中斷;
:BPX GetWindowTexta do "d EAX"http:// 當(dāng) GetWindowTexta被中斷,自動顯示EAX的值。
注意: TRW2000與SoftICE條件格式有點(diǎn)不同,如在SoftICE下的是:bpx loadlibrarya do "dd esp->4",而相同的用法在TRW2000中是:bpx loadlibrarya do "dd *(esp+4)" 。另外SoftICE中用鼠標(biāo)雙擊指令行可設(shè)斷,而TRW2000中不行,只能按F9.
5、BPM命令
語法:BPM[size] address [條件表達(dá)式] DO[執(zhí)行的命令]
size:內(nèi)存單元大小,B為字節(jié)(默認(rèn));W 為字;D 為雙字;
verb:所進(jìn)行的操作,R為讀;W為寫;RW為讀寫(默認(rèn));X 為執(zhí)行。
作用:設(shè)置內(nèi)存訪問斷點(diǎn)。
注意: BPM用了DR3-DR0寄存器,所以最多只能設(shè)四個斷點(diǎn)。
6、BMSG命令
語法:BMSG window-handle [條件表達(dá)式] DO[執(zhí)行的命令]
window-handle:消息發(fā)向的窗口句柄,即消息名
作用:在Windows的消息上下斷點(diǎn)。
Windows本身是由消息驅(qū)動的 所以跟蹤一個消息會得到相當(dāng)?shù)讓拥拇鸢浮H纾?br/>我們執(zhí)行記事本程序(Notepad),然后Ctrl+D激活SoftICE輸入:
:bmsg wm_char
:g
然后回到Notepad中,隨便按一個鍵,SoftICE就激活了;原因在于我們在按鍵消息上設(shè)置了斷點(diǎn)(退出SoftICE別忘下命令"BC *"清除剛才下的斷點(diǎn))。
7、BL命令
語法:BL
作用:顯示當(dāng)前所設(shè)的斷點(diǎn)
注意: SoftICE會把所有斷點(diǎn)按從0開始的編號列出,而TRW2000是從1開始編號列出。
8、BC命令
語法:BC list | *
list:可以清除指定編號的斷點(diǎn)多個時(shí)中間用空格或逗號隔開。
* :清除所有的斷點(diǎn)。
作用:清除一個或多個斷點(diǎn)
9、BD命令
語法: BD list | *
list:可以是單個,也可以是一系列斷點(diǎn),中間用空格或逗號隔開。
* :禁止所有的斷點(diǎn)
作用:使一個或多個斷點(diǎn)失效。
10、BE命令
語法:BE list | *
作用:使一個或多個斷點(diǎn)恢復(fù)有效。
用來恢復(fù)前次用 BD 命令使之失效的斷點(diǎn)。 (每當(dāng)新定義斷點(diǎn)或編輯斷點(diǎn)時(shí)系統(tǒng)自動將其置為有效)
11、BPE命令
語法:BPE index_number(斷點(diǎn)索引號)
作用:編輯一個已存在的斷點(diǎn)。
12、R命令
語法:R 寄存器名
作用:顯示或更改寄存器的內(nèi)容。
其可更改所有的寄存器的值。此命令較常用的一個功能是更改狀態(tài)寄存器(PSW )的值,格式:R FL 標(biāo)志位。比如當(dāng)前 Z標(biāo)志位(零位)為置位狀態(tài),執(zhí)行"r fl z"之后會被清除;如果C標(biāo)志位為清除狀態(tài),那么"r fl c"將使之置位。
注意: 利用此命令很方便在一些跳轉(zhuǎn)指令上改變方向。
13、A命令
語法:A [地址]
作用:進(jìn)入小匯編狀態(tài),可直接寫入?yún)R編代碼。
如不加地址值,直接在當(dāng)前CS:IP(EIP)處匯編。用SoftICE內(nèi)置的匯編器在內(nèi)存中寫入?yún)R編代碼。匯編器支持標(biāo)準(zhǔn)的80x86指令集,包括386、486、Pentium、Pentium-Pro、MMX協(xié)處理器,新版的SoftICE還支持AMD的3D Now!、PII、PIII的特有指令集。
14、D命令
語法:D[size] [address [l length]]
size:B 字節(jié);W 字;D 雙字; S 短實(shí)型;L 長實(shí)型;T 10b長實(shí)型
作用:顯示某內(nèi)存區(qū)域的內(nèi)容。
15、S命令
語法:S [-cu][address L length data-list]
address:搜索的起始地址
length :搜索的長度(字節(jié)長)
data-lis:可以是一系列字節(jié),也可以是字符串,字符串可以用單引號,也
可以用雙引號括住.
-c :使查找區(qū)分大小寫
-u :查找Unicode 編碼的字符串.
作用:在內(nèi)存中搜尋特定數(shù)據(jù),如果找到數(shù)據(jù),那將在數(shù)據(jù)窗口中顯示出來,如果在找到后,你還要繼續(xù)查找,使用不帶參數(shù)的S命令。由于S命令忽略不在內(nèi)存中的頁面,因此你可以使用32位平面地址數(shù)據(jù)段描述符30h在整個4GB(0~FFFFFFFFh )空間查找。如:
s 30:0 l FFFFFFFF "78787878" //在此令在內(nèi)存中查找字串"78787878"位置。
注意: TRW2000中S命令的字串應(yīng)是單引號(而SoftICE皆可)。如:s 30:0 l FFFFFFFF '78787878'.
16、E命令
語法:E[size] [address [data-list]]
作用: 修改內(nèi)存單元
17、U命令
語法:U [address [l length]] | [symbol-name]
address :段:偏移量或選擇符:偏移量
symbol-name:將從指定的函數(shù)開始反匯編
length :反匯編的長度(字節(jié))
作用: 反匯編指令
你可以利用此命令抓取匯編代碼,運(yùn)行LOADER32后,將歷史緩沖區(qū)(history buffer)調(diào)大些(默認(rèn)為256,不能放足夠多的緩沖數(shù)據(jù))。然后切換到SoftICE調(diào)試畫面下,來到你要抓取的地方,反匯編這些代碼,如:U CS:EIP L 1000 ,立即按Ctrl+D返回到Windows環(huán)境,再次來到symbol loader程序,選擇"File/Save SoftICE History As…"。
注意: 在TRW2000下可以直接反匯編代碼輸出到一個文件:
u 401000402000 >路徑/myfile。
18、FAULTS命令
語法:FAULTS [on | off]
作用:打開或關(guān)閉錯誤跟蹤功能
由于SoftICE做為一個DEBUGGER,F(xiàn)AULTS 默認(rèn)為ON,所以一旦CPU有非法指令,SoftICE就會不停地彈出。
19、?命令
語法:? 表達(dá)式
作用:計(jì)算一個表達(dá)式的值
一個非常高級的計(jì)算器,另外由于可以顯示ASCII所以可以很方便地在各種數(shù)制之間察看。
20、.命令
語法: .
作用:在代碼窗口中定位當(dāng)前指令
當(dāng)你在代碼窗口中上下瀏覽時(shí),有可能走得很遠(yuǎn),那么這時(shí)一個"."命令會讓你在下一瞬間回到SoftICE當(dāng)前所在的CS:EIP處。
21、EXP命令
語法: EXP [函數(shù)名]
作用: 顯示DLL中的出口函數(shù)
函數(shù)名可以指定出其前幾個字符 可以用?來做替代不定字符,這樣你就可查找相關(guān)函數(shù)及其是哪個DLL文件了。這對于你在Win2K系統(tǒng)上非常實(shí)用,Win2K系統(tǒng)的KERNEL32.DLL中許多函數(shù)形式和Windows 9x可能不同,用此命令你就可找到正確的函數(shù)名了。
22、PMODULE命令(TRW2000特有命令)
作用:'pret'(相當(dāng)于按<F12>) 直至CS:EIP位于模塊中,但比F12更實(shí)用,其可以快速回到你的當(dāng)前程序領(lǐng)空,不用按多次F12了
23、SUSPEND命令(TRW2000特有命令)
作用: 暫停當(dāng)前的線程,并退出 TRW2000,按熱鍵返回,此命令相當(dāng)方便。
24、ver blue命令(TRW2000特有命令)
如你的TRW2000背景顏色很暗,可通過此命令來調(diào)整背景
新聞熱點(diǎn)
疑難解答
圖片精選