gulin
驱动牛犊
驱动牛犊
  • 注册日期2003-05-15
  • 最后登录2003-12-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2320回复:4

NDIS hook驱动中如何直接发送以太网包?

楼主#
更多 发布于:2003-12-12 00:13
目前有一个用户模式下的进程要直接发送以太网包,由于已经有了NDIS hook驱动,想直接通过其来发送,大致的思路如下:
NDIS hook驱动对windows自带tcp/ip协议驱动进行hook,用户模式下进程与ndis hook 驱动通过io control进行交互。现用户进程把要发送的以太网包内容通过io control接口传递给ndis hook驱动。
ndis hook驱动在io control处理函数中调用NdisAllocatePacket、NidsAllocateBuffer、NdisChainBufferAtBack构建发送包的缓存,然后拷贝发送包内容到缓存,这些准备工作完成后,调用NdisSend发送包,调用时的NdisBindingHandle使用hook tcp/ip协议驱动时得到的句柄。如果NdisSend返回的status != NDIS_STATUS_PENDING,则直接释放前面申请的packet描述符和buffer,否则要等到ndis调用tcp/ip协议驱动的SendCompleteHandler时由tcp/ip驱动来释放。
由于本人刚接触NDIS,对其不是很了解,所以想请求各位以下问题:
1、以上思路是否有问题?
2、NDIS hook驱动申请的pakcet描述符和buffer由tcp/ip协议驱动来释放是否可行呢?
3、NDIS hook驱动发送包是否还有其他方法?
4、在windows平台,用户进程有其他别的方法直接发送以太网包吗?
daviswjk
驱动牛犊
驱动牛犊
  • 注册日期2003-03-26
  • 最后登录2009-06-12
  • 粉丝0
  • 关注0
  • 积分334分
  • 威望64点
  • 贡献值0点
  • 好评度33点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-12 18:51
ndis hook 需要reboot machine吗?
一切随风!
ironmo
驱动牛犊
驱动牛犊
  • 注册日期2003-11-27
  • 最后登录2022-06-10
  • 粉丝0
  • 关注0
  • 积分247分
  • 威望27点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-14 12:27
NDIS HOOK不是对TCP/IP协议驱动进行HOOK吧,而是对NDIS驱动库中的函数进行HOOK吧!

在windows发送以太网可以通过套接字、原始套接字、TCP/IP-Device进行以太网数据包的发送,如果你要使用你上面所说的方式来发送的话,一定要大包成IP包,不能超过IP包的长度,而且还有如果你是使用TCP/IP格式的话,关于重传、超时都要考虑,因为你跨过了TCP/IP协议层,TCP/IP协议层完成的机制都要你自己来考虑实现了,因此你这种方法基本上是行不通的!

后来的兄第问NDIS HOOK是否要重启电脑的问题,那要看你的驱动的实现方式,如果在驱动的开始部分就进行HOOK的话,那么你就需要重启,如果是通过你的应用进行控制HOOK的话就可以不用重启(这个我没有测试!!),但是一般都是采用第一种!

    
承接驱动开发和安装包制作
daviswjk
驱动牛犊
驱动牛犊
  • 注册日期2003-03-26
  • 最后登录2009-06-12
  • 粉丝0
  • 关注0
  • 积分334分
  • 威望64点
  • 贡献值0点
  • 好评度33点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-12-14 12:34
ironmo:

什么是驱动的开始部分?

应用控制hook?

我不是很懂你的意思啊

我想直接利用程序加载我的ndishook 驱动来实现防火墙,并且和驱动程序通信

你说\"如果在驱动的开始部分就进行HOOK的话\".是什么意思呢?
一切随风!
gulin
驱动牛犊
驱动牛犊
  • 注册日期2003-05-15
  • 最后登录2003-12-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-14 19:16
在windows发送以太网可以通过套接字、原始套接字、TCP/IP-Device进行以太网数据包的发送,如果你要使用你上面所说的方式来发送的话,一定要大包成IP包,不能超过IP包的长度,而且还有如果你是使用TCP/IP格式的话,关于重传、超时都要考虑,因为你跨过了TCP/IP协议层,TCP/IP协议层完成的机制都要你自己来考虑实现了,因此你这种方法基本上是行不通的!

我要发送的不是IP包,是一个自己定义的协议包,不复杂,类似响应应答,自己来控制应该没有问题。目前不能通过win socket接口发送。我找了个winpcap,通过它可以发送任意结果的以太网帧。
游客

返回顶部