话虽如此,只有在现有进程中寻找执行.NET代码的情况下,情况才会如此。像上述最后一个示例所示,如果我们连接了调试器来启动一个新的.NET进程,则将看不到此远程线程的创建,因此也不会触发此检测机制。这是因为通过 DEBUG_PROCESS 的 CreateProcess 选项来创建初始调试器会话,这意味着 ntdll!NtCreateThreadEx 从不使用该调用。但是,如果稍后使用诸如 DebugBreakProcess 这样的调用,则将导致与上文所述相同的远程线程签名。
接下来,我们还必须考虑到在调试过程时,可以使用几个API来表明正在连接的活动调试器(任何编写过反分析代码的人都会知道)。例如,使用目标进程句柄中的 CheckRemoteDebuggerPresent 调用将显示调试器会话是否处于活动状态。
诸如 ProcessHacker 之类的工具还可以通过突出显示进程来表明调试器会话的存在:
当然,只有在调试器会话处于活动状态时才适用。因此,如果代码已执行且调试器会话已停止,则情况将不再如此。
一些有用的参考https://googleprojectzero.blogspot.com/2019/04/windows-exploitation-tricks-abusing.html
http://index-of.es/Windows/dbgk-1.pdf
https://mattwarren.org/2016/08/08/GC-Pauses-and-Safe-Points/
https://github.com/Samsung/netcoredbg
作者:XPN
原文地址:https://blog.xpnsec.com/debugging-into-net