Windbg+sos调试.net笔记

本文介绍使用Windbg调试.NET程序中的Assembly.Load和nLoadImage函数的方法。通过设置断点和使用特定命令,可以深入了解这些函数的工作原理。此外,还介绍了如何使用PowerShell进行反射调用以辅助调试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值