• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Windbg工作中用的不多,所以命令老是記不住,每次使用都要重新查命令,挺煩。
            趁這次培訓(xùn)的機(jī)會(huì)好好測(cè)試和總結(jié)了一下,下次再用就方便多了。

            在這里一起共享一下,如果有錯(cuò)誤,請(qǐng)指正。

            基本知識(shí)和常用命令

            (1)       Windbg下載地址http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx

            安裝完后執(zhí)行windbg –IWindbg設(shè)置成默認(rèn)調(diào)試器

             

            (2)       Windbg的命令分為標(biāo)準(zhǔn)命令,原命令和擴(kuò)展命令,輸入問號(hào)(?)可以顯示所有的標(biāo)準(zhǔn)命令的幫助信息; 元命令以一個(gè)點(diǎn)(.)開始,輸入.help可以顯示所有的原命令的幫助信息;擴(kuò)展命令以嘆號(hào)(!)開始。

             所有命令的具體用法可以通過F1查看Windbg的幫助文件。

             

            (3)       通過設(shè)置符號(hào)文件路徑,讓Windbg自動(dòng)從微軟網(wǎng)站更新系統(tǒng)Dll的符號(hào)文件

            SRV*d:\symbols* http://msdl.microsoft.com/download/symbols

             

            (4)       用分號(hào)(;)作為分隔符,可以在一行輸入多條命令

             

            (5)       按上下箭頭可以瀏覽和選擇以前輸入過的命令

             

            (6)       Ctrl+Break終止一個(gè)很長(zhǎng)時(shí)間沒有完成的命令, Ctrl+Break也可以讓正在運(yùn)行的程序暫停

             

            (7)       Windbg默認(rèn)的數(shù)值進(jìn)制一般是16 可以通過n命令查看和設(shè)置當(dāng)前進(jìn)制,所以我們一般在數(shù)值里帶上進(jìn)制, 0n(十進(jìn)制) 0x(十六進(jìn)制) 0t(8進(jìn)制) 0y(2進(jìn)制) 比如0n20表示20 0x14表示20

             

             

            (8)       可以通過問號(hào)命令(?)顯示表達(dá)式值,雙問號(hào)(??)顯示C++表達(dá)式值, 通過.cls命令清屏

             

            (9)       如果x表示的一個(gè)地址, 則可以通過以下方法獲取x所指向的值

            hi(x) 16 bits

            low(x) 16 bits

            by(x) 返回第一個(gè)byte

            wo(x) 返回第一個(gè)word

            dwo(x) 返回第一個(gè)dword

            qwo(x) 返回第一個(gè)4 word(Quad-word)

            poi(x) 返回第一個(gè)指針值

             

            (10)   函數(shù)調(diào)用如果還沒開始,即一般函數(shù)入口代碼

            push ebp

            mov ebp, esp

            還未執(zhí)行,

             

            [esp+4]表示第一參數(shù)值, [esp+8]表示第二參數(shù),以此類推, [esp]表示的是返回地址

             

            如果上面的入口代碼已經(jīng)執(zhí)行,則一般通過ebp來獲取函數(shù)參數(shù)和局部變量

            [ebp+8]表示第一參數(shù), [ebp+0xC]表示第二個(gè)參數(shù), 以此類推,[ebp+4]表示返回地址 [ebp]表示上一堆棧楨的基地址。

            [ebp-4]表示函數(shù)第一個(gè)局部變量

             

            (11)   條件表達(dá)式

            j<條件表達(dá)式>[Command1];[Command2]

            例如bp consoletest!add "j(dwo(esp+4)==0n10) 'kv;.echo \"break\"';'g'" 表示條件斷點(diǎn),如果consoletest!add的第一個(gè)參數(shù)是10 則打印堆棧,輸出”break”, 并暫停,否則繼續(xù)執(zhí)行

             

            也可用元命令代替

            bp consoletest!add  ".if(dwo(esp+4)==0n10) {kv;.echo \"break\"} .else {g}"

             

            (12)   上下文

            上下文(Context)包括會(huì)話(Session)上下文, 進(jìn)程上下文,寄存器上下文,局部變量上下文。

            會(huì)話上下文和登陸用戶帳號(hào)有關(guān)。進(jìn)程上下文和當(dāng)前調(diào)試的默認(rèn)進(jìn)程有關(guān), 寄存器上下文和當(dāng)前默認(rèn)線程有關(guān)。

            局部變量上下文和當(dāng)前的堆棧楨有關(guān), 比如可以通過.frame [index] 切換當(dāng)前堆棧楨,然后通過dv 顯示當(dāng)前堆棧楨函數(shù)的局部變量(堆棧楨的index0開始,可以通過kn命令顯示堆棧楨索引)

             

            (13)   保存dump文件

            .dump /ma c:\test.dmp 保存full-dump

            .dump /m c:\test.dmp 保存mini-dump

             

            (14)   分析Dump

            一般先 !analyze –v Windbg會(huì)根據(jù)上面命令自動(dòng)分析,

                       然后 ~* kv 打印所有線程的堆棧

             

            (15)   重新加載符號(hào)文件

            .reload –f [name], 強(qiáng)制重新加載某個(gè)模塊的符號(hào)文件

            比如 .reload –f  test.dll

             

            (16)   察看模塊信息

            lm顯示所有模塊信息

            lmf 顯示所有模塊及其路徑
            lmD 顯示所有模塊詳細(xì)信息

            !lmi  [module name] 顯示某一模塊的詳細(xì)信息

             

            (17)   分析調(diào)試符號(hào)

            X [選項(xiàng)] 模塊名!符號(hào)名

                   比如x ntdll!dbg*顯示所有ntdll模塊中以dbg開頭的符號(hào)

                        比如x test!cmyclass::init 顯示test模塊中cmyclass類中的init函數(shù)符號(hào)

             

            (18)   搜索符號(hào)

            ln [address] 搜索離address最近的符號(hào)名(list nearest symbols

             

            (19)   事件處理

            可以通過菜單Debug->Event Filter…設(shè)置

            sx 顯示各個(gè)事件的代碼和目前的處理選項(xiàng)

            sx {e|d|i|n} [command]  , e|d|i|n分別對(duì)應(yīng)Enabled, Disabled,OutputIgnore

            比如 sxe ld user32.dll 表示在加載user32.dll時(shí)設(shè)置的中斷

            sxr 恢復(fù)成默認(rèn)設(shè)置

             

            (20)   單步調(diào)試

                g 繼續(xù)運(yùn)行(go) 熱鍵F5

                t 單步越過(step over), 熱鍵F10

                p 單步進(jìn)入(step into), 熱鍵 F11

             

            (21)   設(shè)置斷點(diǎn)(break point)

            bp [address] [“command”] 設(shè)置軟件斷點(diǎn)。

            比如 bp kernel32!CreateProcessW表示在調(diào)用這個(gè)CreateProcess時(shí)設(shè)置斷點(diǎn)。

            比如bp kernel32!CreateFileW "du poi(esp+4); g" 表示在調(diào)用CreateFile時(shí)打印出文件路徑(第一個(gè)參數(shù)),然后繼續(xù)執(zhí)行

             

            針對(duì)某線程設(shè)置斷點(diǎn),只要在命令前加~線程號(hào):

            比如 ~0 bp 0x441242, 表示0號(hào)線程執(zhí)行到地址0x441242時(shí)中斷

             

            ba [access size] [command]設(shè)置硬斷點(diǎn)。

            其中,access指定訪問方式(e執(zhí)行指令, r讀取數(shù)據(jù),w寫入數(shù)據(jù))

            size 表示監(jiān)視數(shù)據(jù)的大小(1, 2, 4)

            比如ba r4 0x414422, 表示在地址0x414422寫入4字節(jié)數(shù)據(jù)是觸發(fā)斷點(diǎn)

             

            (22)   管理斷點(diǎn)

            bl 列出所有當(dāng)前斷點(diǎn)的狀態(tài)

            bc 清除斷點(diǎn), bc * 清除所有斷點(diǎn), bc 0 清除0號(hào)斷點(diǎn)

            bd 禁用某個(gè)斷點(diǎn)(disable)

            be 打開某個(gè)斷點(diǎn)(enable)

             

            (23)   察看堆棧

            kn [frame count]察看當(dāng)前堆棧及其索引, frame count指定要顯示多少楨

            kb顯示堆棧楨地址,返回地址,參數(shù),函數(shù)名等

            kvkb的基礎(chǔ)上增加了函數(shù)調(diào)用約定等信息, 所以推薦用kv命令察看堆棧.

             

            .frame [frame index] 將當(dāng)前堆棧切換到某個(gè)堆棧楨, 比如.frame 1 切換到第1

            dv 命令察看當(dāng)前堆棧楨的局部變量

             

            (24)   察看和修改寄存器

            r顯示所有寄存器的值

            r  eax=0x100 eax寄存器的改成0x100

             

            (25)   顯示內(nèi)存區(qū)域(dump memory)

            d{a|b|d|D|f|q|u|w} [range]

            其中a表示ASCII碼,b表示byte, d表示DWORD, D表示double, f表示float, q表示8字節(jié), u表示Unicode String w表示word

            Range 表示地址范圍,可以用2種表示:一是起始地址加終止地址, 二是起始地址加L長(zhǎng)度(不是字節(jié)長(zhǎng)度,是單位長(zhǎng)度)

            比如 dw 77e0d827 L10 表示顯示77e0d827開始的10個(gè)word

            比如 dd 77e0d820 77e0d844, 表示顯示 77e0d820 77e0d844之間的所有dword

            比如 du 77e0d820, 表示77e0d820開始的以0結(jié)尾的字符串

             

            dps [range] 顯示某一地址范圍內(nèi)的符號(hào)(display word and symobols)

             

            (26)   顯示數(shù)據(jù)類型(dump symbolic type information)

            dt [模塊名!]類型名

            dt testApp!g_appInstance 表示顯示testApp里全局變量g_appInstance的內(nèi)存布局

            dt 0x0458e850 test!CMyApp 表示將地址0x0458e850test!CMyApp類地址解析,并打印內(nèi)存布局, 所以只有私有符號(hào)才有這個(gè)功能

            如果當(dāng)前堆棧楨是在某個(gè)類函數(shù)內(nèi),可以通過dt this 打印當(dāng)前類的內(nèi)促布局。

             

            (27)   搜索內(nèi)存(search memory)

            s –[type] range pattern

            其中type, b表示byte w表示word, d 表示dword, a表示ASCII stringu表示unicde string

            Range 表示地址范圍,可以用2種表示:一是起始地址加終止地址, 二是起始地址加L長(zhǎng)度(不是字節(jié)長(zhǎng)度,是單位長(zhǎng)度)。如果搜索空間長(zhǎng)度超過256M,L?length

            Pattern指定要搜索的內(nèi)容.

            比如 s -u 522e0000 527d1000 "web"表示在522e0000 527d1000之間搜索Unicode 字符串”web”

            比如s -w 522e0000 L0x100  0x1212 0x2212 0x1234 表示在起始地址522e0000之后的0x100個(gè)單位內(nèi)搜索0x1212 0x2212 0x1234系列的起始地址

             

            (28)   修改內(nèi)存 (edit memory)

            e{a|u|za|zu} address “String”

                        其總zazu表示以0結(jié)尾的AsciiUnicode字符串, au則表示沒有0結(jié)尾

            比如 ezu 0x445634 “abc” 表示在0x445634地址寫如unicode 字符串abc

                        比如ea 0x445634 “abc” 表示在0x445634地址寫入Ascii字符串abc, 不包含結(jié)束符0

             

            e{a|b|d|D|f|q|u|w} address [values]

            其中a表示ASCII碼,b表示byte, d表示DWORD, D表示double, f表示float, q表示8字節(jié), u表示Unicode String w表示word

            比如eb  0x123432 0x41 0x41 0x41 表示在地址0x123432 寫入3個(gè)0x41

             

            (29)   觀察內(nèi)存屬性

            !address [address]

            比如!address 0x414453, 顯示地址0x414453所在區(qū)域的內(nèi)存屬性


            !heap -h 顯示所有的內(nèi)存堆(heap)

            (30)   反匯編某一地址

            u address, 比如u 0x410040表示反匯編地址0x410040的代碼

            uf  反匯編某個(gè)函數(shù), 比如uf test!main
            ub 反匯編某地址之前的代碼,比如ub 0x 
            0x410040 L20

             

            (31)   進(jìn)程線程控制

            ~*命令顯示當(dāng)前所有線程的詳細(xì)信息

            ~[Index]   n增加索引為Index的線程的掛起計(jì)數(shù)

            ~[Index]  m減少索引為Index的線程的掛起計(jì)數(shù)

            比如通過~2 n 增加2號(hào)線程的掛起計(jì)數(shù)后, 執(zhí)行g命令(繼續(xù)運(yùn)行) 這時(shí)2號(hào)線程會(huì)依然暫停運(yùn)行。

             

            ~[Index]  f 凍結(jié)某一線程的執(zhí)行

            ~[Index] u 解凍某一線程的執(zhí)行

            ~[Index]  g只運(yùn)行線程號(hào)為index的線程

            ~[Index] s 切換當(dāng)前線程

             

            比如 ~2 kv; ~2 r 可以打印2號(hào)線程的當(dāng)前堆棧和寄存器

            ~* kv可以打印所有線程堆棧。

             

            !runaway 顯示所有線程的CPU消耗

             

            |. 顯示當(dāng)前調(diào)試進(jìn)程

            |* 顯示當(dāng)前調(diào)試中的所有進(jìn)程

            |[nIndex] s 切換當(dāng)前調(diào)試進(jìn)程

             

            !peb 顯示進(jìn)程信息塊(process environment block)

            !teb 顯示線程信息塊(thread environment block)

             

             

            (32)   線程死鎖

            !locks 顯示死鎖

            !handle 列出當(dāng)前進(jìn)程所handle

            !handle [index] f, 顯示某個(gè)handle的詳細(xì)信息

             

            (33)   自動(dòng)調(diào)試子進(jìn)程

            .childdbg 0

            Disable child process debugging

             

            .childdbg 1

            Attach child process automatically

             

            (34)   腳本支持

            $$>< filename 加載腳本文件,并將腳本里的換行符自動(dòng)換成;(分號(hào))

            $t0~$t19為偽寄存器,可用來存儲(chǔ)臨時(shí)值, 使用偽寄存器時(shí)前面盡量加@符號(hào)以加快搜索

            .printf 可以輸出格式化信息

            as Name EquivalentLine 別名,類似define , 比如 r $t0=poi(esp+4); as $filename $t0

            ad Name 刪除別名, ad*刪除所有別名

            al 列出所有別名

            .block {…}重新開始替換里面的所有別名

            ${alias}強(qiáng)制要求替換里面的別名, ${/v:alias}不要替換里面的別名

            運(yùn)用別名的腳本樣例:

            bp Kernel32!CreateFileW "
            r $t0=poi(esp+4)
            as /mu ${/v:$fileName} @$t0
            .block
            {
            .if( $sicmp(\"${$fileName}\", \"C:\\11.txt\")==0)
            {
            .echo OK
            .printf \"done:%mu\", @$t0
            }
            .else
            {
            .echo error
            }
            }
            ad ${/v:$fileName}
            gc
            "

             

            FAQ

            (1)       如何在某個(gè)窗口收到某個(gè)消息時(shí)設(shè)置斷點(diǎn)? 比如在我想在某窗口收到系統(tǒng)最小化消息時(shí)設(shè)置斷點(diǎn),該怎么操作?

             

            其實(shí)就是監(jiān)視窗口處理函數(shù)MsgProc(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0)消息:首先通過Spy察看窗口句柄, 比如為0x350d72 通過Spy也可以看到窗口消息處理函數(shù)的地址,比如00E814DE 察看WM_SYSCOMMAND的值(0x0112) 察看SC_MINIMIZE的值0xF020 因此我們可以寫入如下條件斷點(diǎn):

            bp 0xE814DE

            "j((dwo(esp+4)==0x350d72)&(dwo(esp+8)==0x0112)&(dwo(esp+0xc)==0xF020)) ‘kv’;’g’"

            上面的命令表示在調(diào)用窗口函數(shù)時(shí)如果符合我們的條件,則打印堆棧(kv)并暫停,

            否則繼續(xù)執(zhí)行(g).

             

             

            (2)       堆棧楨的含義
                 

            堆棧生成原理:

            堆棧從高地址向低地址生長(zhǎng),

            __stcall__cdecl調(diào)用約定都是從函數(shù)參數(shù)的右到左壓棧.

            因此調(diào)用某一函數(shù)比如int add(int a, int b) { return a + b;}

                      我們調(diào)用 add(1, 2)函數(shù)時(shí),

                    從堆棧高地址到低地址依次入棧, 依次是參數(shù)2入棧, 參數(shù)1入棧,返回地址(ret address)入棧,然后跑到add函數(shù)執(zhí)行入口代碼push ebp   ,  mov ebp, esp , 即上一函數(shù)楨的基址(ebp)入棧, 然后將當(dāng)前的堆棧指針值賦給ebp(保存當(dāng)前的堆棧指針給ebp, 這樣可以用新的ebp操作當(dāng)前函數(shù)的局部變量,該函數(shù)內(nèi)部再調(diào)用某個(gè)函數(shù)時(shí)也能通過新ebp知道上一函數(shù)的基棧地址, 所有函數(shù)調(diào)用都以此類推)

                  所以從堆棧低地址到高地址依次表示ebp(上一函數(shù)的堆棧楨基址), ret address, parameter 1, parameter 2…

            (3)       如何用Windbg寫高級(jí)腳本

            參考http://blogs.msdn.com/b/debuggingtoolbox/archive/tags/windbg+scripts/default.aspx

             


             (4) 如何將64位Dump轉(zhuǎn)成32位
                  .load wow64exts 回車
                  !sw 回車

            posted on 2012-06-07 19:07 Richard Wei 閱讀(23029) 評(píng)論(1)  編輯 收藏 引用 所屬分類: windbg

            FeedBack:
            # re: Windbg實(shí)用手冊(cè)
            亚洲va中文字幕无码久久| 色综合久久久久无码专区| 久久精品国产第一区二区三区| 欧洲国产伦久久久久久久| 97精品伊人久久久大香线蕉 | 精品久久久久久亚洲| 一本一本久久aa综合精品 | 尹人香蕉久久99天天拍| 久久久精品久久久久久| 国产伊人久久| 青青久久精品国产免费看| 日本久久久久久久久久| 久久久久久久久66精品片| 欧美精品九九99久久在观看| 久久91精品国产91| 久久夜色精品国产亚洲| 亚洲女久久久噜噜噜熟女| 久久精品国产亚洲AV无码麻豆| 久久久噜噜噜www成人网| www.久久热| 国产伊人久久| 欧美日韩精品久久免费| 久久久亚洲欧洲日产国码二区| 国产一级做a爰片久久毛片| 51久久夜色精品国产| 午夜精品久久久久成人| 伊人久久综合成人网| 高清免费久久午夜精品| 久久久国产精品| 热re99久久精品国99热| 久久综合久久综合久久| 性欧美大战久久久久久久| 色欲综合久久躁天天躁蜜桃| 亚洲国产精品久久久久网站| 亚洲欧洲久久av| 久久精品国产免费| 欧美日韩精品久久免费| 国产高潮久久免费观看| 久久久久免费精品国产| 精品久久久久久99人妻| 性色欲网站人妻丰满中文久久不卡|