Windbg+sos调试.net笔记
函數(shù)Load斷點 記錄
sxe ld:clrjit g .loadby sos ld:clrjit !name2ee mscorlib.dll System.Reflection.Assembly.Load bp 0x66be5d2c //斷在load bl !clrstack!dumpstackobjectsd 02f606d4d eaxdd 02f606d4函數(shù)nLoadImage斷點 記錄
打開一個.net程序(調(diào)用過Load的對象樣本),或者用ps反射調(diào)用Load(測試用)
sxe ld:clrjit
加載指定名稱的dll時,調(diào)試器中斷
g
.loadby sos ld:clrjit
從加載clr.dll的目錄加載SOS調(diào)試擴展
!name2ee mscorlib.dll System.Reflection.Assembly.Load
找Assembly.Load的MethodDesc
找到nLoadImage的函數(shù)表token
!Token2EE mscorlib.dll 06004326
檢索nLoadImage方法的MethodDesc。第一個參數(shù)(mscorlib.dll)是實現(xiàn)nLoadImage方法的模塊,十六進制數(shù)字是從PowerShell檢索的元數(shù)據(jù)令牌。
!DumpMD 662833ec
然后,轉(zhuǎn)儲有關(guān)MethodDesc的信息。這將為實現(xiàn)nLoadImage的對象提供方法表的地址
!DumpMT -MD 66063f04
轉(zhuǎn)儲System.Reflection.RuntimeAssembly類的所有方法及其各自的本機入口點。nLoadImage具有以下條目:
因此,nLoadImage的本機地址為0x665289d0 。現(xiàn)在,在該地址上設(shè)置一個斷點,讓程序繼續(xù)執(zhí)行并使用PowerShell在偽造的PE字節(jié)數(shù)組上調(diào)用Load方法。
其他
我調(diào)試的樣本有調(diào)試檢測,Windbg查看調(diào)用堆棧:kvn
定位到:
32位進程需要32位SOS。 32位SOS僅適用于32位WinDbg。
加載擴展
要加載擴展,有2個命令。一個是.loadby,另一個是.load。對于.loadby,請使用相對路徑;對于.load,請使用完整路徑。
對于.loadby,有5個選項:
.loadby sos mscorsvr
.loadby sos mscorwks
.loadby sos clr
.loadby sos coreclr
.loadby sos
其中mscorsvr確實很舊(.NET CLR 1,服務器版本),mscorwks確實很舊(.NET CLR 1和2,但仍然存在),clr是在當今很常見(.NET CLR 4),coreclr可能正在增加(UWP和Silverlight)
當尚未加載.NET運行時時,您正在嘗試加載SOS。等待直到加載.NET,然后該命令將起作用。在初始斷點處肯定是不可能的。
sxe ld clr sxe ld mscorwks sxe ld coreclr g讓應用程序運行到.NET可用
sxe ld 命令
有些場景需要使用windbg調(diào)試某個dll模塊,而這個模塊加載時機不是很確定。
通常需要使用sxe ld <dll名稱> 來設(shè)置一個模塊加載異常。當被調(diào)試進程加載指定名稱的dll時,調(diào)試器就會中斷,后續(xù)就可以對該模塊的設(shè)置一些符號斷點了。
那么如何看到我設(shè)置的所有sxe斷點呢? 在windbg的event filter中可以管理設(shè)置過的sx系列斷點
利用powershell執(zhí)行反射調(diào)用Load函數(shù)輔助調(diào)試
[Reflection.Assembly].GetMethod('Load', [Type[]] @([Byte[]] )) | Get-ILDisassemblyGet-ILDisassembly函數(shù)為PowerShellArsenal模塊提供。顯示IL指令
得到Load函數(shù)的token,通過token得到load地址,nLoadImage函數(shù)再Load函數(shù)中調(diào)用
set-ExecutionPolicy RemoteSigned
$Env:PSModulePath
Import-Module PowerShellArsenal
Get-Command -Module PowerShellArsenal
Powershell中顯示省略號內(nèi)容:
$FormatEnumerationLimit = -1
總結(jié)
以上是生活随笔為你收集整理的Windbg+sos调试.net笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网鼎杯2020 朱雀部分writeup
- 下一篇: 用pip安装tensorflow报错Sy