版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
/OllyDbg完全教程目錄TOC\o"1-2"\h\u32467第一章概述 111331第二章組件 55368一、一般原理[Generalprnciples] 524128二、反匯編器[Disassembler] 813536三、分析器[Analysis] 99090四、Object掃描器[Objectscanner] 128772五、Implib掃描器[Implibscanner] 128056第三章OllyDbg的使用 1328449一、如何開始調(diào)試[Howtostartdebuggingsession] 1320296二、CPU窗口[CPUwindow] 144765三、斷點[Breakpoints] 1427059四、數(shù)據(jù)窗口[Dump] 1523516五、可執(zhí)行模塊窗口[Executablemoduleswindow] 1620239六、內(nèi)存映射窗口[Memorymapwindow] 1718588七、監(jiān)視與監(jiān)察器[Watchesandinspectors] 194599八、線程[Threads] 1917810九、調(diào)用棧[Callstack] 209896十、調(diào)用樹[Calltree] 2120197十一、選項[Options] 2130245十二、搜索[Search] 2222833十三、自解壓文件[Self—extracting(SFX)files] 2215253十四、單步執(zhí)行與自動執(zhí)行[Step—by—stepexecutionandanimation] 2328670十五、Hit跟蹤[Hittrace] 231403十六、Run跟蹤[Runtrace] 247307十七、快捷鍵 2616819十八、插件[Plugins] 2997十九、技巧提示[Tipsandtricks] 2912892第四章其他功能 3010503一、調(diào)試獨立的DLL[Debuggingofstand—aloneDLLs] 3023324二、解碼提示[Decodinghints] 323791三、表達式賦值[Evaluationofexpressions] 3212628四、自定義函數(shù)描述[Customfunctiondescriptions] 34
第一章概述OllyDbg是一種具有可視化界面的32位匯編—分析調(diào)試器。它的特別之處在于可以在沒有源代碼時解決問題,并且可以處理其它編譯器無法解決的難題。Version1.10是最終的發(fā)布版本。這個工程已經(jīng)停止,我不再繼續(xù)支持這個軟件了。但不用擔(dān)心:全新打造的OllyDbg2.00不久就會面世!運行環(huán)境:OllyDbg可以以在任何采用奔騰處理器的Windows95、98、ME、NT或是XP(未經(jīng)完全測試)操作系統(tǒng)中工作,但我們強烈建議你采用300—MHz以上的奔騰處理器以達到最佳效果。還有,OllyDbg是極占內(nèi)存的,因此如果你需要使用諸如追蹤調(diào)試[Trace]之類的擴展功能話,建議你最好使用128MB以上的內(nèi)存。支持的處理器:OllyDbg支持所有80x86、奔騰、MMX、3DNOW!、Athlon擴展指令集、SSE指令集以和相關(guān)的數(shù)據(jù)格式,但是不支持SSE2指令集。配置:有多達百余個選項用來設(shè)置OllyDbg的外觀和運行。數(shù)據(jù)格式:OllyDbg的數(shù)據(jù)窗口能夠顯示的所有數(shù)據(jù)格式:HEX、ASCII、UNICODE、16/32位有/無符號/HEX整數(shù)、32/64/80位浮點數(shù)、地址、反匯編(MASM、IDEAL或是HLA)、PE文件頭或線程數(shù)據(jù)塊。幫助:此文件中包含了關(guān)于理解和使用OllyDbg的必要的信息。如果你還有WindowsAPI幫助文件的話(由于版權(quán)的問題win32.hlp沒有包括在內(nèi)),你可以將它掛在OllyDbg中,這樣就可以快速獲得系統(tǒng)函數(shù)的相關(guān)幫助。啟動:你可以采用命令行的形式指定可執(zhí)行文件、也可以從菜單中選擇,或直接拖放到OllyDbg中,或者重新啟動上一個被調(diào)試程序,或是掛接[Attach]一個正在運行的程序。OllyDbg支持即時調(diào)試。OllyDbg根本不需要安裝,可直接在軟盤中運行!調(diào)試DLLs:你可以利用OllyDbg調(diào)試標(biāo)準(zhǔn)動態(tài)鏈接庫(DLLs)。OllyDbg會自動運行一個可執(zhí)行程序。這個程序會加載鏈接庫,并允許你調(diào)用鏈接庫的輸出函數(shù)。源碼級調(diào)試:OllyDbg可以識別所有Borland和Microsoft格式的調(diào)試信息。這些信息包括源代碼、函數(shù)名、標(biāo)簽、全局變量、靜態(tài)變量。有限度的支持動態(tài)(棧)變量和結(jié)構(gòu)。代碼高亮:OllyDbg的反匯編器可以高亮不同類型的指令(如:跳轉(zhuǎn)、條件跳轉(zhuǎn)、入棧、出棧、調(diào)用、返回、特殊的或是無效的指令)和不同的操作數(shù)(常規(guī)[general]、FPU/SSE、段/系統(tǒng)寄存器、在棧或內(nèi)存中的操作數(shù),常量)。你可以定制個性化高亮方案。線程:OllyDbg可以調(diào)試多線程程序。因此你可以在多個線程之間轉(zhuǎn)換,掛起、恢復(fù)、終止線程或是改變線程優(yōu)先級。并且線程窗口將會顯示每個線程的錯誤(就像調(diào)用GETLASTERROR返回一樣)。分析:OllyDbg的最大特點之一就是分析。它會分析函數(shù)過程、循環(huán)語句、選擇語句、表[tables]、常量、代碼中的字符串、欺騙性指令[trickyconstructs]、API調(diào)用、函數(shù)中參數(shù)的數(shù)目,import表等等。這些分析增加了二進制代碼的可讀性,減少了出錯的可能性,使得我們的調(diào)試工作更加容易。Object掃描:OllyDbg可以掃描Object文件/庫(包括OMF和COFF格式),解壓代碼段[codesegments]并且對其位置進行定向。Implib掃描:由于一些DLL文件的輸出函數(shù)使用的索引號,對于人來說,這些索引號沒有實際含義。如果你有與DLL相應(yīng)的輸入庫[importlibrary],OllyDbg就可以將序號轉(zhuǎn)換成符號名稱。完全支持Unicode:幾乎所有支持ASCII的操作同時也支持UNICODE,反之亦然。名稱:OllyDbg可以根據(jù)Borland和Microsoft格式的調(diào)試信息,顯示輸入/輸出符號和名稱。Object掃描器可以識別庫函數(shù)。其中的名稱和注釋你可任意添加。如果DLL中的某些函數(shù)是通過索引號輸出的,則你可通過掛接輸入庫[importlibrary]來恢復(fù)原來的函數(shù)名稱。不僅如此,OllyDbg還能識別大量的常量符號名(如:窗口消息、錯誤代碼、位域[bitfields]…)并能夠解碼為已知的函數(shù)調(diào)用。已知函數(shù):OllyDbg可以識別2300多個C和WindowsAPI中的常用函數(shù)和其使用的參數(shù)。你可以添加描述信息、預(yù)定義解碼。你還可以在已知函數(shù)設(shè)定Log斷點并可以對參數(shù)進行記錄。函數(shù)調(diào)用:OllyDbg可以在沒有調(diào)試信息或函數(shù)過程使用非標(biāo)準(zhǔn)的開始部分[prolog]和結(jié)尾部分[epilog]的情況下,對遞歸調(diào)用進行回溯。譯者注:004010D0pushebp\004010D1movebp,esp |004010D3subesp,10h |>prolog004010D6pushebx |004010D7pushesi |004010D8pushedi /……004010C5popedi \004010C6popesi |004010C7popebx |>epilog004010C8movesp,ebp |004010CApopebp |004010CBret /棧:在棧窗口中,OllyDbg能智能識別返回地址和??蚣埽跾tackFrames]。并會留下一些先前的調(diào)用。如果程序停在已知函數(shù)上,堆棧窗口將會對其參數(shù)進行分析解碼。譯者注:??蚣埽跾tackFrames]是指一個內(nèi)存區(qū)域,用于存放函數(shù)參數(shù)和局部變量。SEH鏈:跟蹤棧并顯示結(jié)構(gòu)化異常句柄鏈。全部鏈會顯示在一個單獨的窗口中。搜索:方法真是太多了!可精確、模糊搜索命令或命令序列,搜索常數(shù),搜索二進制、文本字符串,搜索全部命令地址,搜索全部常量或地址域[addressrange],搜索所有能跳到選定地址的跳轉(zhuǎn),搜索所有調(diào)用和被調(diào)用的函數(shù),搜索所有參考字符串,在不同模塊中搜索所有調(diào)用、搜索函數(shù)名稱,在全部已分配的內(nèi)存中搜索二進制序列。如果搜索到多個結(jié)果,你可以對其進行快速操作。窗口:OllyDbg能夠列出關(guān)于調(diào)試程序中的各種窗口,并且可以在窗口、類甚至選定的消息上設(shè)置斷點。資源:如果WindowsAPI函數(shù)使用了參考資源串,OllyDbg可以顯示它。其支持顯示的類型僅限于附帶資源[attachedresources]的列表、數(shù)據(jù)顯示和二進制編輯。斷點:OllyDbg支持各種斷點:一般斷點、條件斷點、記錄斷點(比如記錄函數(shù)參數(shù)到記錄窗口)、內(nèi)存讀寫斷點、硬件斷點(只適用于ME/NT/2000)等。在Hit跟蹤情況下,可以在模塊的每條命令上都設(shè)置INT3斷點。在使用500—MHZ處理器的WindowsNT中,OllyDbg每秒可以處理高達5000個中斷。監(jiān)視與監(jiān)察器:每個監(jiān)視都是一個表達式并能實時顯示表達式的值。你可以使用寄存器、常數(shù)、地址表達式、布爾值以和任何復(fù)雜代數(shù)運算,你還可以比較ASCII和UNICODE字符串。監(jiān)察器[inspectors]是一種包含了兩個的索引序列的監(jiān)視[Watches],它以二維表的形式呈現(xiàn),可以對數(shù)組和結(jié)構(gòu)進行解碼分析。Heapwalk.:在基于Win95的系統(tǒng)中,OllyDbg可以列出所有的已分配的堆。句柄:在基于NT的系統(tǒng)中,OllyDbg可列出被調(diào)試程序的所有系統(tǒng)句柄。執(zhí)行:.你可以單步執(zhí)行、步入子程序或者步過子程序。你也可以執(zhí)行程序直到函數(shù)返回時、執(zhí)行到指定地址處,還可以自動執(zhí)行。當(dāng)程序運行時,你仍然可以操縱程序并能夠查看內(nèi)存、設(shè)置斷點甚至修改代碼。你也可以任意的暫?;蛑貑⒈徽{(diào)試的程序。Hit跟蹤:.Hit跟蹤可以顯示出目前已執(zhí)行的指令或函數(shù)過程,幫助你檢驗代碼的各個分支。Hit跟蹤會在指定指令到達之前設(shè)置斷點,而在這個指令執(zhí)行后,會把這個斷點清除掉。譯者注:Hit在英文中是“擊中”的意思,指令如果運行了就表示這個指令被“擊中”了,沒有執(zhí)行的指令就是“未擊中”,這樣我們就很容易看出被調(diào)試程序哪些部分運行了,而哪些沒有運行。Run跟蹤:Run跟蹤可以單步執(zhí)行程序,它會在一個很大的循環(huán)緩沖區(qū)中模擬運行程序。這個模擬器包含了除了SSE指令集以外的所以寄存器、標(biāo)志、線程錯誤、消息、已經(jīng)函數(shù)的參數(shù)。你可以保存命令,這樣可以非常方便地調(diào)試自修改代碼(譯者注:比如加殼程序)。你可以設(shè)置條件中斷,條件包括地址范圍、表達式、命令。你可以將Run跟蹤信息保存到一個文件中,這樣就可以對比兩次運行的差別。Run跟蹤可以回溯分析已執(zhí)行過的上百萬條命令的各種細節(jié)。統(tǒng)計:統(tǒng)計[Profiler]可以在跟蹤時計算某些指令出現(xiàn)的次數(shù)。因此你就能了解代碼的哪一部分被頻繁執(zhí)行。補丁:內(nèi)置匯編器能夠自動找到修改過的代碼段。二進制編輯器則會以ASCII、UNICODE或者十六進制的形式同步顯示修改后的數(shù)據(jù)。修改后的數(shù)據(jù)同其它數(shù)據(jù)一樣,能夠進行復(fù)制—粘貼操作。原來的數(shù)據(jù)會自動備份,以便數(shù)據(jù)恢復(fù)時使用。你可以把修改的部分直接復(fù)制到執(zhí)行文件中,OllyDbg會自動修正。OllyDbg還會記錄以前調(diào)試過程中使用的所有補丁。你可以通過空格鍵實現(xiàn)補丁的激活或者禁止。自解壓文件:當(dāng)調(diào)試自解壓文件時,你往往希望跳過解壓部分,直接停在程序的原始入口點。OllyDbg的自解壓跟蹤將會使你實現(xiàn)這一目的。如果是加保護的自解壓段,自解壓跟蹤往往會失敗。而一旦OllyDbg找到了入口點,它將會跳過解壓部分,并準(zhǔn)確的到達入口點。插件:你可以把自己的插件添加到OllyDbg中,以增加新的功能。OllyDbg的插件能夠訪問幾乎所有重要的數(shù)據(jù)的結(jié)構(gòu)、能夠在OllyDbg的窗口中添加菜單和快捷鍵,能夠使用100個以上的插件API函數(shù)。插件API函數(shù)有詳細的說明文檔。默認安裝已經(jīng)包含了兩個插件:命令行插件和書簽插件。UDD:OllyDbg把所有程序或模塊相關(guān)的信息保存至單獨的文件中,并在模塊重新加載時繼續(xù)使用。這些信息包括了標(biāo)簽、注釋、斷點、監(jiān)視、分析數(shù)據(jù)、條件等等更多:這里介紹的功能,僅僅是OllyDbg的部分功能。因為其具有如此豐富的功能,以至于OllyDbg能成為非常方便的調(diào)試器!
第二章組件一、一般原理[Generalprnciples]我希望你能對80x86系列處理器的內(nèi)部結(jié)構(gòu)有所了解,同時具有一定的編寫匯編程序的能力。對于MicrosoftWindows方面的知識,你也要熟悉。OllyDbg是運行在Windows95、Windows98、WindowsME、WindowsNT和Windows2000系統(tǒng)下的一個單進程、多線程的分析代碼級調(diào)試工具。它可以調(diào)試PE格式的執(zhí)行文件和動態(tài)鏈接庫,并可以對其打補丁。“代碼級”意味著你可以直接與比特、字節(jié)或處理器指令打交道。OllyDbg僅使用已公開的Win32API函數(shù),因此它可以在所有Windows操作系統(tǒng)和后繼版本中使用。但是由于我沒有對XP系統(tǒng)進行徹底測試,因此不能保證OllyDbg功能的充分發(fā)揮。注意:OllyDbg不支持對.NET程序的調(diào)試。OllyDbg不是面向編譯器的。它沒有特別的規(guī)則規(guī)定必須是哪一個編譯器產(chǎn)生的代碼。因此,OllyDbg可以非常好的處理通過編譯器生成的代碼,或是直接用匯編寫入的代碼。OllyDbg可以并行調(diào)試程序。你無須暫停執(zhí)行程序,就可以瀏覽代碼和數(shù)據(jù),設(shè)置斷點、停止或恢復(fù)線程,甚至直接修改內(nèi)存。(這可以視為一種軟件調(diào)試的模式,與之相對的硬件模式則是當(dāng)進程在運行時調(diào)試器被阻滯,反之亦然)。假使所需的操作比較復(fù)雜,OllyDbg會讓進程終止一小段時間,但是這種暫停對于用戶來說是透明的。有時進程會發(fā)生非法操作。你可以把OllyDbg設(shè)置成即時[just—in—time]調(diào)試器,它會掛接出錯程序,并停在程序產(chǎn)生異常的地方。通過OllyDbg,你可以調(diào)試單獨的DLL[standaloneDLLs]文件。操作系統(tǒng)不能直接運行DLL文件,因此OllyDbg將一個可以加載DLL的小程序壓縮到資源里,這個程序允許你調(diào)用最多10個參數(shù)的輸出函數(shù)。OllyDbg是完全面向模塊[module—oriented]的。模塊[Module]包括可執(zhí)行文件(擴展名通常為.EXE)和在啟動時加載或需要時動態(tài)加載的動態(tài)鏈接庫(擴展名通常為.DLL)。在調(diào)試期間,你可以設(shè)置斷點[breakpoints]、定義新的標(biāo)簽[labels]、注釋[comment]匯編指令,當(dāng)某個模塊從內(nèi)存中卸載[unload]時,調(diào)試器會把這些信息保存在文件中,文件名就是模塊的名稱,擴展名為.UDD(表示用戶自定義文件[User—DefinedData])當(dāng)OllyDbg下一次加載該模塊時,它會自動恢復(fù)所有的調(diào)試信息,而不管是哪一個程序使用這個模塊。假設(shè)你正在調(diào)試程序Myprog1,這個程序使用了Mydll。你在Mydll中設(shè)置了一些斷點,然后你開始調(diào)試Myprog2,這個程序同樣使用了Mydll。這時你會發(fā)現(xiàn),所有Mydll中的斷點依然存在,即使Mydll加載到不同的位置!一些調(diào)試器把被調(diào)試進程的內(nèi)存當(dāng)作一個單一的(并且大部分是空的)大小為2^32字節(jié)的區(qū)域。OllyDbg采用了與之不同的技術(shù):在這里,內(nèi)存由許多獨立的塊組成,任何對內(nèi)存內(nèi)容的操作都被限制在各自的塊內(nèi)。在大多數(shù)情況下,這種方式工作得很好并且方便了調(diào)試。但是,如果模塊包含好幾個可執(zhí)行段[executablesections],你將不能一次看到全部代碼,然而這種情況是非常少見的。OllyDbg是一個很占用內(nèi)存的程序[memory—hungryapplication]。它在啟動時就需要3MB,并且當(dāng)你第一次裝載被調(diào)試的程序時還需要一到兩兆的內(nèi)存。每一次的分析、備份、跟蹤或者文件數(shù)據(jù)顯示都需要占用一定的內(nèi)存。因此當(dāng)你調(diào)試一個很大的項目,發(fā)現(xiàn)程序管理器顯示有40或60兆內(nèi)存被占用時,請不要驚慌。為了有效地調(diào)試一些不帶源碼的程序,你必須首先理解它是如何工作的。OllyDbg包含的大量特性可以使這種理解變得非常容易。首先,OllyDbg包含一個內(nèi)置的代碼分析器。分析器遍歷整個代碼,分出指令和數(shù)據(jù),識別出不同的數(shù)據(jù)類型和過程,分析出標(biāo)準(zhǔn)API函數(shù)(最常用的大約有1900個)的參數(shù)并且試著猜出未知函數(shù)的參數(shù)數(shù)目。你也可以加入自己的函數(shù)說明[yourownfunctiondescriptions]。它標(biāo)記出程序入口點和跳轉(zhuǎn)目的地,識別出跳轉(zhuǎn)表[table—drivenswitches]和指向字符串的指針,加入一些注釋,甚至標(biāo)示出跳轉(zhuǎn)的方向等等。在分析結(jié)果的基礎(chǔ)上,調(diào)用樹[calltree]顯示哪些函數(shù)被指定過程調(diào)用(直接或間接)并且識別出遞歸調(diào)用、系統(tǒng)調(diào)用和葉子過程[leafprocedures]。如果需要的話,你可以設(shè)置解碼提示[decodinghints]來幫助分析器解析那些不明確的代碼或數(shù)據(jù)。OllyDbg還包含Object掃描器[ObjectScanner]。如果你有庫文件[libraries]或目標(biāo)文件[objectfiles],掃描器會在被調(diào)試的程序中定位這些庫函數(shù)。在全部函數(shù)調(diào)用中,對標(biāo)準(zhǔn)函數(shù)的調(diào)用占很重要的一部分(據(jù)我估計可達70%)。如果你知道正要被調(diào)用的函數(shù)的功能,你就不必把注意力集中在這個函數(shù)上,可以簡單地單步步過[stepover]這個call。分析器知道400多個標(biāo)準(zhǔn)C函數(shù),比如fopen和memcpy。然而我必須承認當(dāng)前版本的OllyDbg不能定位很短的函數(shù)(比一個return命令多不了多少的)或相似的函數(shù)(只在重定位上有不同)。Object掃描器[Objectscanner]也能夠識別輸入庫[importlibraries]。如果某個DLL是按序號輸出的,你不會看到函數(shù)名,只會發(fā)現(xiàn)一堆無意義的神秘數(shù)字。這種DLL的開發(fā)者通常會提供一個輸入庫來實現(xiàn)函數(shù)符號名與序號間的對應(yīng)。讓OllyDbg使用這個輸入庫,它就會恢復(fù)原始的函數(shù)符號名。面向?qū)ο蟮恼Z言(如C++),使用了一種叫做名稱修飾[namemangling]的技術(shù),把函數(shù)類型和參數(shù)都加入函數(shù)名中。OllyDbg可以解碼[demangle]這種函數(shù)名,使程序更易讀。譯者注:C++的名稱修飾是編譯器將函數(shù)的名稱轉(zhuǎn)變成為一個唯一的字符串的過程,這個字符串會對函數(shù)的類、其命名空間、其參數(shù)表,以和其他等等進行編碼。C++的名稱修飾適用于靜態(tài)成員函數(shù),也適用于非靜態(tài)成員函數(shù)。靜態(tài)函數(shù)的名稱修飾的一個好處之一,是能夠在不同的類里使用同一個名稱來聲明兩個或者更多的靜態(tài)成員函數(shù)————而不會發(fā)生名稱上的沖突。OllyDbg完全支持UNICODE,幾乎所有對ASCII字符串的操作都可以同樣應(yīng)用于UNICODE。匯編指令都是很相似的。你經(jīng)常會搞不清自己是不是已經(jīng)跟蹤過某一段代碼。在OllyDbg中你可以加入自己的標(biāo)簽[labels]和注釋[comments]。這些極大地方便了調(diào)試。注意一旦你注釋了某個DLL,以后每次加載這個DLL時,注釋和標(biāo)簽都有效————盡管你在調(diào)試不同的程序。OllyDbg可以跟蹤標(biāo)準(zhǔn)的棧幀[stackframes](由PUSHEBP;MOVEBP,ESP所創(chuàng)建的)?,F(xiàn)代編譯器有禁止產(chǎn)生標(biāo)準(zhǔn)??蚣艿倪x項,在這種情況下分配棧[stackwalk]是不可能的。當(dāng)程序運行到已知的函數(shù)時,棧窗口[stackwindow]解析它的參數(shù),調(diào)用棧[Callstack]窗口顯示到達當(dāng)前位置所調(diào)用函數(shù)的序列?,F(xiàn)代的面向?qū)ο髴?yīng)用程序廣泛地使用了一種叫做結(jié)構(gòu)化異常處理[StructuredExceptionHandling,SHE]的技術(shù)。SHE窗口[SEHwindow]可以顯示異常處理鏈。多種不同的搜索[search]選項可以讓你找到二進制代碼或數(shù)據(jù)、命令或命令序列、常量或字符串、符號名或在Run跟蹤中的一條記錄。對于任何地址或常量,OllyDbg可以找出參考[referencing]到該地址或常量的全部命令的列表。然后你可以在這個列表里找出對你來說是重要的參考。舉例來說,某個函數(shù)可能被直接調(diào)用,或者經(jīng)過編譯器優(yōu)化后把地址放入寄存器間接調(diào)用,或者把地址壓入堆棧作為一個參數(shù)————沒問題,OllyDbg會找出所有這樣的地方。它甚至能找到并列出所有和某個指定的位置有關(guān)的跳轉(zhuǎn)。OllyDbg支持所有標(biāo)準(zhǔn)類型的斷點[breakpoints]————非條件和條件斷點、內(nèi)存斷點(寫入或訪問)、硬件斷點或在整個內(nèi)存塊上下斷點(后兩項功能只在WindowME,NT,2000,XP中有效)。條件表達式可以非常復(fù)雜(“當(dāng)[ESP+8]的第2位被設(shè)置,并且123456位置處的字[word]小于10,或者EAX指向一個以“ABC”開頭的UNICODE字串,但跳過前10次斷點而在第11次中斷”)。你可以設(shè)定一條或多條指令,當(dāng)程序暫停時由OllyDbg傳遞給插件插件[plugins]。除了暫停,你還可以記錄某個表達式的值(可以帶有簡短的說明),或者記錄OllyDbg已知的函數(shù)的參數(shù)。在Athlon2600+、Windows2000環(huán)境下,OllyDbg可以每秒處理多達25000個條件斷點。另一個有用的特性是跟蹤。OllyDbg支持兩種方式的跟蹤:hit和run。在第一種情況下,它對指定范圍內(nèi)的每條指令上設(shè)置斷點(比如在全部可執(zhí)行代碼中)。當(dāng)?shù)竭_設(shè)斷的指令后,OllyDbg清除斷點并且把該指令標(biāo)記為hit。這種方法可以用來檢測某段代碼是否被執(zhí)行。Hit跟蹤速度驚人的快,在一個很短時間的啟動后程序幾乎達到了全速(譯者注:這應(yīng)該是與不進行調(diào)試時速度相比而言)。因為INT3斷點可能對數(shù)據(jù)有災(zāi)難性的影響,所以我建議不要使用模糊識別過程。當(dāng)代碼沒有被分析時Hit跟蹤是不可以使用的。Run跟蹤[Runtrace]是一步一步地執(zhí)行程序,同時記錄精確的運行歷史和所有寄存器的內(nèi)容、已知的參數(shù)和可選的指令(當(dāng)代碼是自修改時會有幫助)。當(dāng)然,這需要大量的內(nèi)存(每個指令需要15至50個字節(jié),取決于調(diào)試的模式)但是可以精確地回溯和分析。你可以只在選定的一段代碼甚至是一條指令中進行Run跟蹤,或者你可以跳過無關(guān)緊要的代碼。對于每個地址,OllyDbg能夠計算這個地址在Run跟蹤日志中出現(xiàn)的次數(shù),雖然會導(dǎo)致執(zhí)行緩慢但是可以得到代碼執(zhí)行的統(tǒng)計。比如說,某命令讓你在每個已識別的過程入口處進行Run跟蹤,那么統(tǒng)計[profile]就會給你每個過程被調(diào)用的次數(shù)。在到達某條指令、某個地址范圍或指令計數(shù)器達到某一數(shù)值時Run跟蹤可以自動地暫停[pause]。在多線程程序里OllyDbg可以自動管理線程[threads],如果你單步調(diào)試或跟蹤程序,它會自動恢復(fù)當(dāng)前線程而掛起其它線程。如果你運行程序,OllyDbg會恢復(fù)先前的線程狀態(tài)。你可以為內(nèi)存塊建立快照(叫做備份)。OllyDbg會高亮顯示所有的改動。你可以把備份保存到文件或從文件中讀取出來,從而發(fā)現(xiàn)兩次運行的不同之處。你可以查看備份,搜索下一處改動,恢復(fù)全部或選定的改動。補丁管理器[Patchmanager]記錄了上次應(yīng)用到程序中的所有補丁,在下次調(diào)試時可以再次應(yīng)用它們。你可以很容易地把你的補丁加在可執(zhí)行文件上。OllyDbg會自動進行修正。你不能在帶有Win32的16位Windows下使用OllyDbg。這種32位擴展操作系統(tǒng)無法實現(xiàn)某些必需的調(diào)試功能。你既不能調(diào)試DOS程序也不能調(diào)試16位NE(NewExecutable)格式文件,我也沒有打算在未來的版本中支持這些。二、反匯編器[Disassembler]反匯編器識別所有的標(biāo)準(zhǔn)80x86、保護、FPU、MMX和3DNow!指令集(包括Athlon擴展的MMX指令集)。但它不識別ISSI命令,盡管計劃要在下個版本中支持這種命令。某些過時或者未公開的命令,像LOADALL,也不支持。反匯編器可以正確解碼16位地址。但它假設(shè)所有的段都是32位的(段屬性使用32位)。這對于PE[PortableExecutable]格式文件總是正確的。OllyDbg不支持16位的NE[NewExecutables]格式。如果你熟悉MASM或者TASM,那么反匯編的代碼對于你沒有任何問題。但是,一些特例也是存在的。以下命令的解碼與Intel的標(biāo)準(zhǔn)不同:AAD(ASCIIAdjustAXBeforeDivision)—該命令的解碼后的一般形式為:AADimm8AAM(ASCIIAdjustAXAfterMultiply)—該命令(非十進制數(shù))的一般解碼形式為:AAMimm8SLDT(StoreLocalDescriptorTableregister)—操作數(shù)總被解碼為16位。這個命令的32位形式會在目的操作數(shù)的低16位中存儲段選擇器,并保留高16位不變。SALC(Sign—extendCarrybittoAL,undocumented)—OllyDbg支持這個未公開指令。PINSRW(InsertWordFromIntegerRegister,AthlonextensiontoMMX)—在AMD的官方文檔中,這個命令的內(nèi)存形式使用了16位內(nèi)存操作數(shù);然而寄存器形式需要32位寄存器,但只使用了低16位。為了方便處理,反匯編器解碼寄存器為16位形式。而匯編器兩種形式都支持。CVTPS2PIandCVTTPS2PI(ConvertPackedSingle—PrecisionFloatingtoPackedDoubleword,ConvertwithTruncationPackedSingle—PrecisionFloatingtoPackedDoubleword)—在這些命令中,第一個操作數(shù)是MMX寄存器,第二個或者是128位XMM寄存器或者是64位內(nèi)存區(qū)域。為了方便處理,內(nèi)存操作數(shù)也被解碼為128位。有些指令的助記符要依賴操作數(shù)的大?。翰环执笮〉男问?明確的16位形式 明確的32位形式PUSHA PUSHAW PUSHADPOPA POPAW POPADLOOP LOOPW LOOPDLOOPE LOOPWE LOOPDELOOPNE LOOPWNE LOOPDNEPUSHF PUSHFW PUSHFDPOPF POPFW POPFDIRET IRETW IRETD你可以改變解碼大小敏感助記符[decodingofsize—sensitivemnemonics]。根據(jù)選項,反匯編器從三種可能中選擇之一進行解碼。這個選項也會影響匯編器的默認處理方式。解碼MMX和3DNow!指令總是開啟的,盡管你的處理器并不支持這些指令。三、分析器[Analysis]OllyDbg整合了一個快速而強大的代碼分析器。你可以從快捷菜單,或者在CPU窗口的反匯編面板中按Ctrl+A,或者在可執(zhí)行模塊中選擇“分析全部模塊[Analyzeallmodules]”,來使用它。 分析器有很高的啟發(fā)性。它能區(qū)分代碼和數(shù)據(jù),標(biāo)記入口和跳轉(zhuǎn)目的地址,識別轉(zhuǎn)換表[switchtables],ASCII和UNICODE串,定位函數(shù)過程,循環(huán),高階轉(zhuǎn)換[high—levelswitches]并且能解碼標(biāo)準(zhǔn)API函數(shù)的參數(shù)(示例[example])。OllyDbg的其他部分也廣泛的使用了分析后的數(shù)據(jù)。這是如何實現(xiàn)的?我將為你揭開這一神秘面紗。第一遍,OllyDbg反匯編代碼段中所有可能的地址,并計算調(diào)用的每個目的地址的個數(shù)。當(dāng)然,很多調(diào)用是假的,但不可能兩個錯誤的調(diào)用都指向了相同的命令,當(dāng)然如果有三個的話,就更不可能了。因此如果有三個或者更多的調(diào)用指向了相同的地址,我可以肯定的說這個地址是某個頻繁使用的子程序的入口。從定位的入口出發(fā),我繼續(xù)跟蹤所有的跳轉(zhuǎn)和函數(shù)調(diào)用,等等。按這種方法,我可能準(zhǔn)確定位99.9%的命令。但是,某些字節(jié)并不在這個鏈條上。我再用20多種高效的啟發(fā)方法(最簡單的方法,比如“直接訪問前64K內(nèi)存是不允許的,像在MOV[0],EAX中”)來探測他們。有時,分析器在你感興趣的地方分析錯誤。有兩種解決方法:或者從選中的部分移除分析(快捷鍵退格鍵),這樣OllyDbg將使用默認的解碼(反匯編)方式;或者設(shè)置解碼提示[decodinghints]并重新分析。注意:在某些情況下,當(dāng)分析器認為你的提示是不合適的,或者有沖突,則可能忽略你的設(shè)置。探測程序的函數(shù)過程也很簡單。在分析器眼中看來,程序只是一個連綿不斷的代碼,從一個入口開始,可能達到(至少從理論上)所有的命令(除了NOP以和類似的用于填充間隙的命令)。你可能指定三個識別級別。嚴(yán)格的函數(shù)過程要求有準(zhǔn)確的一個入口,并且至少有一個返回。在啟發(fā)級別下,分析器只要求過程有一個入口。而如果你選擇模糊模式,差不多連貫的代碼都會被識別為單獨的過程?,F(xiàn)代編譯器進行全局代碼優(yōu)化,有可能把一個過程分成幾個部份。在這種情況下,模糊模式非常有用。但是也會誤識別的機率也就更高。同樣地,循環(huán)是一個封閉的連續(xù)的命令序列,并有一個到開始處的跳轉(zhuǎn)作為一個入口,還有若干個出口。循環(huán)與高級操作命令do,while和for相對應(yīng)。OllyDbg能夠識別任何復(fù)雜的嵌套循環(huán)。他們會在反匯編欄[Disassembly]中用長而粗括號標(biāo)記。如果入口不是循環(huán)的第一個命令,OllyDbg會用一個小三角進行標(biāo)記。為了實現(xiàn)一個轉(zhuǎn)換[switch],許多編譯器,讀取轉(zhuǎn)換變量[switchvariable]到寄存器中,然后減它,像如下的代碼序列:MOVEDX,<switchvariable>SUBEDX,100JBDEFAULTCASEJECASE100;Case100DECEDXJNEDEFAULTCASE...;Case101這個序列可能還包含一到兩階的轉(zhuǎn)換表、直接比較、優(yōu)化和其他元素。如果在比較或跳轉(zhuǎn)的很深處,這就很難知道哪是一個分支[Case]。OllyDbg會幫助你,它會標(biāo)記所有的分支,包括默認的,甚至嘗試分析每個分支的含義,如'A'、WM_PAINT或者EXCEPTION_ACCESS_VIOLATION。如果命令序列沒有修改寄存器(也就是僅僅由比較組成),那么這可能不是轉(zhuǎn)換,而很有可能是選擇嵌套:if(i==0){...}elseif(i==5){...}elseif(i==10){...}如果需要OllyDbg將選擇嵌套解碼成選擇語句,請在分析1[Analysis1]中設(shè)置相關(guān)選項。OllyDbg包含多達1900條常用API函數(shù),這些都作為內(nèi)部預(yù)處理資源。這個列表包含了KERNEL32,GDI32,USER32,ADVAPI32,COMDLG32,SHELL32,VERSION,SHLWAPI,COMCTL32,WINSOCK,WS2_32和MSVCRT。你可以添加自己的函數(shù)描述[addyourowndescriptions]。如果分析器遇到的調(diào)用,使用了已知的函數(shù)名(或者跳轉(zhuǎn)到這樣的函數(shù)),它將在調(diào)用之前立即解碼PUSH命令。因此,你只需略微一看就能明白函數(shù)調(diào)用的含義。OllyDbg還包含了大約400多種的標(biāo)準(zhǔn)C函數(shù)。如果你有原始的庫文件,我推薦你在分析前掃描目標(biāo)文件。這樣OllyDbg將能解碼這些C函數(shù)的參數(shù)。如果選項“猜測未知函數(shù)的參數(shù)個數(shù)”開啟,分析器將會決定這個調(diào)用函數(shù)過程使用的長度為雙字的參數(shù)個數(shù)。并且標(biāo)記他們?yōu)閰?shù)1[Arg1],參數(shù)2[Arg2],等等。注意:無論如何,寄存器參數(shù)是無法識別的,所以不會增加參數(shù)的數(shù)目。分析器使用了一種比較安全的方法。例如,它不能識別的沒有參數(shù)的函數(shù)過程,或者該過程POP命令直接做返回前的寄存器恢復(fù),而不銷毀參數(shù)。然而,識別出來的函數(shù)參數(shù)數(shù)目通常非常高,這大大加大了代碼的可讀性。分析器能夠跟蹤整型寄存器的內(nèi)容?,F(xiàn)代優(yōu)化編譯器,特別是奔騰系列,頻繁地使用寄存器讀取常量和地址,或使用盡量少的使用內(nèi)存。如果某個常量讀取到寄存器中,分析器會注意它,并嘗試解碼函數(shù)和其參數(shù)。分析器還能完成簡單的算術(shù)計算,甚至可以跟蹤壓棧和出棧。分析器不能區(qū)分不同類的名稱[differentkindsofnames]。如果你將某些函數(shù)指定為已知的名稱,OllyDbg將會解碼所有到該地址的調(diào)用。這是幾個預(yù)定義的特殊名稱WinMain,DllEntryPointandWinProc。你可能使用這些標(biāo)簽標(biāo)記主程序、DLL的的入口以和窗口過程(注意:OllyDbg不檢查用戶自定義的標(biāo)簽是否唯一)。另外,假定預(yù)定義參數(shù)assumepredefinedarguments是一種更好的方法,不幸的是,沒有一般規(guī)則能夠做到100%的準(zhǔn)確分析。在某些情況下,例如當(dāng)模塊包含了P—Code或代碼段中包換了大量的數(shù)據(jù),分析器可能將一些數(shù)據(jù)解釋成代碼。如果統(tǒng)計分析顯示代碼部分很可能是壓縮包或者經(jīng)過加密了,分析器會發(fā)出警告。如果你想使用Hit跟蹤[Hittrace],我建議你不要使用模糊分析[fuzzyanalysis],因為設(shè)置斷點的地方可能正是數(shù)據(jù)部分。自解壓文件[Self—extractablefiles]通常有一個自提取器,在“正式”代碼段之外。如果你選擇自解壓選項[SFXoption]中的“擴展代碼段,包含提取器[Extendcodesectiontoincludeself—extractor]”,OllyDbg將會擴展代碼段,形式上允許分析它,并可以使用Hit跟蹤[Hit]trace和Run跟蹤[Runtrace]。
四、Object掃描器[Objectscanner]掃描器將特定的目標(biāo)文件或者目標(biāo)庫(包括OMF和COFF兩種格式),提取出代碼段,然后將這些段定位在當(dāng)前模塊的代碼節(jié)[Codesection]中.如果段定位好了,掃描器將從目標(biāo)文件中的調(diào)試信息提取名稱(也就是所謂的庫標(biāo)簽[librarylabels])。這極大的增加了代碼與數(shù)據(jù)的可讀性。掃描器并不會對已識別的目標(biāo)文件進行標(biāo)簽匹配,所以它不能識別非常小或相似的函數(shù)(比如:兩個函數(shù)只是在重定位有區(qū)別)。因此要經(jīng)常檢查掃描器發(fā)送到登陸窗口的警告列表!五、Implib掃描器[Implibscanner]某些DLL的輸出符號僅僅是一個序號。許多符號都是井號加數(shù)字(比如:MFC42.#1003),這非常不便于理解。幸運的是,軟件零售商提供了輸入連接庫(implibs),它與序號符號名相關(guān)。使用implib掃描器的方法:從主菜單中選擇調(diào)試[Debug]—>選擇輸入鏈接庫[Selectimportlibraries]。當(dāng)你加載應(yīng)用程序時,OllyDbg會讀取鏈接庫并從內(nèi)置表格[internaltables]中提取符號名。每次遇到序號符號,而對應(yīng)的鏈接庫已經(jīng)注冊到OllyDbg中時,這個序號符號會被替換。
第三章OllyDbg的使用一、如何開始調(diào)試[Howtostartdebuggingsession]最簡單的方法是:運行OllyDbg,點擊菜單上的文件[File]—>打開[Open],選擇你想調(diào)試的程序。如果程序需要命令行參數(shù),你可以在對話框底部的輸入欄中,輸入?yún)?shù)或者選擇以前調(diào)試時輸入過的一條參數(shù)。OllyDbg能夠調(diào)試獨立的DLL[stand—aloneDLLs]。在這種情況下,OllyDbg會創(chuàng)建并運行一個小的應(yīng)用程序來加載鏈接庫并根據(jù)你的需要調(diào)用輸出函數(shù)。如果你想重新啟動上一次調(diào)試的程序,只要按一下Ctrl+F2(這是重啟程序的快捷鍵)(???),這樣OllyDbg會以同樣的參數(shù)運行這個程序。另一種做法是在菜單中選擇文件[File],從歷史列表中選擇程序。你也可以在Windows資源管理器中將可執(zhí)行文件或DLL文件拖拽到OllyDbg中。當(dāng)然,你可以在OllyDbg啟動時,運行指定帶有運行參數(shù)的被調(diào)試程序。例如:你可以在桌面創(chuàng)建一個OllyDbg的快捷方式,右擊并選擇“屬性”,在“快捷方式”中的“目標(biāo)”中添加調(diào)試的程序的全路徑。這樣,你每次雙擊快捷方式時,OllyDbg將自動運行被調(diào)試程序。注意:DLL文件不支持這種方式。你可以把正在運行的進程掛接到OllyDbg中。在菜單中打開文件[File]—>掛接[Attach],從進程列表中選擇要掛接的進程。注意:在你關(guān)閉OllyDbg的同時,這個進程也會被關(guān)閉。不要掛接系統(tǒng)進程,否則可能會導(dǎo)致整個操作系統(tǒng)的崩潰。(事實上在大多數(shù)情況下,操作系統(tǒng)禁止你掛接敏感進程)。OllyDbg可以作為即時[just—in—time]調(diào)試器。這需要在系統(tǒng)注冊表中注冊。在菜單中選擇選項[Options]—>即時調(diào)試[Just—in—timedebugging]并在彈出的對話框中單擊按鈕“設(shè)置OllyDbg為即時調(diào)試器”[MakeOllyDbgjust—in—timedebugger]。今后,如果某個應(yīng)用程序發(fā)生了非法操作,系統(tǒng)將提示你是否用OllyDbg調(diào)試這個程序。操作系統(tǒng)會啟動OllyDbg并直接停在發(fā)生異常的地方。如果你選擇了“掛接時不詢問”[attachingwithoutconfirmation],則在即時調(diào)試時OllyDbg不會彈出詢問對話框。如果想恢復(fù)成以前的即時調(diào)試器[Restoreoldjust—in—timedebuger],按相應(yīng)的按鈕即可。另一種方法是把OllyDbg添加到與可執(zhí)行文件關(guān)聯(lián)的快捷菜單中(這個想法是JochenGerster提出的)。在主菜單中,選擇選項[Options]—>添加到資源管理器中[AddtoExplorer]。以后你可以在所有的文件列表中,右擊可執(zhí)行文件或DLL,在快捷菜單中選擇OllyDbg。這個功能會創(chuàng)建四個注冊表鍵值:HKEY_CLASSES_ROOT\exe\OpenwithOllyDbgHKEY_CLASSES_ROOT\exe\OpenwithOllyDbg\commandHKEY_CLASSES_ROOT\dll\OpenwithOllyDbgHKEY_CLASSES_ROOT\dll\OpenwithOllyDbg\commandOllyDbg能夠調(diào)試控制臺程序(基于文字的)。OllyDbg不能調(diào)試.NET應(yīng)用程序。.NET程序是由微軟的中間語言這種偽指令組成的,或是on—the—flytonative?6commands編譯的。注意:如果你運行的是WindowsNT、2000或XP操作系統(tǒng),你應(yīng)該擁有管理員權(quán)限以便能夠調(diào)試程序。。二、CPU窗口[CPUwindow]對于用戶來說,CPU窗口在OllyDbg中是最重要的窗口。你調(diào)試自己程序的絕大部分操作都要在這個窗口中進行。它包括以下五個面板(這五個面板的大小都是可以調(diào)節(jié)的):反匯編[Disassembler]信息[Information]數(shù)據(jù)[Dump]寄存器[Registers]棧[Stack]按TAB鍵,可以切換到下一個CPU面板中(順時針方向)。按Shift+TAB,可以切換到前一個CPU面板(逆時針方向)。三、斷點[Breakpoints]OllyDbg支持數(shù)種不同類型的斷點:一般斷點[Ordinarybreakpoint],將你想中斷的命令的第一個字節(jié),用一個特殊命令I(lǐng)NT3(調(diào)試器陷阱)來替代。你可以在反匯編窗口中選中要設(shè)斷點的指令行并按下F2鍵就可以設(shè)定一個此類型的斷點。也可以在快捷菜單中設(shè)置。再次按下F2鍵時,斷點將被刪除。注意,程序?qū)⒃谠O(shè)斷指令被執(zhí)行之前中斷下來。INT3斷點的設(shè)置數(shù)量是沒有限制的。當(dāng)你關(guān)閉被調(diào)試程序或者調(diào)試器的時候,OllyDbg將自動把這些斷點保存到硬盤中,永遠不要試圖在數(shù)據(jù)段或者指令的中間設(shè)置這種斷點,如果你試圖在代碼段以外設(shè)置斷點,OllyDbg將會警告。你可以在安全選項[Securityoptions]中永遠關(guān)閉這個提示,在某些情況下調(diào)試器會插入自帶的臨時INT3斷點。條件斷點[Conditionalbreakpoint](快捷鍵Shift+F2)是一個帶有條件表達式的普通INT3斷點。當(dāng)調(diào)試器遇到這類斷點時,它將計算表達式的值,如果結(jié)果非零或者表達式無效,將暫停被調(diào)試程序,當(dāng)然,由條件為假的斷點引起的開銷是非常高的(主要歸因于操作系統(tǒng)的反應(yīng)時間)。在WindowsNT、奔騰Ⅱ/450處理器環(huán)境下OllyDbg每秒最多處理2500個條件為假的斷點。條件斷點的一個典型使用情況就是在Windows消息上設(shè)置斷點(比如WM_PAINT)。為此,你可以將偽變量MSG同適當(dāng)?shù)膮?shù)說明聯(lián)合使用。如果窗口被激活,參考一下后面的消息斷點描述。條件記錄斷點Conditionalloggingbreakpoint](Shift+F4)是一種條件斷點,每當(dāng)遇到此類斷點或者滿足條件時,它將記錄已知函數(shù)表達式或參數(shù)的值。例如,你可以在一些窗口過程函數(shù)上設(shè)置記錄斷點并列出對該函數(shù)的所有調(diào)用?;蛘咧粚邮盏降腤M_COMMAND消息標(biāo)識符設(shè)斷,或者對創(chuàng)建文件的函數(shù)(CreateFile)設(shè)斷,并且記錄以只讀方式打開的文件名等,記錄斷點和條件斷點速度相當(dāng),并且從記錄窗口中瀏覽上百條消息要比按上百次F9輕松的多,你可以為表達式選擇一個預(yù)先定義好的解釋說明。你可以設(shè)置通過的次數(shù)—每次符合暫停條件時,計數(shù)器就會減一。如果通過計數(shù)在減一前,不等于零,OllyDbg就會繼續(xù)執(zhí)行。如果一個循環(huán)執(zhí)行100次(十進制),在循環(huán)體內(nèi)設(shè)置一個斷點,并設(shè)置通過次數(shù)為99(十進制)。OllyDbg將會在最后一次執(zhí)行循環(huán)體時暫停。另外,條件記錄斷點允許你傳遞一個或多個命令給插件[plugins]。例如,你需要使用命令行插件改變一個寄存器的內(nèi)容,然后繼續(xù)執(zhí)行程序。消息斷點[Messagebreakpoint]和條件記錄斷點基本相同,除了OllyDbg會自動產(chǎn)生一個條件,這個條件允許在窗口過程的入口處設(shè)置某些消息(比如WM_PSINT)斷點,你可以在窗口[Windows]中設(shè)置它。跟蹤斷點[Tracebreakpoint]是在每個選中命令上設(shè)置的一種特殊的INT3斷點。如果你設(shè)置了Hit跟蹤[hittrace],斷點會在命令執(zhí)行后移除,并在該地址處做一個標(biāo)記。如果你使用的是Run跟蹤[runtrace],OllyDbg會添加跟蹤數(shù)據(jù)記錄并且斷點仍然是保持激活狀態(tài)。內(nèi)存斷點[Memorybreakpoint]OllyDbg每一時刻只允許有一個內(nèi)存斷點。你可以在反匯編窗口、CPU窗口、數(shù)據(jù)窗口中選擇一部分內(nèi)存,然后使用快捷菜單設(shè)置內(nèi)存斷點。如果有以前的內(nèi)存斷點,將被自動刪除。你有兩個選擇:在內(nèi)存訪問(讀,寫,執(zhí)行)時中斷,或內(nèi)存寫入時中斷。設(shè)置此類斷點時,OllyDbg將會改變所選部分的內(nèi)存塊的屬性。在與80x86兼容的處理器上將會有4096字節(jié)的內(nèi)存被分配并保護起來。即使你僅僅選擇了一個字節(jié),OllyDbg也會將整個內(nèi)存塊都保護起來。這將會引起大量的錯誤警告,請小心使用此類斷點。某些系統(tǒng)函數(shù)(特別是在Windows95/98下)在訪問受保護的內(nèi)存時不但不會產(chǎn)生調(diào)試事件反而會造成被調(diào)試程序的崩潰。硬斷點[Hardwarebreakpoint](僅在WindowsME,NT或2000下可用)在80x86兼容的處理器上,允許你設(shè)置4個硬件斷點。和內(nèi)存斷點不同,硬件斷點并不會降低執(zhí)行速度,但是最多只能覆蓋四個字節(jié)。在單步執(zhí)行或者跟蹤代碼時,OllyDbg能夠使用硬斷點代替INT3斷點。內(nèi)存訪問一次性斷點[Single—shotbreakonmemoryaccess](僅在WindowsNT或2000下可用)。你可以通過內(nèi)存窗口的快捷菜單(或按F2),對整個內(nèi)存塊設(shè)置該類斷點。當(dāng)你想捕捉調(diào)用或返回到某個模塊時,該類斷點就顯得特別有用。中斷發(fā)生以后,斷點將被刪除。暫停Run跟蹤[Runtracepause](快捷鍵:Ctrl+T)是在每一步Run跟蹤[runtrace]時都要檢查的一個條件集。你可以在EIP進入某個范圍或超出某個范圍時暫停,某個條件為真時暫停,或者命令與指定的模式匹配時暫停,或者當(dāng)命令可疑的時候暫停。注意,這一選擇會極大的(高達20%)降低Run跟蹤的速度。OllyDbg也可以在一些調(diào)試事件[debuggingevents]上暫停程序執(zhí)行。比如加載或卸載DLL,啟動或終止線程,或者程序發(fā)出調(diào)試字符串的時候。四、數(shù)據(jù)窗口[Dump]數(shù)據(jù)窗口用于顯示內(nèi)存或文件的內(nèi)容。你可以從以下預(yù)處理格式[predefinedformats]中選擇一種顯示方式:字節(jié)[byte]、文本[text]、整數(shù)[integer]、浮點數(shù)[float]、地址[address],反匯編[disassembly]、PE頭[PEHeader]。所有的dump窗口支持備份[backup]、搜索和編輯操作。CPU窗口[CPUwindow]的Dump面板允許你對可執(zhí)行代碼的數(shù)據(jù)和可執(zhí)行文件(.exe,或.dll)的內(nèi)存映射做如下操作:定義標(biāo)簽[labels]、設(shè)置內(nèi)存斷點[memorybreakpoints],查找參考[references]。數(shù)據(jù)菜單[Dumpmenu]只顯示與選中部分相關(guān)的命令。如果備份[backup]可用,則單擊第一個列標(biāo)題欄,會在地址[Address]/備份[Backup]兩種顯示模式之間切換。點擊其他列標(biāo)題欄,會改變Dump模式。像反匯編窗口一樣,數(shù)據(jù)窗口也保存了大量查看內(nèi)存地址的歷史記錄。你可以通過“+”和“—”鍵來訪問過去查看過的數(shù)據(jù)地址空間。要翻動一字節(jié)的數(shù)據(jù),可以按住Ctrl+↓或Ctrl+↑。五、可執(zhí)行模塊窗口[Executablemoduleswindow]可執(zhí)行模塊窗口(快捷鍵:Alt+E)列出了當(dāng)前被調(diào)試進程加載的所有可執(zhí)行模塊。它也顯示了很多有用的信息,比如模塊大小、入口地址、模塊版本、以和可執(zhí)行文件路徑等。一些信息,如以十進制顯示的模塊大小、入口地址的符號名、是否為系統(tǒng)模塊等,通常是被隱藏的。如果想看,可以增加相應(yīng)欄的寬度??旖莶藛沃С忠韵虏僮鳎核⑿拢跘ctualize]—重新掃描模塊并去除對新加載模塊的高亮顯示。在大多數(shù)情況下,OllyDbg會自動完成該操作。查看內(nèi)存[Viewmemory]—打開內(nèi)存窗口,并定位到屬于該模塊鏡像的第一個內(nèi)存塊處。在CPU窗口中查看代碼[ViewcodeinCPU](快捷鍵:回車鍵)—在反匯編窗口中顯示模塊的可執(zhí)行代碼。跟進到入口[Followentry]—在反匯編窗口中跟進到模塊的入口處。在CPU窗口中查看數(shù)據(jù)[DumpdatainCPU]—在CPU窗口的數(shù)據(jù)面板中顯示模塊的數(shù)據(jù)段。塊代碼段。顯示名稱[Viewnames](快捷鍵:Ctrl+N)—顯示當(dāng)前模塊定義或使用的全部名稱[names](包括輸出表、引入表、鏈接庫、用戶自定義)。標(biāo)記為系統(tǒng)DLL[MarkassystemDLL],標(biāo)記為非系統(tǒng)DLL[Markasnon—systemDLL]—將選中模塊標(biāo)記為系統(tǒng)或非系統(tǒng)屬性。如果設(shè)置為系統(tǒng)屬性,則在Run跟蹤[Runtrace]時會直接執(zhí)行(不進行跟蹤)這個模塊,從而大大加快跟蹤速度。默認情況下,所有駐留在系統(tǒng)目錄(通常在Windows95/98下為c:\windows\system,在WinNT/2000/XP下為c:\winnt\system32)的模塊都認為是系統(tǒng)模塊。立即更新.udd文件[Update.udd]—向文件“<模塊名>.udd”寫入模塊相關(guān)的全部數(shù)據(jù),udd文件保存了在調(diào)試期間設(shè)置的斷點、標(biāo)簽、注釋、監(jiān)視、分析等信息。當(dāng)模塊卸載時OllyDbg會自動創(chuàng)建.udd文件。查看可執(zhí)行文件[Viewexecutablefile]—顯示可執(zhí)行文件的全部內(nèi)容。查看全部資源[Viewallresources]—以列表形式顯示模塊定義的全部資源,并帶有一個簡短信息。OllyDbg并不把資源當(dāng)作單獨實體來支持。你可以提?。跠ump]并以二進制的形式進行編輯。查看資源字符串[Viewresourcestrings]—以列表形式顯示資源字符串和其標(biāo)識符。查看Run跟蹤的統(tǒng)計[Viewruntraceprofile]—在此模塊中計算統(tǒng)計[profile]。分析全部模塊[Analyzeallmodules]—允許同時分析全部模塊。分析將從代碼中提取大量的有用信息;代碼經(jīng)過分析后再進行調(diào)試,通常會非??觳⑶铱煽?。鼠標(biāo)雙擊某一行,將會在反匯編窗口中顯示模塊的執(zhí)行代碼。六、內(nèi)存映射窗口[Memorymapwindow]內(nèi)存映射窗口顯示了被調(diào)試程序分配的所有內(nèi)存塊。因為沒有標(biāo)準(zhǔn)的方法來完成這項任務(wù),所以O(shè)llyDbg可能會把一個大的內(nèi)存塊分成幾個部分。然而,在大多數(shù)情況下,并非一定要精確處理。如果想查看由應(yīng)用程序通過調(diào)用GlobalAlloc()和LocalAlloc()等申請的內(nèi)存塊列表,請使用堆列表[Heaplist]。如果內(nèi)存塊是可執(zhí)行模塊的一個節(jié),OllyDbg則會報告這個內(nèi)存塊所包含的數(shù)據(jù)類型:代碼、數(shù)據(jù)、資源等。Windows95/98是和WindowsNT/2000是有一些區(qū)別的。在Windows95/98下,OllyDbg是不能顯示被映射文件的名稱的。另外,Windows95/98不允許的訪存類型為讀和寫,然而,在WindowsNT/2000下,OllyDbg卻有擁有更多功能,包括執(zhí)行訪問,寫復(fù)制[copy—on—write]以和監(jiān)視標(biāo)志位。OllyDbg忽略寫復(fù)制[copy—on—write]屬性。如果OllyDbg發(fā)現(xiàn)程序分配了新內(nèi)存或者重新分配了已經(jīng)存在的內(nèi)存塊,它將在內(nèi)存映射窗口中高亮顯示相應(yīng)的記錄,去掉高亮度顯示,可以選擇快捷菜單中的刷新[Actualize]項。你可以按Alt+M來調(diào)用內(nèi)存窗口。以下是快捷菜單中可以選擇的菜單項:刷新[Actualize]—更新已分配內(nèi)存的列表并去除對新內(nèi)存塊的高亮顯示。在反匯編窗口中查看[ViewinDisassembler]—在反匯編窗口中查看:在反匯編窗口中打開內(nèi)存塊,這一選項僅在某些模塊的內(nèi)存塊中包含可執(zhí)行代碼或者自解壓器時可用。在CPU數(shù)據(jù)窗口中查看[DumpinCPU]—在CPU的數(shù)據(jù)窗口中顯示內(nèi)存塊的內(nèi)容。數(shù)據(jù)窗口[Dump]—在單獨窗口中顯示內(nèi)存塊內(nèi)容。如果內(nèi)存塊的類型已知,則OllyDbg會自動選擇顯示格式。查看全部資源[Viewallresources]—如果內(nèi)存塊包含資源數(shù)據(jù),則列出所有資源和相關(guān)數(shù)據(jù)。OllyDbg并不把資源當(dāng)作單獨實體來支持。你可以顯示其數(shù)據(jù)并以二進制的形式進行編輯。查看資源字符串[Viewresourcestrings]—如果內(nèi)存塊包含資源數(shù)據(jù),則列出全部資源字符串和其標(biāo)識符。搜索[Search]—允許搜索所有的內(nèi)存塊,從選擇處開始,搜索匹配的二進制串。如果找到,則OllyDbg將顯示該內(nèi)存塊。內(nèi)存映像窗口和數(shù)據(jù)窗口共享同一種搜索模式,所以你可以在彈出的數(shù)據(jù)窗口中立即繼續(xù)搜索該二進制串出現(xiàn)的下一位置。按Esc鍵可以關(guān)閉數(shù)據(jù)窗口。搜索下一個[Searchnext](快捷鍵:Ctrl+L)—繼續(xù)上次搜索。設(shè)置訪問中斷[Setbreak—on—access](快捷鍵:F2,僅在WindowsNT/2000下可用)—保護整個內(nèi)存塊。當(dāng)中斷發(fā)生后OllyDbg暫停被調(diào)試程序并清除斷點。這類斷點在你想捕捉調(diào)用或返回到某個模塊的時候特別有用。清除訪問中斷[Removebreak—on—access](快捷鍵:F2)—從內(nèi)存塊中清除訪問中斷保護。設(shè)置內(nèi)存訪問斷點[Setmemorybreakpointonaccess]—在整個內(nèi)存塊上設(shè)置斷點,每當(dāng)該內(nèi)存塊被訪問時程序都將中斷。OllyDbg只支持一個內(nèi)存訪問斷點。在Windows95/98下,當(dāng)系統(tǒng)程序訪問含有內(nèi)存斷點的內(nèi)存塊時,可能會導(dǎo)致所被調(diào)試程序崩潰,因此,不到萬不得已,請不要設(shè)置這種斷點。設(shè)置內(nèi)存寫入斷點[Setmemorybreakpointonwrite]—在整個內(nèi)存塊上設(shè)置斷點,每當(dāng)該內(nèi)存塊被寫入數(shù)據(jù)時程序都將中斷。在Windows95/98下,當(dāng)系統(tǒng)程序訪問含有內(nèi)存斷點的內(nèi)存塊時,可能會導(dǎo)致所被調(diào)試程序崩潰,因此,不到萬不得已,請不要設(shè)置這種斷點。清除內(nèi)存斷點[Removememorybreakpoint]—清除內(nèi)存斷點。清除自解壓內(nèi)存斷點[RemoveSFXmemorybreakpoint]—停止搜索自解壓程序[self—extractable(SFX)program]的真實入口。這個搜索使用了特殊類型的內(nèi)存斷點。訪問設(shè)置[Setaccess]—設(shè)置整個內(nèi)存塊的保護屬性,可選擇的有:禁止訪問[Noaccess]只讀[Readonly]讀/寫[Read/write]執(zhí)行[Execute]執(zhí)行/讀[Execute/read]完全訪問[Fullaccess]復(fù)制到剪切板[Copytoclipboard]整行[Wholeline]—以多行文本(包括解釋)的方式把所選記錄復(fù)制到剪切板,如果復(fù)制時想排除某些列,可將該列的寬度置為最?。ㄔ摍谑S嗟倪吙?qū)⒆兓遥?。整個表格[Wholetable]—以多行文本的方式將整個內(nèi)存映像信息復(fù)制到剪切板,該文本的第一行為窗口標(biāo)題("內(nèi)存映射[Memorymap]"),第二行為列標(biāo)題欄,后面幾行的內(nèi)容為內(nèi)存數(shù)據(jù)記錄。復(fù)制將保持列的寬度。如果復(fù)制時想排除某些列,可將該列的寬度置為最?。ㄔ摍谑S嗟倪吙?qū)⒆兓遥?。七、監(jiān)視與監(jiān)察器[Watchesandinspectors]監(jiān)視[Watch]窗口包含若干個表達式[expressions]。它在第二列里顯示這些表達式的值。OllyDbg會把這些表達式保存到主模塊的.UDD文件中,因此它們在下一次調(diào)試時同樣有效。監(jiān)察器[inspector]是顯示若干變量、1/2維數(shù)組或是選定項目結(jié)構(gòu)數(shù)組[selecteditemsofarrayofstructures]的獨立窗口。它的表達式與監(jiān)視窗口中的基本相同,只是多包含了兩個參數(shù):%A和%B。你可以指定這兩個參數(shù)的界限,OllyDbg將會用所有可能的組合代替表達式中的%A和%B。從0開始一直到界限(不包含界限),并在表格中顯示結(jié)果。參數(shù)%B(列數(shù))的界限不能超過16。例如,如果你指定了表達式%A+%B,并且限定%A和%B的上限為3,你將獲得如下的表格:八、線程[Threads]OllyDbg以簡單而有效的線程管理為特色。如果你單步調(diào)試、跟蹤、執(zhí)行到返回或者執(zhí)行到所選,則線程管理器將停止除當(dāng)前線程以外的所有線程。即使當(dāng)前線程被掛起,它也會將其恢復(fù)。在這種情況下,如果你手動掛起或者恢復(fù)線程,動作將被延期。如果你運行被調(diào)試的應(yīng)用程序,OllyDbg將恢復(fù)最初的線程狀態(tài)。(從調(diào)試器的角度來看,Hit跟蹤[hittrace]和自由運行是等效的)。依據(jù)這種方案,線程窗口可能會有如下五種線程狀態(tài):激活[Active] 線程運行中,或被調(diào)試信息暫停t掛起[Suspended] 線程被掛起跟蹤[Traced] 線程被掛起,但OllyDbg正在單步跟蹤此線程暫停[Paused] 線程是活動的,但OllyDbg臨時將其掛起,并在跟蹤其它的線程結(jié)束[Finished] 線程結(jié)束線程窗口同時也顯示了最后的線程錯誤(GetlastError函數(shù)的返回值)并計算該線程以用戶模式和系統(tǒng)模式(僅NT/2000/XP)運行的時間。線程窗口還會高亮主線程的標(biāo)識符。以下在快捷菜單中可用:刷新[Actualize]—標(biāo)記所有線程為舊的。掛起[Suspend]—掛起線程。恢復(fù)[Resume]—恢復(fù)先前掛起的線程。設(shè)置優(yōu)先級[Setpriority]—調(diào)整進程中線程的優(yōu)先級。以下選項可用:空閑[Idle] —進程中線程的最低優(yōu)先級最低[Lowest]低[Low]標(biāo)準(zhǔn)[Normal]高[High]最高[Highest]時間臨界[Timecritical] —最高優(yōu)先級在CPU窗口打開[OpeninCPU](雙擊)—在CPU窗口中顯示所選線程的當(dāng)前狀態(tài)。復(fù)制到剪切板[Copytoclipboard]:整行[Wholeline]—全部行——以多行文本的形式并帶注釋將所選記錄復(fù)制到剪切板。如果在復(fù)制時想排除某個欄目,可以將該欄的寬度置為最小(欄目的殘留部分將變灰)。整個表格[Wholetable]—整個表格——以多行文本的形式將整個內(nèi)存映象復(fù)制到剪切板,該文本的第一行包含窗口標(biāo)題(“內(nèi)存映射[Memorymap]”),第二行是欄目標(biāo)題,所有后繼行是內(nèi)存數(shù)據(jù)記錄。復(fù)制將保持欄目的寬度。如果在復(fù)制時想排除某些欄目,可以將該欄的寬度置為最小(欄目的殘留部分將變灰)。九、調(diào)用棧[Callstack]調(diào)用棧窗口(快捷鍵:Alt+K)根據(jù)選定線程的棧,嘗試反向跟蹤函數(shù)調(diào)用順序并將其顯示出來,同時包含被調(diào)用函數(shù)的已知的或隱含的參數(shù)。如果調(diào)用函數(shù)創(chuàng)建了標(biāo)準(zhǔn)的堆棧框架(PUSHEBP;MOVEBP,ESP),則這個任務(wù)非常容易完成。現(xiàn)代的優(yōu)化編譯器并不會為??蚣芏傩模設(shè)llyDbg另辟蹊徑,采用了一個變通的辦法。例如,跟蹤代碼到下一個返回處,并計算其中全部的入棧、出棧,和ESP的修改。如果不成功,則嘗試另外一種辦法,這個辦法風(fēng)險更大,速度也更慢:移動棧,搜索所有可能的返回地址,并檢查這個地址是否被先前的已分析的命令調(diào)用。如果還不行,則會采用啟發(fā)式搜索。棧移動[StackWalk]可能會非常慢。OllyDbg僅在調(diào)用棧窗口打開時才會使用。調(diào)用棧窗口包含5個欄目:地址[Address]、棧[Stack]、過程[Procedure],調(diào)用來自[Calledfrom],框架[Frame]。地址[Adress]欄包含棧地址,棧[Stack]欄顯示了相應(yīng)的返回地址或參數(shù)值。函數(shù)[Procedure](或函數(shù)/參數(shù)[Procedure/arguments])顯示了被調(diào)用函數(shù)的地址,在某些情況下,OllyDbg并不能保證該地址是正確的并會添加如下標(biāo)記之一:? 找到的入口點不可靠可能[Maybe] OllyDbg無法找到精確的入口點,報告的地址是用啟發(fā)式算法猜測的。包含[Includes] OllyDbg無法找到入口點,僅知道該函數(shù)包含顯示的地址通過按例標(biāo)題欄上的按鈕或從菜單中選擇“隱藏/顯示參數(shù)[Hide/Showarguments]”,可以在顯示或隱藏函數(shù)的參數(shù)之間切換。調(diào)用來自[Calledfrom]用于顯示調(diào)用該函數(shù)的命令地址。最后一欄是框架[Frame]這一欄默認是隱藏的,如果框架指針的值(寄存器EBP)已知的話,則該欄用于顯示這個值。當(dāng)調(diào)用函數(shù)經(jīng)過分析[analyzed].后,棧移動會更可靠并且迅速。十、調(diào)用樹[Calltree]調(diào)用樹(快捷鍵:在反匯編窗口中Ctrl+K)利用分析[Analysis]的結(jié)果來找出指定函數(shù)過程直接或間接調(diào)用的函數(shù)列表,同時列出指定函數(shù)過程被調(diào)用的地址。為了避免由此可能造成的副作用。調(diào)用樹會判斷選定函數(shù)是否明確地是遞歸的。“明確地”意味著它不會跟蹤目標(biāo)未知的調(diào)用,比如CALLEAX。如果函數(shù)過程中有未知調(diào)用,調(diào)用樹將會添加標(biāo)記“未知目標(biāo)”。某些函數(shù)調(diào)用將會添加如下注釋之一:葉子[Leaf] 不調(diào)用其他函數(shù)純函數(shù)[Pure] 不調(diào)用函數(shù),不會產(chǎn)生副作用單返回[RETN] 只有一個RETN命令系統(tǒng)[Sys] 系統(tǒng)動態(tài)鏈接庫中的函數(shù)。系統(tǒng)動態(tài)鏈接庫定義為保存在系統(tǒng)目錄下的動態(tài)鏈接庫。如果想在調(diào)用樹上移動,可以雙擊“被調(diào)用[Calledfrom]”或“調(diào)用/直接調(diào)用[Calls/Callsdirectly]”兩欄中的地址。調(diào)用樹窗口保存了移動記錄(快捷鍵“—”和“+”)。如果被調(diào)試的程序包含幾個模塊,推薦你分析所有模塊。Calltree不會試圖處理系統(tǒng)函數(shù)。十一、選項[Options]外觀選項[Appearanceoptions]常規(guī)[General]默認[Defaults]對話框[Dialogs]目錄[Directories]字體[Fonts]顏色[Colours]代碼高亮[Codehighlighting]調(diào)試選項[Debuggingoptions](Alt+O)安全[Security]調(diào)試[Debug]事件[Events]異常[Exceptions]跟蹤[Trace]自解壓[SFX]字符串[Strings]地址[Addresses]命令[Commands]反匯編[Disasm]CPU寄存器[Registers]棧[Stack]分析1[Analysis1]分析2[Analysis2]分析3[Analysis3]即時調(diào)試[Just—in—timedebugging]添加到資源管理器[AddtoExplorer]十二、搜索[Search]OllyDbg允許你使用以下的搜索方式:符號名(標(biāo)簽)[Symbolicname(label)]二進制串[binarystring]常量[constant]命令[command]命令序列[sequenceofcommands]模塊間調(diào)用[intermodularcalls]修改過的命令或數(shù)據(jù)[modifiedcommandordata]自定義標(biāo)簽[user—definedlabel]自定義注釋[user—definedcomment文本字符串[textstring]Run跟蹤的記錄[recordinruntrace]參考命令[referencingcommands]十三、自解壓文件[Self—extracting(SFX)files]自解壓文件由提取程序和壓縮的原程序兩部分組成。當(dāng)遇到自解壓文件(SFX)文件時,我們通常希望跳過解壓部分,而直接跳到原始程序的入口(真正的入口)。OllyDbg包含了幾個便于完成這一任務(wù)的功能。通常提取程序的加載地址都在執(zhí)行代碼之外。在這種情況下,OllyDbg將這類文件均視作為自解壓文件(SFX)。當(dāng)自解壓選項[SFXoptions]要求跟蹤真正入口時,OllyDbg在整個代碼節(jié)[Codesection]設(shè)置內(nèi)存斷點,最初這里是空的,或者只包含壓縮數(shù)據(jù)。當(dāng)程序試圖執(zhí)行某個在這個保護區(qū)域的命令,而這些命令不是RET和JMP時,OllyDbg會報告真正的入口。這就是提取工作的原理。上面的方法非常慢。有另外一種比較快的方法。每次讀取數(shù)據(jù)發(fā)生異常時,OllyDbg使這個4K內(nèi)存區(qū)域變?yōu)榭勺x,而使原先可讀的區(qū)域變?yōu)闊o效。而每次發(fā)生寫數(shù)據(jù)異常時,OllyDbg使這個區(qū)域變?yōu)榭蓪?,而使原先可寫的區(qū)域變?yōu)闊o效。當(dāng)程序執(zhí)行在保留的保護區(qū)域中的指令時,OllyDbg報告真正的入口。但是,當(dāng)真正的入口點在可讀或可寫區(qū)域內(nèi)部時,報告的地址就可能有誤。你可以糾正入口位置,選擇新的入口,從反匯編窗口的快捷菜單中選擇“斷點[Breakpoint]—>設(shè)置真正的自解壓入口[SetrealSFXentryhere]”。如果相應(yīng)的SFX選項是開啟的,OllyDbg下次可以迅速而可靠的跳過自提取程序。注意:OllyDbg在跟蹤采取了保護或者反調(diào)試技術(shù)的解壓程序時通常會失敗。十四、單步執(zhí)行與自動執(zhí)行[Step—by—stepexecutionandanimation]你可以通過按F7(單步步入)或F8(單步步過),對程序進行單步調(diào)試。這兩個單步執(zhí)行操作的主要區(qū)別在于:如果當(dāng)前的命令是一個子函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 七年級語文上學(xué)期期中專題二 詞語(成語)辨析及運用(重點強訓(xùn))(原卷版)
- 商務(wù)運輸合同范例
- 牙科入股合同范例
- 撫養(yǎng)老人合同范例
- 國外醫(yī)療服務(wù)合同范例
- 暖通行業(yè)個人合同范例
- 影視轉(zhuǎn)讓合同范例
- 勞動合同范例 車隊
- 廣告制作安裝員工合同范例
- 東莞電梯保養(yǎng)合同范例
- 2024-2025學(xué)年高一上學(xué)期期末數(shù)學(xué)試卷(基礎(chǔ)篇)(含答案)
- 澳門回歸祖國25周年心得體會發(fā)言
- 2024年初級應(yīng)急救援員理論考試復(fù)習(xí)題庫(含答案)
- 中華人民共和國保守國家秘密法實施條例
- 預(yù)防性侵害安全教育
- 北師版八年級數(shù)學(xué)上冊 第四章 一次函數(shù)(壓軸專練)(十大題型)
- 《工程勘察設(shè)計收費標(biāo)準(zhǔn)》(2002年修訂本)-工程設(shè)計收費標(biāo)準(zhǔn)2002修訂版
- 《勞動與社會保障法》機考資料
- 常暗之廂版本規(guī)則簡體修正版本.doc
- DOORS使用手冊
- 軋鋼廠危險源點及預(yù)知預(yù)防
評論
0/150
提交評論