windbg命令詳解(一)

2021-02-19 合天智匯
1、 !address eax

查看對應內存頁的屬性


2、 vertarget

顯示當前進程的大致信息


3 、!peb

顯示process Environment Block

4、 lmvm

可以查看任意一個dll的詳細信息
例如:我們查看cyusb.sys的信息


5.reload !sym 加載符號文件


6、 lmf

列出當前進程中加載的所有dll文件和對應的路徑

7、 r

命令顯示和修改寄存器上的值
r命令顯示和修改寄存器上的值


0:018> r eax=0 修改了寄存器,把eax的值修改為0x0

8、 d

命令顯示esp寄存器指向的內存
如下


用dd命令直接指定054efc14地址


注意:第二個d表示DWORD格式,此外還有db(byte),du(Unicode),dc(char)等等。

數據查看指令 d{a|b|c|d|D|f|p|q|u|w|W}
d{b|c|d|D|f|p|q}分別是顯示:
byte&ASCII, double-word&ASCII,double-word,double-precision,float,pointer-sized,quad-word數據;
DA用於顯示ASCII,DU用於顯示UNICODE;
BYB,BYD,顯示binary和Byte及binary和DWORD
補充一個DV,用於查看本地變量用的

9、 e

命令可以用來修改內存地址
跟d命令一樣,e命令後面也可以跟類型後綴,比如ed命
令表示用DWORD的方式修改。下面的命令把054efc14地址上的值修改為11112222。
0:018>ed 054efc14 11112222
修改後可以用dd命令來查看內存。
0:018>dd 0543fc14 L4 L4參數指定內存區間的長度為4個DWORD,這樣輸出只有1行,
而不是8行了。

10、s

命令用來搜索內存具體見help文檔
11!runaway 可以顯示每一個線程的cpu消耗
0:018> !runaway 結果如下:
0:83c 0 days 0:00:00.406
13:bd4 0 days 0:00:00.046
10:ac8 0 days 0:00:00.046
24:4f4 0 days 0:00:00.031
上面輸出的第一列是線程的編號和線程ID,後一列對應的是該線程在用戶態模式中的
總的繁忙時間。
在該命令加上f參數,還可以看到內核態的繁忙時間,當進程內存佔用率比較高的時候
,通過該命令可以方便的找到對應的繁忙線程。

11、 ~     命令是用來切換目標線程

0:018> ~ 可以顯示線程的信息
0:018> ~0s   把當前的線程切換到0號線程,也就是主線程,切換後提示符會變為0:000.

12、~* 命令列出當前進程中的所有線程的詳細信息

13、~*kb    命令列出所有線程的堆棧

14、 k     命令用來顯示當前線程的堆棧,如下

0:018> k
跟d命令一樣,k後面也可以跟很多後綴,比如kb kp,kn,kv,kl等,這些後綴控制了顯示的格式和信息。
棧指令k[b|p|P|v]
這四條指令顯示的內容類似,但是每個指令都有特色;

KB顯示三個參數;

Kp顯示所有的參數,但需要Full Symbols或Private PDBSymbols支持。KP與Kp相似,只是KP將參數換行顯示了;

Kv用於顯示FPO和調用約定;

KD,用於顯示Stack的Dump,在跟蹤棧時比較有用。
這些指令區分大小。

15、u   命令把指定地址上的代碼翻譯成彙編輸出

0:018> u 7739d023
USER32!NtUserWaitMessage:
7739d023 b84a120000 mov eax,0x124a
7739d028 ba0003fe7f mov edx,0x7ffe0300
7739d02d ff12 call dword ptr [edx]
7739d02f c3 ret
如果符號文件加載正確,可以用uf命令直接反彙編整個函數,比如uf USER32! NtUserWaitMessage

16、x    查找符號的二進位地址如下

0:018> x msvcr!printf
77bd27c2 msvcrt!printf =
上面的命令找到了printf函數的入口地址在77bd27c2

0:001> x ntdll!GlobalCounter
7c99f72c ntdll!GlobalCounter =
上面的命令表示ntdll!GlobalCounter這個變量保存的地址是7c99f72c。


注意:符號對應的是變量和變量所在的地址,不是變量的值,上面只是找到GlobalCounter這個變量的值是7c99f72,要找到變量的值,需要用d命令讀取內存地址來獲取。

X命令還支持通配符,比如x ntdll !*命令列出ntdll模塊中的所有的符號,以及對應的二進位地址。

17、 dds 列印內存地址上的二進位值

