lyabcd
驱动大牛
驱动大牛
  • 注册日期2001-08-09
  • 最后登录2015-10-01
  • 粉丝0
  • 关注0
  • 积分33分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2002-05-13 09:04
水木清华 -- DriverDev精华区文章阅读
--------------------------------------------------------------------------------
 发信人: Immortal1015 (1015), 信区: WinDDK      
标  题: 一个win2000下的IP HOOK DRIVER
发信站: BBS 水木清华站 (Fri Mar 16 08:32:45 2001)

呵呵,因为做这个东东比较容易。
下面是源代码:
#include \"ntddk.h\"
#include \"ntddndis.h\"
#include \"pfhook.h\"
#include \"filter.h\"
#define PROT_TCP   6
#define NT_DEVICE_NAME L\"\\\\Device\\\\IbanHook\"
#define DOS_DEVICE_NAME L\"\\\\DosDevices\\\\IbanHookV1\"
NTSTATUS DriverEntry(
                        IN PDRIVER_OBJECT DriverObject,
                        IN PUNICODE_STRING RegistryPath
                    )
{
 PDEVICE_OBJECT deviceObject=NULL;
 NTSTATUS status;
 PIPFILTER_INFO deviceInfo;
 UNICODE_STRING uniNtNameString;
 UNICODE_STRING uniWin32NameString;
 UNICODE_STRING uniIPFILTERNameString;
 PIRP ipFilterIRP=NULL;
 RtlInitUnicodeString(&uniNtNameString,NT_DEVICE_NAME);
 //1.创建一个设备
 status=IoCreateDevice(DriverObject,
      sizeof(deviceInfo),
      &uniNtNameString,
      FILE_DEVICE_UNKNOWN,
      0,
      FALSE,
      &deviceObject);
 if(!NT_SUCCESS(status))
 {
  return status;
 }
 DriverObject->MajorFunction[IRP_MJ_CREATE]=SetFilterHook;
 DriverObject->MajorFunction[IRP_MJ_CLOSE]=CloseFilterHook;
 DriverObject->DriverUnload=FilterUnload;
 //2.创建SymbolName
 RtlInitUnicodeString(&uniWin32NameString,DOS_DEVICE_NAME);
 status=IoCreateSymbolicLink(&uniWin32NameString,&uniNtNameString);
 if(!NT_SUCCESS(status))
 {
  IoDeleteDevice(DriverObject->DeviceObject);
 }
 deviceInfo=(PIPFILTER_INFO)deviceObject->DeviceExtension;
//添加Hook
 if(deviceObject)
 {
  deviceInfo=(PIPFILTER_INFO)deviceObject->DeviceExtension;
 }
 RtlInitUnicodeString(&uniIPFILTERNameString,
      DD_IPFLTRDRVR_DEVICE_NAME);
 status=IoGetDeviceObjectPointer(&uniIPFILTERNameString,
  FILE_ALL_ACCESS,
  &deviceInfo->ipfilter ,
  &deviceInfo->filterObject);
 deviceInfo->callback.ExtensionPointer= DropTcpPackets;
 ipFilterIRP=IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,
      deviceInfo->filterObject ,
      &deviceInfo->callback ,
      sizeof(deviceInfo->callback),
      NULL,
      0,
      FALSE,
      NULL,
      NULL);
 status=IoCallDriver(deviceInfo->filterObject,ipFilterIRP );
 if(!NT_SUCCESS(status))
 {
  IoDeleteSymbolicLink(&uniWin32NameString);
  IoDeleteDevice(DriverObject->DeviceObject);
  return status;
 }
 return STATUS_SUCCESS;
}
NTSTATUS FilterUnload(PDRIVER_OBJECT DriverObject)
{
 UNICODE_STRING uniWin32NameString;
 UNICODE_STRING uniIPFILTERNameString;
 PIRP ipFilterIRP=NULL;
 NTSTATUS status;
 PIPFILTER_INFO deviceInfo;
//删除挂钩

 if(DriverObject->DeviceObject)
 {
  deviceInfo=(PIPFILTER_INFO)(DriverObject->DeviceObject)->DeviceExtension;
 }
 RtlInitUnicodeString(&uniIPFILTERNameString,
      DD_IPFLTRDRVR_DEVICE_NAME);
 status=IoGetDeviceObjectPointer(&uniIPFILTERNameString,
  FILE_ALL_ACCESS,
  &deviceInfo->ipfilter ,
  &deviceInfo->filterObject);
 deviceInfo->callback.ExtensionPointer= NULL;
 ipFilterIRP=IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,
      deviceInfo->filterObject ,
      &deviceInfo->callback ,
      sizeof(deviceInfo->callback),
      NULL,
      0,
      FALSE,
      NULL,
      NULL);
 status=IoCallDriver(deviceInfo->filterObject,ipFilterIRP );
 RtlInitUnicodeString(&uniWin32NameString,DOS_DEVICE_NAME);
