进程断链与清除DebugPort

进程断链实现进程隐藏:

一、在0环通过fs获取EPROCESS结构体

二、利用EPROCESS结构体成员 ActiveProcessLinks双向链表去遍历进程

三、找到要断链的进程进行断链

坑点不是很多,注意一些细节即可

 

#include <ntddk.h> /****************************************************************/ /* */ /*通过fs[0x124]找到ETHREAD结构体 */ /*再通过ETHREAD结构体偏移0x220找到EPROCESS结构体 */ /*利用EPROCESS结构体成员 ActiveProcessLinks双向链表去遍历进程 */ /*找到要断链的进程进行断链 */ /* */ /****************************************************************/ /* ETHREAD 结构体 ntdll!_ETHREAD +0x000 Tcb : _KTHREAD +0x1c0 CreateTime : _LARGE_INTEGER +0x1c0 NestedFaultCount : Pos 0, 2 Bits +0x1c0 ApcNeeded : Pos 2, 1 Bit +0x1c8 ExitTime : _LARGE_INTEGER +0x1c8 LpcReplyChain : _LIST_ENTRY +0x1c8 KeyedWaitChain : _LIST_ENTRY +0x1d0 ExitStatus : Int4B +0x1d0 OfsChain : Ptr32 Void +0x1d4 PostBlockList : _LIST_ENTRY +0x1dc TerminationPort : Ptr32 _TERMINATION_PORT +0x1dc ReaperLink : Ptr32 _ETHREAD +0x1dc KeyedWaitValue : Ptr32 Void +0x1e0 ActiveTimerListLock : Uint4B +0x1e4 ActiveTimerListHead : _LIST_ENTRY +0x1ec Cid : _CLIENT_ID +0x1f4 LpcReplySemaphore : _KSEMAPHORE +0x1f4 KeyedWaitSemaphore : _KSEMAPHORE +0x208 LpcReplyMessage : Ptr32 Void +0x208 LpcWaitingOnPort : Ptr32 Void +0x20c ImpersonationInfo : Ptr32 _PS_IMPERSONATION_INFORMATION +0x210 IrpList : _LIST_ENTRY +0x218 TopLevelIrp : Uint4B +0x21c DeviceToVerify : Ptr32 _DEVICE_OBJECT +0x220 ThreadsProcess : Ptr32 _EPROCESS +0x224 StartAddress : Ptr32 Void +0x228 Win32StartAddress : Ptr32 Void +0x228 LpcReceivedMessageId : Uint4B +0x22c ThreadListEntry : _LIST_ENTRY +0x234 RundownProtect : _EX_RUNDOWN_REF +0x238 ThreadLock : _EX_PUSH_LOCK +0x23c LpcReplyMessageId : Uint4B +0x240 ReadClusterSize : Uint4B +0x244 GrantedAccess : Uint4B +0x248 CrossThreadFlags : Uint4B +0x248 Terminated : Pos 0, 1 Bit +0x248 DeadThread : Pos 1, 1 Bit +0x248 HideFromDebugger : Pos 2, 1 Bit +0x248 ActiveImpersonationInfo : Pos 3, 1 Bit +0x248 SystemThread : Pos 4, 1 Bit +0x248 HardErrorsAreDisabled : Pos 5, 1 Bit +0x248 BreakOnTermination : Pos 6, 1 Bit +0x248 SkipCreationMsg : Pos 7, 1 Bit +0x248 SkipTerminationMsg : Pos 8, 1 Bit +0x24c SameThreadPassiveFlags : Uint4B +0x24c ActiveExWorker : Pos 0, 1 Bit +0x24c ExWorkerCanWaitUser : Pos 1, 1 Bit +0x24c MemoryMaker : Pos 2, 1 Bit +0x250 SameThreadApcFlags : Uint4B +0x250 LpcReceivedMsgIdValid : Pos 0, 1 Bit +0x250 LpcExitThreadCalled : Pos 1, 1 Bit +0x250 AddressSpaceOwner : Pos 2, 1 Bit +0x254 ForwardClusterOnly : UChar +0x255 DisablePageFaultClustering : UChar */ /*函数声明*/ VOID DriverUnload(PDRIVER_OBJECT driver);//驱动退出// VOID Break_Link(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path);//断链主函数// NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path) { Break_Link(driver,reg_path); driver->DriverUnload = DriverUnload; return STATUS_SUCCESS; } VOID DriverUnload(PDRIVER_OBJECT driver) { DbgPrint("驱动程序退出成功\n"); } VOID Break_Link(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path) { PEPROCESS AddrEprocess; PLIST_ENTRY ActProLink; PLIST_ENTRY ActProLinkAns; PUCHAR ImageFileName; //出错原因,误以为进程结构体的ImageFileName成员是一个指向字符串的地址// __asm {// int 3 mov eax,fs:[0x124]//指向ETHREAD结构体地址// mov eax,[eax + 0x220] mov AddrEprocess,eax add eax,0x88 mov ActProLink,eax } ActProLinkAns = ActProLink; do { ImageFileName = (PUCHAR)((ULONG)AddrEprocess + 0x174); if(strcmp(ImageFileName,"notepad.exe") == 0) { ActProLink->Flink->Blink = ActProLink->Blink; ActProLink->Blink->Flink = ActProLink->Flink; break; } ActProLink = ActProLink->Flink; AddrEprocess = (PEPROCESS)((ULONG)ActProLink - 0x88); }while(ActProLink !=ActProLinkAns); }