同時自動搜索二進位值對應的符號。
比如要看看當前**中保存了那些函數地址,就可以檢查ebp指向的內存
0:018>dds ebp
0013ed98 0013ee24
0013ed9c 75ecb30f BROWSEUI!BrowserProtectedThreadProc+0x44
0013eda0 00163820
0013eda4 0013ee50
0013eda8 00163820
0013edac 00000000
0013edb0 0013ee10
0013edb4 75ece83a BROWSEUI!__delayLoadHelper2+0x23a
0013edb8 00000005
0013edbc 0013edcc
0013edc0 0013ee50
0013edc4 00163820
0013edc8 00000000
0013edcc 00000024
0013edd0 75f36d2c BROWSEUI!_DELAY_IMPORT_DESCRIPTOR_SHELL32
0013edd4 75f3a184 BROWSEUI!_imp__SHGetInstanceExplorer
0013edd8 75f36e80 BROWSEUI!_sz_SHELL32
0013eddc 00000001
0013ede0 75f3726a BROWSEUI!urlmon_NULL_THUNK_DATA_DLN+0x116
0013ede4 7c8d0000 SHELL32!_imp__RegCloseKey (SHELL32+0x0)
0013ede8 7c925b34 SHELL32!SHGetInstanceExplorer

這裡dds命令從ebp指向的內存地址0013ed98開始列印,第一列是內存地址的值,第二列是地址上對應的二進位數據,第三列是二進位對應的符號。上面的命令自動找到了75ecb390f對應的符號是BROWSEUI!BrowserProtectedThreadProc +0x44.

Com interface 和c++ vtable裡面的成員函數都是順序排列的。所以,dds命令可以方便的找到虛函數表中的具體的函數地址,比如用下面的命令可以找到OpaqueDatinfo類型中虛函數的實際函數地址。
首先通過x命令找到OpaqueDataInfo虛函數地址
0:000> x ole32!OpaqueDataInfo::vftable』
7768265c ole32!OpaqueDataInfo::`vftable'' =
77682680 ole32!OpaqueDataInfo::`vftable'' =
接下來dds命令可以列印出虛函數表中的函數名字
0:000> dds 7768265c


18 .frame

命令在棧中切換以便檢查局部變量。
要查看局部變量的需要如下:

19、1    查看線程的callstack


第一列的號稱為Frame num,通過.frame命令就可以切換到對應的函數中檢查局部變量,比如我們檢查CYUSB+0x916,這個函數的frame num是0,於是,我們如下:

19、2   iframe    切換到指定行號的函數中



19、3   然後調用 x  顯示當前frame的局部變量,比如這個函數中有兩個局部變量

pcls和rawptr
0:018> x
0012fced pcls = 0x0039ba80
0012fcd8 rawptr = 0x0039ba80

20、 dt  格式化顯示資料

Dt   命令格式化顯示變量的資料和結構
0:000> dt pcls
Local var @ 0x12fce4 Type MyCls*
0x0039ba80
+0x000 str : 0x00416648 'abcd'
+0x004 inobj : inner
上面的命令列印出pcls的類型是MyCls指針,指向的地址是0x0039ba80,其中的兩個class成員的偏移分別在+0和+4,對應的值在第2列顯示。加上-b -r參數可以顯示inner class和數組的信息:
0:000> dt pcls -b -r
Local var @ 0x12fce4 Type MyCls*
0x0039ba80
+0x000 str : 0x00416648 'abcd'
+0x004 inobj : innner
+0x000 arr : 'abcd'
[00] 97 ''a''
[01] 98 ''b''
[02] 99 ''c''
[03] 100 ''d''
[04] 0 ''''
[05] 0 ''''
[06] 0 ''''
[07] 0 ''''
[08] 0 ''''
[09] 0 ''''
對於任意的地址,也可以手動指定符號類型來格式化顯示。比如把0x0039ba80地址上的數據用MyCls類型來顯示:
0:000> dt 0x0039ba80 MyCls
+0x000 str : 0x00416648 'abcd'
+0x004 inobj : innner

21、  bp   設定調試斷點

(1)比如可以這樣寫:0:018>bp notepad!WinMain 在notepade的winmain函數處下斷點。
斷點的位置可以用符號來表示,如上,也可以直接用地址以及windbg的Pseudo_Register(虛擬寄存器)。

比如,我們用$exentry表示進程的入口,那麼可以用bp @$exentry在進程的入口設置斷點。

