从堆里找回“丢失”的代码相关命令简介
前言
在上一篇文章中,我們主要使用了三個命令 !address,s,.writemem 把丟失的代碼成功的保存到了文件中。本文簡單介紹一下上文用到的這三個命令。
windbg 中的地址范圍語法
很多命令都會用到 地址范圍。比如 s 命令,.writemem 命令。
在 windbg 中可以通過兩種形式指定地址范圍。起始地址 L長度 或者 起始地址 終止地址。在上一篇文章中,我們使用的是 起始地址 終止地址 的形式。我們也可以使用用 起始地址 L長度 的形式來指定一個范圍。其中的 L 必不可少,而且,L 后面跟的是要查看的單位數量,不是字節數。比如,我們查看起始地址 0xc0000 處對應的內容,同樣是L4,按字節(db),按四字節(dd)和按八字節(dq)查看,顯示的內存范圍是不一樣的
display-by-range有兩點需要注意:
如果搜尋的范圍超過256MB,我們需要使用 L? ,而不是 L。
我們可以使用 L- 表示給定的 address 是終止位置,而不是起始位置。
!address 命令
該命令可以用來查看指定地址對應的信息,也可以用來查找過濾。在之前的文章里使用 !address 查看過某個地址對應的信息。上一篇文章中我們主要使用的是這個命令的查找過濾功能(通過 ?-f 參數,f 是 filter 的縮寫)。
我們可以根據用途過濾,具體參考下表。
還可以根據內存保護屬性過濾,具體參考下表。
還可以根據內存狀態過濾,具體參考下表。
還可以根據內存類型過濾,具體參考下表。
-f 參數需要配合 -c:"command" 在查找的過程中執行對應的命令。
option-cs 命令
該命令可以用來查找符合特定模式的內存。s 是 Search Memory 的縮寫。
s?[-[[Flags]Type]]?Range?Pattern? s?-[[Flags]]v?Range?Object? s?-[[Flags]]sa?Range? s?-[[Flags]]su?Range?這里僅截取 Type 的用法。更多用法請參考官方文檔。
search-type.writemem 命令
該命令比較簡單,.writemem FileName Range。
FileName :如果路徑中有空格,需要使用 "" 引起來,這個應該是常識了。
Range :相關的語法已經在本文開始介紹了。
總結
我們在上一篇文章中用到的命令(!address -f:heap,PAGE_READWRITE -c:"s -u %1 %2 args.Contains(\"--all\")")的意思是:遍歷可讀寫的堆內存,對每個內存區域調用 s 命令,搜尋匹配 args.Contains("--all") 的 unicode 字符串。s 命令需要的地址范圍是通過 !address 命令傳遞過來的 %1(起始地址) 和 %2(結束地址) 傳遞的。
參考資料
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-address
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-writemem--write-memory-to-file-
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/address-and-address-range-syntax
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/s--search-memory-
歡迎留言交流
需要你的
總結
以上是生活随笔為你收集整理的从堆里找回“丢失”的代码相关命令简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青年节寄语和新课程免费上架
- 下一篇: 慎用ToLower和ToUpper,小心