一个类似于TDI或者防火墙技术的有关问题,
一个类似于TDI或者防火墙技术的问题,急!!
最近有一个新任务,意思就是:
取代各通信程序(例如apache)的监听端口,在他们之前统一分配一个唯一的监控端口,对来访的消息进行监控,然后根据来访的消息进行判断,首先判断出是不是我们自己的用户,如果是继续判断他选择的应用是什么(比如说浏览网页),最后给他开辟对应应用程序的端口放他进来,比如他想浏览网页,那么就把apache的端口给他打开。
我觉得这就是个类似于防火墙的东西。我想虽然这个唯一的监控端口可以控制所有的应用端口开闭,但既然是测试,我就只针对一个apache来做,也就是说一个访问网页的请求过来,我先在apache之前拦下来(通过唯一的那个控制/监听端口),然后判断它是不是自己的用户,如果合法,我再把apache端口给他打开,让他访问。
要做这个东西,思路是什么呢?大家有例子或者建议吗?还有,我应该怎么建这个模型呢?如何给老板演示呢?是不是要用到SOCKET编程或者windows tdi?会用到DDK开发包吗?如何知道(监听到)访问请求?
谢谢大家了!急啊。
我的邮箱是wuxo@sina.com,希望各位指点我
------解决方案--------------------
www.xfocus.net
你会找到想要的
------解决方案--------------------
我这里也有TDIHOOK的代码,其实也不复杂。
PDRIVER_DISPATCH gOrgTcpipDeviceControlFn=0;
NTSTATUS NewDeviceDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP irp)
{
PIO_STACK_LOCATION irps= IoGetCurrentIrpStackLocation(irp);
//如果不是tcp的话,就直接返回了!!!
if(DeviceObject != gTcpObj)
{
return gOrgTcpipDeviceControlFn(DeviceObject,irp);
}
//如果不是这个命令的话,直接返回了。
if((irps-> MajorFunction!=IRP_MJ_INTERNAL_DEVICE_CONTROL)||(irps-> MinorFunction!=TDI_SEND))
//你这个地方可能不是TDI_SEND,我这里是抓的TDI_SEND
{
return gOrgTcpipDeviceControlFn(DeviceObject,irp);
}
//发送的参数
TDI_REQUEST_KERNEL_SEND *param = (TDI_REQUEST_KERNEL_SEND *)(&irps-> Parameters);
//发送的数据
PMDL pmdl=irp-> MdlAddress;
return gOrgTcpipDeviceControlFn(DeviceObject,irp);
}
NTSTATUS hook_tcpip()
{
UNICODE_STRING drv_name;
RtlInitUnicodeString(&drv_name, L "\\Driver\\Tcpip ");
PDRIVER_OBJECT new_DriverObject;
NTSTATUS status = ObReferenceObjectByName(&drv_name, OBJ_CASE_INSENSITIVE, NULL, 0,IoDriverObjectType, KernelMode, NULL,(PVOID *) &new_DriverObject);
if (status != STATUS_SUCCESS)
{
KdPrint(( "[tdi_fw] hook_driver: ObReferenceObjectByName\n "));
return STATUS_SUCCESS;
}
gOrgTcpipDeviceControlFn=new_DriverObject-> MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL];
new_DriverObject-> MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL]=NewDeviceDispatch;
return STATUS_SUCCESS;
}
------解决方案--------------------
或者还有一种更简单的驱动模式
过滤钩子驱动
http://mail.xfocus.net/articles/200210/457.html
这里有详细介绍
最近有一个新任务,意思就是:
取代各通信程序(例如apache)的监听端口,在他们之前统一分配一个唯一的监控端口,对来访的消息进行监控,然后根据来访的消息进行判断,首先判断出是不是我们自己的用户,如果是继续判断他选择的应用是什么(比如说浏览网页),最后给他开辟对应应用程序的端口放他进来,比如他想浏览网页,那么就把apache的端口给他打开。
我觉得这就是个类似于防火墙的东西。我想虽然这个唯一的监控端口可以控制所有的应用端口开闭,但既然是测试,我就只针对一个apache来做,也就是说一个访问网页的请求过来,我先在apache之前拦下来(通过唯一的那个控制/监听端口),然后判断它是不是自己的用户,如果合法,我再把apache端口给他打开,让他访问。
要做这个东西,思路是什么呢?大家有例子或者建议吗?还有,我应该怎么建这个模型呢?如何给老板演示呢?是不是要用到SOCKET编程或者windows tdi?会用到DDK开发包吗?如何知道(监听到)访问请求?
谢谢大家了!急啊。
我的邮箱是wuxo@sina.com,希望各位指点我
------解决方案--------------------
www.xfocus.net
你会找到想要的
------解决方案--------------------
我这里也有TDIHOOK的代码,其实也不复杂。
PDRIVER_DISPATCH gOrgTcpipDeviceControlFn=0;
NTSTATUS NewDeviceDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP irp)
{
PIO_STACK_LOCATION irps= IoGetCurrentIrpStackLocation(irp);
//如果不是tcp的话,就直接返回了!!!
if(DeviceObject != gTcpObj)
{
return gOrgTcpipDeviceControlFn(DeviceObject,irp);
}
//如果不是这个命令的话,直接返回了。
if((irps-> MajorFunction!=IRP_MJ_INTERNAL_DEVICE_CONTROL)||(irps-> MinorFunction!=TDI_SEND))
//你这个地方可能不是TDI_SEND,我这里是抓的TDI_SEND
{
return gOrgTcpipDeviceControlFn(DeviceObject,irp);
}
//发送的参数
TDI_REQUEST_KERNEL_SEND *param = (TDI_REQUEST_KERNEL_SEND *)(&irps-> Parameters);
//发送的数据
PMDL pmdl=irp-> MdlAddress;
return gOrgTcpipDeviceControlFn(DeviceObject,irp);
}
NTSTATUS hook_tcpip()
{
UNICODE_STRING drv_name;
RtlInitUnicodeString(&drv_name, L "\\Driver\\Tcpip ");
PDRIVER_OBJECT new_DriverObject;
NTSTATUS status = ObReferenceObjectByName(&drv_name, OBJ_CASE_INSENSITIVE, NULL, 0,IoDriverObjectType, KernelMode, NULL,(PVOID *) &new_DriverObject);
if (status != STATUS_SUCCESS)
{
KdPrint(( "[tdi_fw] hook_driver: ObReferenceObjectByName\n "));
return STATUS_SUCCESS;
}
gOrgTcpipDeviceControlFn=new_DriverObject-> MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL];
new_DriverObject-> MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL]=NewDeviceDispatch;
return STATUS_SUCCESS;
}
------解决方案--------------------
或者还有一种更简单的驱动模式
过滤钩子驱动
http://mail.xfocus.net/articles/200210/457.html
这里有详细介绍