第3章 動(dòng)態(tài)分析技術(shù)
第二節(jié) SoftICE與TRW2000操作入門(mén)
由于TRW2000命令和操作完全兼容SoftICE,因此如不特殊說(shuō)明,在本文對(duì)SoftICE的敘說(shuō)都適合TRW2000。 SoftICE的所有操作都發(fā)生在一個(gè)可以隨時(shí)可激活的調(diào)試窗口中,在這個(gè)窗口中可以監(jiān)視Windows應(yīng)用程序和系統(tǒng)的運(yùn)行。 一、 調(diào)試窗口簡(jiǎn)介
我們假設(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中沒(méi)有浮點(diǎn)窗口,不過(guò)有一個(gè)堆棧窗口。

(圖一)SoftICE或TRW2000調(diào)試截圖
1、寄存器窗口 在這里可以觀察到各種寄存器的當(dāng)前值,如數(shù)據(jù)寄存器EAX、EBX、ECX、EDX和控制寄存器(EIP和PSW)等,
有一點(diǎn)要注意了,由于我們是在Windows平臺(tái)下,所以看到的都是80386寄存器集,其與16位寄存器差別在前多了一字符"E",意為16位寄存器擴(kuò)
展。 2、數(shù)據(jù)窗口 在數(shù)據(jù)窗口顯示指定內(nèi)存處中的數(shù)據(jù),以十六進(jìn)制和ASCII同時(shí)顯示,這可以說(shuō)是我們的眼睛,因此有必要了解一下各部分的含義。

(圖二)
①號(hào)位置的0030:這是段選擇器。 在Windows的保護(hù)模式下CS、DS、ES、SS、FS和GS不叫段寄存器,叫段選擇器。在保護(hù)模式中,內(nèi)存分為了好多的段,在TRW200下用GDT就可以看到段的編號(hào)、類(lèi)型、開(kāi)始物理地址、大小、屬性。讓我們看看編號(hào)0030是什么東西:

(圖三)
這個(gè)段是32位數(shù)據(jù)類(lèi)型,長(zhǎng)度為4G
,我們還可以看到很多的段,它們有可能會(huì)指向同一個(gè)物理地址,但它們的類(lèi)型,屬性可能不同。如一些段指向的地址是不可讀寫(xiě)的,但另外一個(gè)段指向的同一物理
地址是可讀寫(xiě)的!如果我們通過(guò)不可寫(xiě)的那段的編號(hào)放到段選擇器,然后進(jìn)行讀寫(xiě)操作,肯定死掉了。
但換了另外一個(gè)段對(duì)同一個(gè)地方讀寫(xiě)那就沒(méi)問(wèn)題!保護(hù)模式的內(nèi)存管理挺有趣的,感興趣的不妨看看這方面的書(shū),當(dāng)然作為初學(xué)者只需稍微了解就可。 ②號(hào)位置00000000:此處表示內(nèi)存的虛擬地址。 ③號(hào)位置的值是當(dāng)前內(nèi)存的數(shù)據(jù),以十六進(jìn)制表示。 ④號(hào)位置的值是"③"處值的另一種表示方法:ASCII碼。 3、代碼窗口 此處顯示的是當(dāng)前程序的代碼,因?yàn)椴还苁鞘裁闯绦,最終在CPU執(zhí)行時(shí)都是以機(jī)器語(yǔ)言方式,而匯編語(yǔ)言和機(jī)器語(yǔ)言是一一對(duì)應(yīng)的,因此SoftICE為了方便我們理解,把所監(jiān)視的代碼以匯編代碼形式顯示在我們面前。例如:

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