Windbg簡單命令
__stdcall呼叫慣例的棧結構
ebp+8 |函數的第一個參數
ebp+4 |函數的返回地址
ebp |ebp
ebp-4 |局部變數
1.短命令
2.元命令(.)
3.擴充命令(!)
獲得進程peb============================================================
!peb
獲得線程teb============================================================
!teb
顯示從系統函數中返回的錯誤=================================================
!gle
調試=================================================================
t: 逐步執行
~.t:在當前線程處逐步執行(防止線程切換)
p: 步過
pc: 執行到下一個子常式call處
g: 繼續執行
g 地址: 繼續執行到指定地址
gu : 執行到返回
~0 gu : 除了線程0外,凍結其他所有的線程
u .l4 : 對函數進行反組譯碼以找出一個合適的執行停頓點
偽寄存器==============================================================
r + 名字
名字:代碼
$proc:當前的進程
$thread:當前的線程
$tpid:當前的進程標識
$tid:當前的線程標識
$peb:進程式控制制塊
$teb:線程環境塊
處理器當前執行的代碼是什麼=================================================
u(Unassaembly)反組譯碼命令
u.:反組譯碼當前$ip地址上的8條指令
uf.:反組譯碼包含當前$ip的整個函數
ub.:反組譯碼當前$ip之前的8條指令
u.L2:反組譯碼當前$ip之後的2條指令
ub.L2:反組譯碼當前$ip之後的2條指令
u..+a:反組譯碼在$ip+10之間的10條指令
當前的調用棧是什麼=======================================================
k(Stack Back Trace)棧回溯命令
kp 5:顯示在調用棧中前5個函數以及他們的參數
kf 5:顯示前面的5個函數,第一個數字是函數使用的棧大小
k = 棧基指標 棧頂指標 指令指標:當k命令無法解析棧的時候可以手動指定
在代碼中設定斷點=========================================================
bp: 參數可以是1.設定斷點的地址2.斷點選項3.斷點限制4.一個字串表示斷點觸發時需要執行的命令(可以用;號隔開)
例子:~0 bp Program!CClass::Func "resp;g"
線上程0上設定斷點,並在斷點觸發時執行"resp"命令和"g"命令
bl: 列出所有斷點
bc: 清除所有斷點
核心中使用斷點:
bp ntdll!RtlAllocateHeap 所有進程都會觸發的點
bp /p @$proc ntdll!RtlAllocateHeap "!process -1 0;g" :在ntdll!RelAllocateheap上設定斷點,只有EPROCESS為@$proc時才會觸發,並執行命令
使用者態時使用斷點:
bm Program!*class* : 在類class的所有方法上加上斷點
bu ole32!CoInitializeEx沒有載入的動態連結程式庫上使用延遲斷點,當連結庫載入的時候自動化佈建
變數的值是什麼===========================================================
dv:不帶參數的dv顯示局部變數的值
dv Program!gFun* :顯示匹配模式的值
dv /i :在第2列顯示符號類型(公私人?)和參數類型(局部變數,參數..)
dv /v 變數名:顯示變數儲存的地址
dt:解析變數的資料類型
dt this :解析this變數的類型(為某個類指標)
dt 類名 地址: 按照類名的類結構來解析指定地址的記憶體
如何查看記憶體============================================================
dc 地址 長度: 如 dc 0x005f0ea0 l4 : 轉存出0x005f0ea0上4個雙字資料
dd 地址: 查看地址上的資料
du 地址: 轉存出地址上的unicode字串
da 地址: 轉存出地址上為ascii的字串
db 地址 長度: 如 db 0x005f0ea0 l4 : 將4個位元組轉存為一個位元組數組
dyb 地址 長度: 以二進位格式轉存為4個位元組;以二進位格式轉存為4個雙字
dyd 地址 長度: 轉存出4個浮點數
dp* 地址: 重複以某種格式讀取地址 , 如dpu就是用地址數群組轉換成unicode字串輸出
如何搜尋記憶體============================================================
s -d L10000000/4 C0000005 :在地址空間前的256MB中搜尋C0000005
設定記憶體訪問斷點=========================================================
ba w4 gGlobal+0: 在gGlobal+0地址處檢測4個位元組上的寫入操作
在記憶體位置上包含的是什麼===================================================
!address 地址/寄存器/堆/空: 為空白時所有並且枚舉所有的記憶體地區並給出詳細的資訊
怎麼改變地址上的值=======================================================
ed 地址 值: