.NET / Rotor源码分析4 - 修改Rotor使其发送CLR Notification

news/2024/7/11 0:07:38 标签: .net, VC++, Blog
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>

在使用WinDbg + SOS正式跟踪Rotor的源代码研究.NET的实现之前,还有个问题需要解决:Rotor缺省并不会发出CLR NotificationCLR Notification是指CLR在运行的时候发出的一些通知,比如加载模块,代码被编译等等,这些通知对于调试Rotor / .NET以及SOS都非常重要。例如你可以设置调试器为一遇到CLR Notification便中断,在某些情况下非常有用。还有就是SOS的部分命令如BPMD等依赖于CLR notification实现其部分功能。因此这个问题必须得解决。

CLR Notifcation本质上其实就是一个SEH (Structured Exception Handling)异常。同时VC的异常以及CLR本身的托管异常也是SEH异常,只是他们的Exception Code不同和参数不同而已。CLR通过调用RaiseException函数产生Exception Code = CLR Notification的异常,这个异常并不会导致程序非正常退出,而是仅仅对调试器起到一个通知作用,CLR本身在异常处理代码中会自动处理掉这个异常。

Rotor通过间接调用DACNotificationHelper来产生CLR Notification,如下:

void DACNotifyExceptionHelper(TADDR *args,UINT argCount)

{

PAL_TRY

{

if (IsDebuggerPresent() && !CORDebuggerAttached())

{

RaiseException(CLRDATA_NOTIFY_EXCEPTION, 0, argCount, (ULONG_PTR *) args);

}

}

PAL_EXCEPT(EXCEPTION_EXECUTE_HANDLER)

{

}

PAL_ENDTRY

}

可以看到Rotor调用RaiseException产生代码为CLRDATA_NOTIFICATION_EXCEPTIONSEH异常,也就是CLR Notification,这个异常将被后面的PAL_EXCEPT块(类似__except)处理,不作任何事情,直接“吞掉”异常。启动调试器跟踪一下发现在if语句时候并没有对IsDebuggerPresent() API进行调用,这个函数的作用是检查进程是否被正在被调试器所调试,只有在调试器挂接上此进程并且CLR调试器没有挂接上的时候才会发生此种Notification。进一步观察汇编:

xor eax, eax

test eax,eax

je mscorwks!DACNotifyExceptionHelper+0x89

发现这里没有调用API而直接对eax赋值为0,然后加以判断,提示IsDebuggerPresent可能被定义成FALSE。在命令行下面输入:

D:\usr\src\sscli20>findstr /s "IsDebuggerPresent" *.c *.cpp *.h

binaries.x86dbg.rotor\sdk\pal\inc\rotor_palrt.h:#define IsDebuggerPresent() FALSE

clr\src\debug\ee\debugger.cpp: if (IsDebuggerPresent() && !g_pRCThread->G

etDCB(iWhich)->m_rightSideIsWin32Debugger)

clr\src\utilcode\debug.cpp: t_pDbgPres pFcn = (t_pDbgPres) GetProcAdd

ress(hKrnl32, "IsDebuggerPresent");

clr\src\vm\eeconfig.h: if (IsDebuggerPresent()) DebugBreak();

\

clr\src\vm\i386\gmsx86.cpp: if (IsDebuggerPresent())

clr\src\vm\pefile.cpp: BOOL fOutputToDebugger = (level == LL_ERROR && IsDebug

gerPresent());

clr\src\vm\stubmgr.cpp: if (IsDebuggerPresent())

clr\src\vm\util.cpp: if (IsDebuggerPresent() && !CORDebuggerAttached())

palrt\inc\rotor_palrt.h:#define IsDebuggerPresent() FALSE

发现果然IsDebuggerPresent被定义为FALSE,看来是Rotor将其禁止掉了。因为我们这里目的是对.NET / Rotor进行研究,不太在意程序的性能,因此这里只需要将这里的IsDebuggerPresent定义成TRUE重新编译即可。

