函数Load断点 记录
sxe ld:clrjit
g
.loadby sos ld:clrjit
!name2ee mscorlib.dll System.Reflection.Assembly.Load
bp 0x66be5d2c //断在load
bl
!clrstack
!dumpstackobjects
d 02f606d4
d eax
dd 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具有以下条目:
665289d0 662833ec NONE System.Reflection.RuntimeAssembly.nLoadImage(Byte[], Byte[], System.Security.Policy.Evidence, System.Threading.StackCrawlMark ByRef, Boolean, Boolean, System.Security.SecurityContextSource)
因此,nLoadImage的本机地址为0x665289d0 。现在,在该地址上设置一个断点,让程序继续执行并使用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-ILDisassembly
Get-ILDisassembly函数为PowerShellArsenal模块提供。显示IL指令
得到Load函数的token,通过token得到load地址,nLoadImage函数再Load函数中调用
set-ExecutionPolicy RemoteSigned
$Env:PSModulePath
Import-Module PowerShellArsenal
Get-Command -Module PowerShellArsenal
Powershell中显示省略号内容:
$FormatEnumerationLimit = -1