日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

茫茫内存,我该如何用 windbg 找到你 ?

發(fā)布時間:2023/12/4 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 茫茫内存,我该如何用 windbg 找到你 ? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一:背景

1. 講故事

前天wx上有個朋友丟給我一個dump,讓我?guī)兔﹁b定一下某些敏感信息在內(nèi)存中是否也是加密的,現(xiàn)在數(shù)據(jù)安全很重要,不僅數(shù)據(jù)庫中的信息要加密,灌到內(nèi)存后數(shù)據(jù)同樣也需密文存儲,隨用隨解密,爭取安全最大化????,此為背景,接下來就是我艸,這咋讓我鑒定呀?????????????

二:如何鑒定

1. 思考

我艸幾秒后,冷靜下來想想還是有一定解決辦法的,我先把問題化簡一下。

  • 判斷內(nèi)存中是否有字符串為 張三 or 李四 or 王五 的明文字符。

  • 判斷內(nèi)存中是否存在各自明文對應(yīng)的密文。

上面兩點檢索一下,基本就能確定那些敏感信息是否加密了。

像 C# 這種托管語言有一個好處,就是所有的托管對象都是存放在 托管堆 上,言外之意就是字符串也在 托管堆 上,所以接下來的問題是如何在堆上檢索 string=張三 的字符串。

問題來了,很多時候 托管堆 上的 string 是海量的,我見過最高有幾千萬個,string茫茫,何時才能找到我最靚的崽呀 ???????????? ,理論時間結(jié)束,接下來開始打怪。

2. 案例演示

為了能夠繼續(xù)聊下去,我用一個簡單的例子演示一下如何通過人肉搜索 string=張三, 先看代碼。

class?Program{static?List<string>?strList?=?new?List<string>();static?void?Main(string[]?args){strList.Add("fake");strList.Add("張三");Console.ReadLine();}}

接下來祭出 windbg。

  • 用 !dumpheap -type System.String -min 8 -max 15 找到所有 10-15byte 范圍的字符串。

0:000>?!dumpheap??-type?System.String?-min?8?-max?15Address???????MT?????Size 026f1228?652224e4???????14????? 026f164c?652224e4???????16????? 026f230c?65222d74???????12????? ...Statistics:MT????Count????TotalSize?Class?Name 65225468????????1???????????12?System.Collections.Generic.GenericEqualityComparer`1[[System.String,?mscorlib]] 65222d74???????10??????????156?System.String[] 652224e4???????65?????????1168?System.String Total?76?objects

從輸出中可以看出,當(dāng)前size范圍內(nèi)有 1168 個 string,還發(fā)現(xiàn)這個 size 不是特別準(zhǔn),先不管了,string 雖然有點多,但還是可以人肉的,用 !do xxx 逐個查看。

0:000>?!do?026f2354 Name:????????System.String MethodTable:?652224e4 EEClass:?????65327690 Size:????????18(0x12)?bytes File:????????C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll String:??????張三 Fields:MT????Field???Offset?????????????????Type?VT?????Attr????Value?Name 652242a8??4000283????????4?????????System.Int32??1?instance????????2?m_stringLength 65222c9c??4000284????????8??????????System.Char??1?instance?????5f20?m_firstChar 652224e4??4000288???????70????????System.String??0???shared???static?Empty>>?Domain:Value??00a22530:NotInit??<<

看到?jīng)]有,上面的 String: 張三 就是我要的結(jié)果,明文存儲 實錘。

文章到此是不是可以結(jié)束啦 ????????????, 那就太沒有實戰(zhàn)經(jīng)驗了,剛才說了,很多時候篩選后的 string 也可能高達(dá)幾萬幾十萬,再用人肉那是不可能的。。。

那有沒有代替人肉的腳本呢?????????????, 嘿嘿,還真有。。。

三:使用自動化腳本

現(xiàn)在的 windbg preview 支持 javacript 作為腳本擴展,接下來我準(zhǔn)備把剛才的 人肉步驟 寫入腳本,貌似專業(yè)名字叫 playbook,蹩腳腳本如下:

"use?strict";function?RunCommands()?{var?ctl?=?host.namespace.Debugger.Utility.Control;var?str_address_list?=?ctl.ExecuteCommand("!dumpheap??-type?System.String?-min?8?-max?15?-short");for?(var?str_address?of?str_address_list)?{var?str_dump?=?ctl.ExecuteCommand("!do?-nofields?"?+?str_address);var?str?=?str_dump.Last();var?isContains?=?str.indexOf("張三")?>?0;if(isContains)?host.diagnostics.debugLog(str+"??"+str_address?+"\n");} }

腳本的邏輯還是非常簡單的,就是模擬剛才的人肉,最后在輸出內(nèi)容中判斷是否有 張三 的字符串,如果有,連同 address 地址一起打印出來,腳本保存好之后,用 dx 命令來執(zhí)行 RunCommands() 函數(shù)。

0:000>?dx?Debugger.State.Scripts.RunCommands.Contents.RunCommands() String:??????張三??026f2354 Debugger.State.Scripts.RunCommands.Contents.RunCommands()

看到?jīng)]有, 明文 張三 顯示出來了,不信的話,我截一張圖,證明我沒有騙你 ????????????。

四:總結(jié)

在這個案例中最后使用了 js 腳本輕松搞定,可以看出,腳本給了 windbg 無限的挖掘可能, 真的是太強大了,有興趣的話可參考 MSDN:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/javascript-debugger-scripting

END

工作中的你,是否已遇到 ...?

1. CPU爆高

2. 內(nèi)存暴漲

3. 資源泄漏

4. 崩潰死鎖

5. 程序呆滯

等緊急事件,全公司都指望著你能解決...? 危難時刻才能展現(xiàn)你的技術(shù)價值,作為專注于.NET高級調(diào)試的技術(shù)博主,歡迎微信搜索: 一線碼農(nóng)聊技術(shù),免費協(xié)助你分析Dump文件,希望我能將你的踩坑經(jīng)驗分享給更多的人。

總結(jié)

以上是生活随笔為你收集整理的茫茫内存,我该如何用 windbg 找到你 ?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。