(2)如果notepade的winmain的入口地址為01006420,那麼斷點也可以這麼寫:
Bp 01006420
bp mysource.cpp:143` 'j (poi(MyVar)」0x20) ''''; ''g'' '
意思就是:當myvar的值等於0x20時,g命令繼續執行;
(3)下面一個設置條件斷點
0:001> bp exceptioninject!foo3 「k; .echo 『breaks』 ; g」
在exceptioninject!foo3上設置斷點後,每次斷下來後,先用k顯示callstack,然後用.echo命令輸出簡單的字符串『breaks』,最後g命令繼續執行。
(4)下面看一個更複雜的設置條件斷點的例子:
ba w4 execptioninject!i 」j(poi(exceptioninject!i)<0n40) 『.printf//」exceptioninject!i value is :%d//」,poi(exceptioninject!i); g』 ; 『.echo stop!』 」
首先ba w4 exceptioninject!i 表示在修改exceptioninject!i這個全局變量的時候,停下來;
j(judge)命令的作用就是對後面的表達式作條件判斷如果為true,執行第一個單引號裡面的命令,否則執行第2個單引號裡面的命令,
條件表達式是(poi(exceptioninject!i)<0n40),在windbg中excepioninject!i符號表示符號所在的內存地址,而不是符號的數值,相當於C語言的&操作符的作用,poi命令就是取這個地址上的值,相當於c語言的*操作符。

所以這個條件判斷的意思就是判斷exceptioninject!i的值,是否小於十進位的40。如果為真,就執行第一個單引號,『.printf//」exceptioninject!i value is :%d//」,poi(exceptioninject!i); g』,如果為假,就執行第二個單引號『.echo stop!』
第一個單引號裡有三個命令,.printf .echo 和g。這裡的printf和c語言的printf函數語法一樣,不過由於這個printf命令本身是在ba命令的雙引號裡面,所以需要用//來轉義print中的引號。第一個引號的作用是:列印出當前exceptioninject!i的值,.echo命令換行 g命令繼續執行
第二個引號的作用就是顯示stop,由於後面沒有g命令,所以windbg會停下。

22、  bm   使用模式匹配設置斷點

這個功能需要符號表的支持,bm可以通過模式一次設置多個斷點,比如
bm mydriver!FastIO* 可以將所有與FastIO*模式匹配的函數下設置斷點,比如FastIoRead ,FastIoWriter等函數都會被設置上斷點。需要注意的是,bm命令需要full or export symbols支持。

23、 ba     對內存訪問設置斷點 break on access

就是對於內存訪問設置斷點,對於在多核處理或者多核處理器調試的時候很有用,對於調試多線程也很有用,比如說,我們可以對一個全局變量設置斷點,
ba mydriver!gMonitoreedDevices , 如果你認為這個變量的值被莫名的修改了,相信通過ba設置的斷點,你可以很快找到是誰修改的。

也可以這樣
ba w4 0x4000000 'kb;g' 當0x4000000地址有寫操作時,進入斷點 。w表示類型為寫 4表示長度為4個字節

原創作者;Jackchenyj

 推薦實驗



相關焦點

  • windbg命令詳解(二)
    錯過開頭的看這: windbg命令詳解(一)
  • 使用 VMware + win10 + VirtualKD + windbg 從零搭建雙機內核調試環境
    本文總結了使用VMware15.5 + win10 + virtualkd + windbg搭建雙機內核調試環境。VMware版本:15.5 pro。可以到VMware 官網下載地址下載最新版本。我的物理主機系統:Win10 1909。其它版本的Windows也可以    ,VMware15.5最低支持Win7系統。
  • Linux curl命令詳解
    一、curl命令語法: 二、curl命令參數詳解:由於linux curl功能十分強大,所以命令參數十分多,下表只是愛E族(aiezu.com)帥選出來的部分參數,更多參數請運行「man curl」命令查看。
  • 如何搭建一個跨虛擬機 WinDbg 調試環境
    常用命令symbols.reload /f => force symbol reload .reload /unl module => force symbolpte VA => dump PTEs for VA參考及來源:https://syscall.eu/blog/2020/03/29/windbg-vm/
  • linux打包命令tar詳解
    Linux打包命令之tar詳解1、命令:tara)功能:將多個文件或目錄打包在一起,可通過調用gzip或zip 實現壓縮
  • Linux mount 命令詳解
    作者:sparkdev出處:http://www.cnblogs.com/sparkdev/Linux mount 命令詳解
  • hadoop之yarn命令詳解
    一、yarn命令概述[root@lgh ~]# yarn -help Usage: yarn [--config confdir] COMMANDwhere COMMAND is one of:  resourcemanager -format-state-store   deletes the RMStateStore  resourcemanager
  • Linux必備的命令
    4.1 cd命令詳解cd命令主要用於目錄切換,例如cd /home表示切換至/home目錄,cd /root表示切換至/root目錄,cd ../表示切換上一級目錄,cd . 4.3 pwd命令詳解pwd命令主要用於顯示或者查看當前所在目錄路徑,如下圖所示:
  • 最實用的網絡命令 Ping命令使用詳解 漲知識了!
    平常我們利用ping命令可以檢查網絡是否連通,可以很好地幫助我們分析和判定網絡故障,今天小編主要詳細介紹下PING命令的使用方法。ping 英文全稱為Packet Internet Groper,意為「網際網路包探索器」,它屬於一個通信協議,是TCP IP協議的一部分。利用ping命令可以檢查網絡,幫助用戶分析和判定網絡連接故障。
  • 【linux】常用命令之scp命令
    閱讀大概需要1分鐘跟隨小博主,每天進步一丟丟
  • 必備linux命令詳解
    ;less在查看文本時的常用動作命令如下Enter      向下移動一行y          向上移動一行Space      向下滾動一屏b          向上滾動一屏d          向下滾動半屏u          向上滾動半屏g          跳到第一行G
  • [原創]Ansible程序組成和基礎命令詳解
    目錄2.1 Ansible目錄結構介紹2.2 Ansible配置文件解析2.3 Ansible命令用法詳解小編有話說作為一款日常工作所需的核心工作,我們有必要知道其目錄分布及各目錄功能,通過如下命令我們可以獲取Ansible所有文件存放路徑:# rpm -ql ansible輸出內容較多但大致分為如下幾類:配置文件目錄:/etc/ansible/執行文件目錄:
  • 《超級機器人大戰V》額外動作與額外命令等新系統圖文詳解
    下面就來看看超級機器人大戰V新系統圖文詳解吧,希望對大家有所幫助。 在這次... 《超級機器人大戰V》較前作來說新增添了四個系統,分別是額外動作、額外指令、單位特殊能力和副指令,它們分別都有什麼作用呢?下面就來看看超級機器人大戰V新系統圖文詳解吧,希望對大家有所幫助。
  • Linux的30 個實例詳解 TOP 命令!
    在本篇中,我們會探索top命令的細節。top命令是一個交互命令。在運行top的時候還可以運行很多命令。我們也會探索這些命令。(譯註:不同發行版的top命令在各種細節有不同,如果發現不同時,請讀你的幫助手冊和命令內的幫助。)1. Top 命令輸出首先,讓我們了解一下輸出。top命令會顯示系統的很多信息。
  • Linux useradd命令添加新用戶圖文詳解
    [選項] 用戶名該命令常用的選項及各自的含義,如表 1 所示。此行命令就表示創建 linuxmi 普通用戶。不要小看這條簡單的命令,它會完成以下幾項操作:1.注意,此文件中各選項值的修改方式有 2 種,一種是通過 Vim 文本編輯器手動修改,另一種就是使用文章開頭介紹的 useradd 命令,不過所用的命令格式發生了改變:useradd -D [選項] 參數用此命令修改 /etc/default/useradd 文件,可使用的選項如表 3 所示。
  • Docker(三):Dockerfile 命令詳解
    Dockerfile 指令詳解1 FROM 指定基礎鏡像FROM 指令用於指定其後構建新鏡像所使用的基礎鏡像。FROM 指令必是 Dockerfile 文件中的首條命令,啟動構建流程後,Docker 將會基於該鏡像構建新鏡像,FROM 後的命令也會基於這個基礎鏡像。
  • 這 9 個 Bash 命令,差點讓我丟了工作
    在開始之前,最後一次警告:不要在重要的系統上執行這些命令!我決定不從經典的rm -rf 說起,而是先說它的一個變種:alias cd='rm -rf'命令詳解alias 用於聲明命令的別名或快捷方式。語法是 alias alias_name="command_to_run"。
  • Docker命令大全及Dockerfile詳解(附示例)
    remove docker docker-engine docker.io sudo apt-get update # Step 2: 安裝 apt 依賴包,用於通過HTTPS來獲取倉庫 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common # Step 3: 添加
  • Linux crontab命令:循環執行定時任務(詳解版)
    接下來,在介紹 crontab 命令。該命令和 at 命令類似,也是通過 /etc/cron.allow 和 /etc/cron.deny 文件來限制某些用戶是否可以使用 crontab 命令的。表 2 crontab 時間表示項目含義範圍第一個"*"一小時當中的第幾分鐘(minute)0~59第二個"*"一天當中的第幾小時(hour)0~23第三個"*"一個月當中的第幾天(day)1~31第四個"*"一年當中的第幾個月(month)1~12第五個"*"一周當中的星期幾(week)0~7(0和7都代表星期日)在時間表示中,還有一些特殊符號需要學習,如表