liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1818回复:0

在IMD层隐藏端口或者连接

楼主#
更多 发布于:2008-10-02 09:16
比如,隐藏后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;
游客

返回顶部