一个进程被ring3调试器调试时,有得多的调试特征可以检测,但有个非常基础的标志ring3也是可以检测的比较少人提及,那就是_EPROCESS.DebugPort。DebugPort对于ring3调试器来讲非常重要,没有它正常的ring3调试是无法运行的。当然要检测这个标记的条件是程序能够读取ring0内存,在XP以上的系统有个非常简单的方法就是使用ZwSystemDebugControl的SysDbgReadVirtualMemory方法,我们也可以map physicalmemory来操纵。检测DebugPort以前首先要获取进程的eprocess地址,这可以通过ZwQuerySystemInformation的SystemHandleInformation方法得到,也可以直接搜索ring0内存的eprocess布局。 对付ring3直接检测DebugPort,我们能够通过阻止该进程访问ring0内存来达到目的,然而目标程序一旦利用驱动来检测,,那么就非常麻烦了。下面介绍一种暗藏_EPROCESS.DebugPort的方法,这种方法的根本思路是,将一个被调试进程的DebugPort置零后,修改全部受影响的函数,使咱们的调试器可以正常运行。这些函数如下: PspCreateProcess、MmCreatePeb 进程创建、设置DebugPort DbgkCreateThread 发送线程大概历程创立的调试信息 KiDispatchException、DbgkForwardException和DbgkpQueueMessage 发送非常调试信息 PspExitThread、DbgkExitThread和DbgkExitProcess 发送线程退出、进程退出的调试信息 DbgkMapViewOfSection和DbgkUnMapViewOfSection 发送映像装载卸载调试信息 DbgkpSetProcessDebugObject和DbgkpMarkProcessPeb 当调试器附加过程时设置DebugPort 这种函数非常多的,如果都HOOK处置惩罚的话,那太可怕了,这里使用一个非常简单的措施:偷龙转凤。我们看系统访问DebugPort的代码都是这样的(XP) 8b89bc000000 mov ecx,dword ptr [ecx+0BCh] //0BCh就是DebugPort的偏移 我们可以把DebugPort转移到_EPROCESS的另一个处所,好比我使用+0x070 CreateTime,它是记录进程创建时间的,进程创建之后,在进程退出前系统不会对它进行任何修正,并且我们修正后对系统或进程不任何影响。这样我们可以把下面的代码改为如许 8b8970000000 mov ecx,dword ptr [ecx+070h] //指向CreateTime,现实的DebugPort已经被移到这里 ,只需要改动一个字节,无比简略, 固然这种法子最困难之处便是定位引用到DebugPort的函数(本人仅仅针对差别的XP体系制造特性码都累到吐血),这些函数都是不导出的,要是是特定系统,最简朴的要领就是WinDbg->uf *** 间接找地点硬编码,只要要几分钟时光。 我想再嗦一下,上面代码大家看到不少函数有个NOP Code,这个其实是对付线程PS_CROSS_THREAD_FLAGS_HIDEFROMDBG的,NOP掉相干地方后,就算线程被设置为ThreadHideFromDebugger也无奈拦截调试器接管调试信息。 本文大概偶然效性的题目,如今这篇文章不是很合用的了,起首不止上面13个地址,其次如果修改CreateTime会致使蓝屏
Hide your DebugPort in ring0
最新推荐文章于 2023-11-13 10:24:13 发布