修改之后重新编译,启动Windbg调试clix,运行一个托管代码程序,可以在调试器中发现类似下面的输出:

(1464.c88): CLR notification exception - code e0444143 (first chance)

First chance exceptions are reported before any exception handling.

This exception may be expected and handled.

可以看到CLR Notification已经被Windbg接收到了,之后,如果想当每一个CLR Notifcation到来的时候让调试器中断,只需输入:

sxe clrn

Clrn代表CLR Notification所对应的Exception Code,预定义在WinDbg内部。

OK,至此我们的准备工作完成,下一篇文章我们将正式使用WinDbg+SOS来调试一个托管程序在CLR中的运行过程。

作者: 张羿/ATField
Blog: http://blog.csdn.net/atfield
转载请注明出处



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1618535



http://www.niftyadmin.cn/n/600449.html

相关文章

图像检索系列——利用深度学习实现以图搜图

转载自&#xff1a;图像检索系列——利用深度学习实现以图搜图 - 知乎 前言 在上一篇文章《图像检索系列——利用 Python 检测图像相似度》中&#xff0c;我们介绍了一个在图像检索领域非常常用的算法——感知哈希算法。这是一个很简单且快速的算法&#xff0c;其原理在于针对…

ACM UVa算法题209 Triangular Vertices的解法

<iframe align"top" marginwidth"0" marginheight"0" src"http://www.zealware.com/46860.html" frameborder"0" width"468" scrolling"no" height"60"></iframe>有一段时间没有…

jwt如何防止token被窃取_Spring Cloud中如何保证各个微服务之间调用的安全性(上篇)...

首先为自己打个广告&#xff0c;我目前在某互联网公司做架构师&#xff0c;已经有5年经验&#xff0c;每天都会写架构师系列的文章&#xff0c;感兴趣的朋友可以关注我和我一起探讨&#xff0c;关注我&#xff0c;免费分享Java基础教程&#xff0c;以及进阶的高级Java架构师教程…

pytorch标准化(Batch Normalize)中计算数据集的均值和方差

1,浅谈深度学习训练中数据规范化(Normalization)的重要性 为什么要Normalization? 简要来讲,在pytorch中,有些模型是通过规范化后的数据进行训练的,所以我们在使用这些预训练好的模型的时候,要注意在将自己的数据投入模型中之前要首先对数据进行规范化。 具体请参考 浅…

我的MSDN Blog正式开张,欢迎大家访问 [ http://blogs.msdn.com/yizhang/ ]

<iframe align"top" marginwidth"0" marginheight"0" src"http://www.zealware.com/46860.html" frameborder"0" width"468" scrolling"no" height"60"></iframe>我的MSDN Blog创…

Windows下select模型(以及EAGAIN、EWOULDBLOCK、EINTR)

在这里记录一下&#xff0c;以前都是新项目用到了就从旧项目中拷贝。 自从将博客当作记事本&#xff0c;发现自己多了一个好习惯。 Windows下select模型_程序员攻略-CSDN博客 套接字IO超时设置和使用select实现超时管理 - wj_hubei - 博客园 EAGAIN、EWOULDBLOCK、EINTR - …

dll注入工具_[干货]手工注入mssqlserver从基础到高级操作

手工注mssqlserver1.判断注入点&#xff1a;and 11 返回正常and 12 返回错误2.判断版本号&#xff1a;nt5.2:win2003 nt6.1:win7winverand version>03.判断当前连接的数据库用户and user >04.判断当前连接数据库:and db_name()>05.判断其它库&#xff1a;修改dbid值 a…

python判断数字位数_Python 判断正整数是几位数并逆序打印

时间&#xff1a;2018-11-23 概述&#xff1a;逆序 排序 Python 数学问题求解&#xff1a;给一个不多于5位的正整数&#xff0c;要求&#xff1a;一、求它是几位数&#xff0c;二、逆序打印出各位数字。 #你这样出题对Python来说没有难度啊&#xff08;出题人&#xff1a;你耍赖…