//删除SymbolicLink
 IoDeleteSymbolicLink(&uniWin32NameString);
//删除设备
 IoDeleteDevice(DriverObject->DeviceObject);
 return STATUS_SUCCESS;
}
//处理IRP_MJ_CREATE
NTSTATUS SetFilterHook(IN PDEVICE_OBJECT DeviceObject,
        IN PIRP Irp)
{
 KdPrint((\"ooh--create\"));
 Irp->IoStatus.Status=STATUS_SUCCESS;
 Irp->IoStatus.Information=0;
 IoCompleteRequest(Irp,IO_NO_INCREMENT);
 return STATUS_SUCCESS;
}
//处理IRP_MJ_CLOSE
NTSTATUS CloseFilterHook(IN PDEVICE_OBJECT DeviceObject,
        IN PIRP Irp)
{
 KdPrint((\"ooh--Close\"));
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest( Irp, IO_NO_INCREMENT );
 return STATUS_SUCCESS;
}
// Drop all TCP packets
PF_FORWARD_ACTION
DropTcpPackets(
        unsigned char   *PacketHeader,
        unsigned char   *Packet,
        unsigned int    PacketLength,
        unsigned int    RecvInterfaceIndex,
        unsigned int    SendInterfaceIndex,
        IPAddr          RecvLinkNextHop,
        IPAddr          SendLinkNextHop
        )
{
/*    if (((IPHeader *)PacketHeader)->iph_protocol == PROT_TCP)
    {
  KdPrint((\"TCP DATA\"));
        return PF_DROP;
    }*/
 return PF_DROP;
    //return PF_FORWARD;
}


 
datongguandian@sina.com
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2002-05-13 10:38
这个例子要如何安装到机器上?
是否要自己写安装文件?

终于知道什么是export table了,呵呵,用dumpbin可以看到,
与不知道的共享
example:dumpbin /exports ndis.sys


swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2002-05-13 10:59
在pcause上看到这个,证明ndis imd在98&NT上的安装问题,依然是个大问题,
如果谁做过NT上的自动安装,可否讲讲经验!

For example, although NDIS Intermediate (IM) drivers are quite effective for packet filtering on the Windows 2000 and Windows XP platforms, they are less practical to use on Windows NT and Windows 9X/ME. Issues that lead to impracticality include:

 Installation Issues - It may be possible to develop a NDIS IM driver for Windows 9X/ME and Windows NT, but difficult or impossible to install it.
  
 Operation On RAS/PPP Adapters - Microsoft does not provide a mechanism to filter packets on RAS/PPP adapters on Windows 9X/ME and Windows NT. Filtering on these adapters is essential for some products.
  
 Special Requirements - Some products have functional needs that simply are not provided by the standard NDIS APIs.
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2002-08-02 10:21
up ! up!
我不仅要金子,我还要点石成金的手指!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
24楼#
发布于:2002-08-02 11:16
我用的是hook ndis的方法,看我的贴子
http://www.driverdevelop.com/forum/viewthread.php?tid=19249
http://www.driverdevelop.com/forum/viewthread.php?tid=19246
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2002-08-02 11:42
我用的是hook ndis的方法,看我的贴子
http://www.driverdevelop.com/forum/viewthread.php?tid=19249
http://www.driverdevelop.com/forum/viewthread.php?tid=19246

大狭,你怎么编译的,没有Makefile,直接在VC中编译吗
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2002-08-02 12:42
装上driverstudio!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
27楼#
发布于:2002-08-03 23:35
不需要装DS,只需要在VC里面设置好就可以直接用VC编译啦.
wlrwx
驱动小牛
驱动小牛
  • 注册日期2002-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
28楼#
发布于:2002-08-05 13:21
REGISTER FAKE PROTOCOL的方法在2K/XP下原理是一样的,而且我还做到了几乎是SOURCE的兼容,这个大家可以去大胆的尝试了,,。。。


但是现在我的问题是:当PFW遭遇SYN FLOOD的时候,驱动就把CPU给占完了,大家对于PFW防止SYN FLOOD有什么好的办法吗?可以讨论讨论吧
真正的浪子―――― 是掠过城市的微风,每个人都能感到他的清新,可没有人能留住...... 亦是划过天际的流星,所有人都能仰望他夺目的光芒,没有人能触及...... 风止于森林,流星损于黄土......非凡浪子归于他的最爱......
上一页 下一页
游客

返回顶部