阅读:1928回复:0
在IMD层隐藏端口或者连接
比如,隐藏后netstat -a无法检测到等。
不要说要我去Google.我看了好多天NT4SRC了。。。 下面是我自己分析的结果。。。。。(在最后) 我的问题是。好象netstat 的请求到了TDI后就看不到继续往下层走了。。 要命。那就是说 IMD层没办法了? 我在IMD层加段HOOK,失败,报错给我是34,STATUS_OBJECT_NAME_NOT_FOUND,然后驱动挂了 BugCheck:DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS (ce) STACK_TEXT: WARNING: Stack unwind information not available. Following frames may be wrong. fa01a784 808262bc 00000003 c07cf600 81797db0 nt!DbgBreakPointWithStatus+0x4 fa01ab1c 80826659 00000050 f9ec08f0 00000008 nt!KeRegisterBugCheckReasonCallback+0xb66 fa01ab3c 8085a01b 00000050 f9ec08f0 00000008 nt!KeBugCheckEx+0x1b fa01abb0 80885ed0 00000008 f9ec08f0 00000000 nt!NtFreeVirtualMemory+0x703b fa01abd4 8082e967 00000000 81797d00 fa01abf4 nt!Kei386EoiHelper+0x26a4 fa01acd4 f98957f7 80a4aea0 81552ad0 80a4aee0 nt!ZwYieldExecution+0x13a7 fa01ad5c f9896f20 81797db0 808a76c0 815681b0 NDIS!NdisReadNetworkAddress+0x225 fa01ad70 f989207e 815681a8 00552ad0 fa01adac NDIS!NdisMSetAttributesEx+0x13f5 fa01ad80 8087a469 815681a8 00000000 81797db0 NDIS!NdisDestroyBlockPool+0x31a7 fa01adac 8094095c 815681a8 00000000 00000000 nt!ExQueueWorkItem+0x1cb fa01addc 8088757a 8087a37e 00000000 00000000 nt!PsRemoveCreateThreadNotifyRoutine+0x21e 00000000 00000000 00000000 00000000 00000000 nt!KiDispatchInterrupt+0x44a 看上去好象是我的驱动在TDI前加载了?。。。。。 晕死。。 不知道各位大牛是怎么在IMD层处理这个事情的。。。诚心请教了。。 要是不能说。。。透露1,2个关键字也好啊。。。。 不然得另写个TDI HOOK了。。。。 或者在IMD了延迟HOOK。。。。 55555。。。。。 上层,(比如NETSTAT) 发请求到 入口点 NTSTATUS TCPDispatchDeviceControl( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ) TCPDispatchDeviceControl分析IrpSp->Parameters.DeviceIoControl.IoControlCode,一共处理的IOCTL有: •IOCTL_TCP_QUERY_INFORMATION_EX (以下是条件编译(#ifdef SECFLTR)) •IOCTL_TCP_SET_INFORMATION_EX •IOCTL_TCP_QUERY_SECURITY_FILTER_STATUS •IOCTL_TCP_SET_SECURITY_FILTER_STATUS •IOCTL_TCP_ADD_SECURITY_FILTER •IOCTL_TCP_DELETE_SECURITY_FILTER •IOCTL_TCP_ENUMERATE_SECURITY_FILTER 我们只对IOCTL_TCP_QUERY_INFORMATION_EX进行分析。 在IOCTL_TCP_QUERY_INFORMATION_EX中TCPDispatchDeviceControl将接受的参数原样传递给TCPQueryInformationEx来处理该IOCTL。 TCPQueryInformationEx TCPQueryInformationEx是有完成函数的,完成函数里所做的工作不多,并且没有事件的处理等。它所做的即:把缓冲区复制到MDL然后解锁用户缓冲区和释放MDLs TCPQueryInformationEx 从I/O堆栈中得到一个TCP_CONTEXT结构指针(IrpSp->FileObject->FsContext)。接着判断IrpSp->FileObject->FsContext2要处理的具体请求,完成对TDI_REQUEST结构的一个初次初始化吧。 TCPQueryInformationEx从DeviceIoControl传递的InputBuffer中获取得到TCP_REQUEST_QUERY_INFORMATION_EX结构,把它复制到TCP_QUERY_CONTEXT->QueryInformation中,然后就到了今天的主角函数了 size = TCPGetMdlChainByteCount(outputMdl); queryContext->Irp = Irp; queryContext->InputMdl = inputMdl; queryContext->OutputMdl = outputMdl; // 设置完成函数 request.RequestNotifyObject = TCPQueryInformationExComplete; // 请求的上下文(里面有传递下来的InputBuffer) request.RequestContext = queryContext; // 调用我们的主角函数来完成功能 status = TdiQueryInformationEx( &request, &(queryContext->QueryInformation.ID),// TDIObjectID类型 outputMdl, &size, &(queryContext->QueryInformation.Context) // ULONG_PTR ); 附带结构说明: typedef struct _TCP_CONTEXT { union { HANDLE AddressHandle; CONNECTION_CONTEXT ConnectionContext; HANDLE ControlChannel; } Handle; ULONG ReferenceCount; BOOLEAN CancelIrps; #if DBG LIST_ENTRY PendingIrpList; LIST_ENTRY CancelledIrpList; #endif KEVENT CleanupEvent; } TCP_CONTEXT, *PTCP_CONTEXT; 请求上下文的常规设置: #define CO_TL_ENTITY 0x400 #define INFO_CLASS_PROTOCOL 0x200 #define INFO_TYPE_PROVIDER 0x100 #define TCP_MIB_ADDRTABLE_ENTRY_EX_ID 0x102 TCP_REQUEST_QUERY_INFORMATION_EX req; req.ID.toi_entity.tei_entity = CO_TL_ENTITY; // UDP = 0x401 req.ID.toi_entity.tei_instance = 0; req.ID.toi_class = INFO_CLASS_PROTOCOL; req.ID.toi_type = INFO_TYPE_PROVIDER; req.ID.toi_id = TCP_MIB_ADDRTABLE_ENTRY_EX_ID; |
|