四、

可以发现,当驱动正常执行后,记事本进程在任务管理器中消失,记事本进程正常运行...

 

 

利用debugport反调试:

一、debugport是EPROCESS进程结构体的成员,当某进程被调试时,debugPort里变会存储被调试程序的地址,调试程序通过正是通过debugPort来找到被调试程序的...

二、我们创建一个线程不断让debugport的值置0,以达到反调试目的...

三、用到函数PsCreateSystemThread,在驱动程序中创建线程。同时要使用函数PsTerminateSystemThread函数及时终止线程...

四、代码如下:

 

#include<ntddk.h> /****************************************************************************************************/ /* */ /*EPROCESS进程结构体里面有一个成员debugPort */ /*当进程被调试时,debugPort里会存储被调试程序的地址,调试程序通过这个debugPort来找到被调试程序 */ /*如果我们把debugPort置0,那么调试器与被调试程序之间的联系就被切断了 */ /*使用此知识点,我们不妨创建一个线程附加在被调试程序上,该线程不断把debugPort清0,以达到反调试的目的*/ /* */ /****************************************************************************************************/ VOID DriverUnload(PDRIVER_OBJECT driver); void KstartRoutine(PVOID StartContext) { PULONG DebugPort; PLIST_ENTRY ActProLink; PEPROCESS AddrEprocess; PLIST_ENTRY ActProLinkAns; PUCHAR ImageFileName; ULONG i = 0; __asm { mov eax,fs:[0x124] mov eax,[eax + 0x220] //指向ETHREAD结构体地址// mov AddrEprocess,eax add eax,0x88 mov ActProLink,eax } ActProLinkAns = ActProLink; do { ImageFileName = (PUCHAR)((ULONG)AddrEprocess + 0x174); //DbgPrint("%s\n",ImageFileName); if(strcmp(ImageFileName,"notepad.exe") == 0) { goto StartDebugPort; } ActProLink = ActProLink->Flink; AddrEprocess = (PEPROCESS)((ULONG)ActProLink - 0x88); }while(1); StartDebugPort: DebugPort = (PULONG)((ULONG)AddrEprocess + 0xbc); while(1) { i++; *DebugPort = 0; ImageFileName = (PUCHAR)((ULONG)AddrEprocess + 0x174); if(strcmp(ImageFileName,"notepad.exe")) //记事本关闭,线程退出// { break; } } PsTerminateSystemThread(STATUS_SUCCESS); //终止线程,防止蓝屏// } NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path) { HANDLE ThreadHandle; NTSTATUS lstatus; lstatus = PsCreateSystemThread(&ThreadHandle,THREAD_ALL_ACCESS,NULL,NULL,NULL,KstartRoutine,NULL); if (!NT_SUCCESS(lstatus)) { DbgPrint("创建线程失败\n"); } driver->DriverUnload = DriverUnload; return STATUS_SUCCESS; } VOID DriverUnload(PDRIVER_OBJECT driver) { DbgPrint("驱动程序退出成功\n"); }

五、这里我使用了DTDebug与吾爱破解版OD进行了检测:

六、可以发现记事本程序加载不了,调试器空有natped.exe的名字而没有内容


__EOF__

本文作者_TLSN
本文链接https://www.cnblogs.com/lordtianqiyi/articles/15645592.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TLSN  阅读(408)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示