阅读:1895回复:4
如何修改passthru程序,使之堵截、修改、转发一个外来数据包?
现想完成以下功能:
在passthru上堵截一个外来数据包(不发给目标应用程序),将这个数据包“发给"sniffer程序,sniffer程 序对这个数据包的内容做一些修改(在应用层解析报,修改包),再将修改后的数据包发给passthru, passthru再将这个修改后的数据包发给目标应用程序。 我的这样实现: 1、首先passthu中设置两个缓存区,receiveBuffer(存从网卡上接收的数据)和sendBuffer(存从sniffer发来的数据) 2、实现的算法 (1)接收的数据的函数 INT PtReceivePacket( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet ) { if(receiveBuffer装不下Packet) { 触发一个事件,通知sniffer程序读-------pro1 将receiveBuffer清空 } 将Packet复制到receiveBuffer中 return NDIS_STATUS_SUCCESS; } (2)sendBuffer的写 //假设从sniffer程序中发出IOCONTROL命令 NTSTATUS PtWriteSndBuffe(IN PDEVICE_OBJECT fdo, IN PIRP Irp) { 取得用户缓存区的内容ioBuffer (ioBuffer = pIrp->AssociatedIrp.SystemBuffer) if(sendBuffer不能装下ioBuffer 中有关包的数据) { 调用PtSendRcvPkt sendBuffer清空 } 将IoBuffer中的有关包的数据复制到sendBuffer } (3) 发送sendBuffer中的数据包 INT NTSTATUS PtSendRcvPkt() { while(取出sendBuffer中的第i个包sendBufferii)-----pro2 { 利用sendBufferii初始化一个包packet 调用NdisMIndicateReceivePacket将packet发出 } } 问题: pro0:我像这样实现行吗?满足我上述功能还有其它的好方法吗?(最好带源代码,谢了) pro1:在passthr里怎样触发一个事件呀?用什么函数?在应用程序怎样监听这个事件? pro2:包的长度都不样,怎么才能区别出不同大小的包? |
|
最新喜欢:ljmmar... |
沙发#
发布于:2005-01-24 16:52
我觉得你这样把包从核心层传到用户层,修改完在发到核心层,效率会不太好。
|
|
|
板凳#
发布于:2005-03-06 21:24
怎么让passthru跑起来???
|
|
地板#
发布于:2005-03-07 22:05
内核态想用户态传递消息,更常用的方法是用户态程序开一个监听线程,不断(某一间隔)的试图从内核读取数据。
|
|
地下室#
发布于:2005-03-07 22:08
你的PtReceivePacket的参数是否没有写全,包的长度我记得可以从参数中获得(以太网包长度)
|
|