阅读:2320回复:4
NDIS hook驱动中如何直接发送以太网包?
目前有一个用户模式下的进程要直接发送以太网包,由于已经有了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平台,用户进程有其他别的方法直接发送以太网包吗? |
|
沙发#
发布于:2003-12-12 18:51
ndis hook 需要reboot machine吗?
|
|
|
板凳#
发布于: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的话就可以不用重启(这个我没有测试!!),但是一般都是采用第一种! |
|
|
地板#
发布于:2003-12-14 12:34
ironmo:
什么是驱动的开始部分? 应用控制hook? 我不是很懂你的意思啊 我想直接利用程序加载我的ndishook 驱动来实现防火墙,并且和驱动程序通信 你说\"如果在驱动的开始部分就进行HOOK的话\".是什么意思呢? |
|
|
地下室#
发布于:2003-12-14 19:16
在windows发送以太网可以通过套接字、原始套接字、TCP/IP-Device进行以太网数据包的发送,如果你要使用你上面所说的方式来发送的话,一定要大包成IP包,不能超过IP包的长度,而且还有如果你是使用TCP/IP格式的话,关于重传、超时都要考虑,因为你跨过了TCP/IP协议层,TCP/IP协议层完成的机制都要你自己来考虑实现了,因此你这种方法基本上是行不通的! 我要发送的不是IP包,是一个自己定义的协议包,不复杂,类似响应应答,自己来控制应该没有问题。目前不能通过win socket接口发送。我找了个winpcap,通过它可以发送任意结果的以太网帧。 |
|