windbg-内存破坏实例分析
以下實(shí)例來自AWD
代碼:
[cpp]?view plaincopy編譯,生成Release,運(yùn)行,選1再選2再選1,程序崩潰,打開Dump:
[cpp]?view plaincopy加載符號(hào)文件:
[cpp]?view plaincopy查看堆棧:
[cpp]?view plaincopy看下58行代碼,使用了???g_AppInfo->PrintAppInfo();
我們猜測(cè),g_AppInfo的兩個(gè)成員無(wú)效,因?yàn)閣printf調(diào)用的就是它們
找到g_AppInfo,列出它的成員:
[cpp]?view plaincopy注意,這里dt要用CAppInfo告訴它解析的地址類型
那我們?cè)賮砜纯催@兩個(gè)局變量的內(nèi)容:
[cpp]?view plaincopy我們發(fā)現(xiàn)第一個(gè)變量竟然是不可訪問的,找到問題了,
[cpp]?view plaincopy原來第一個(gè)變量竟然成了字符串Corrupt,查看代碼,我們發(fā)現(xiàn)在按2時(shí),程序強(qiáng)行把字符串"Corrupt"寫入了
?
?
一些的指導(dǎo)性的建議和策略:
1通過命令dc將指針的內(nèi)存內(nèi)容轉(zhuǎn)儲(chǔ)出來,dc可以將內(nèi)存內(nèi)容以雙字形式轉(zhuǎn)儲(chǔ)出來,如果在輸出中看到有任何的字符串,那么可以通過命令da或du把字符串轉(zhuǎn)儲(chǔ)出來
2通過!address收集關(guān)于內(nèi)存的信息,!address可以告訴你內(nèi)存的類型(如私有內(nèi)存),保護(hù)級(jí)別(讀取和寫入),狀態(tài)(已提交或保留)和用途(?;蚨?
3.通過dds命令將內(nèi)存轉(zhuǎn)儲(chǔ)為雙字或者符號(hào),這有助于將內(nèi)存和特定的類型關(guān)聯(lián)起來,
4.通過dpp命令對(duì)指針解引用,并且以雙字形式轉(zhuǎn)儲(chǔ)出內(nèi)存的內(nèi)容,如果有任何一個(gè)雙字匹配某個(gè)符號(hào),那么這個(gè)符號(hào)也會(huì)被顯示,如果在指針指向的內(nèi)存中包含了一個(gè)虛函數(shù)表,那么
這種技術(shù)是非常有用的
5.通過dpa和dpu將指針指向的內(nèi)存分別顯示為ASII格式和Unicode格式
6.如果內(nèi)存的內(nèi)容是個(gè)很小的數(shù)值(4的值數(shù))那么它可能是一個(gè)句柄,可以通過!handle來轉(zhuǎn)儲(chǔ)這個(gè)句柄的信息.
總結(jié)
以上是生活随笔為你收集整理的windbg-内存破坏实例分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用python爬虫抓站的一些技巧总结
- 下一篇: libevent evhttp学习——h