Windbg+sos调试.net笔记
函數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函數nLoadImage斷點 記錄
打開一個.net程序(調用過Load的對象樣本),或者用ps反射調用Load(測試用)
sxe ld:clrjit
加載指定名稱的dll時,調試器中斷
g
.loadby sos ld:clrjit
從加載clr.dll的目錄加載SOS調試擴展
!name2ee mscorlib.dll System.Reflection.Assembly.Load
找Assembly.Load的MethodDesc
找到nLoadImage的函數表token
!Token2EE mscorlib.dll 06004326
檢索nLoadImage方法的MethodDesc。第一個參數(mscorlib.dll)是實現nLoadImage方法的模塊,十六進制數字是從PowerShell檢索的元數據令牌。
!DumpMD 662833ec
然后,轉儲有關MethodDesc的信息。這將為實現nLoadImage的對象提供方法表的地址
!DumpMT -MD 66063f04
轉儲System.Reflection.RuntimeAssembly類的所有方法及其各自的本機入口點。nLoadImage具有以下條目:
因此,nLoadImage的本機地址為0x665289d0 ?,F在,在該地址上設置一個斷點,讓程序繼續執行并使用PowerShell在偽造的PE字節數組上調用Load方法。
其他
我調試的樣本有調試檢測,Windbg查看調用堆棧: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調試某個dll模塊,而這個模塊加載時機不是很確定。
通常需要使用sxe ld <dll名稱> 來設置一個模塊加載異常。當被調試進程加載指定名稱的dll時,調試器就會中斷,后續就可以對該模塊的設置一些符號斷點了。
那么如何看到我設置的所有sxe斷點呢? 在windbg的event filter中可以管理設置過的sx系列斷點
利用powershell執行反射調用Load函數輔助調試
[Reflection.Assembly].GetMethod('Load', [Type[]] @([Byte[]] )) | Get-ILDisassemblyGet-ILDisassembly函數為PowerShellArsenal模塊提供。顯示IL指令
得到Load函數的token,通過token得到load地址,nLoadImage函數再Load函數中調用
set-ExecutionPolicy RemoteSigned
$Env:PSModulePath
Import-Module PowerShellArsenal
Get-Command -Module PowerShellArsenal
Powershell中顯示省略號內容:
$FormatEnumerationLimit = -1
總結
以上是生活随笔為你收集整理的Windbg+sos调试.net笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网鼎杯2020 朱雀部分writeup
- 下一篇: 用pip安装tensorflow报错Sy