wfine
驱动牛犊
驱动牛犊
  • 注册日期2004-08-15
  • 最后登录2005-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1895回复:4

如何修改passthru程序,使之堵截、修改、转发一个外来数据包?

楼主#
更多 发布于:2004-12-14 16:55
现想完成以下功能:
在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:包的长度都不样,怎么才能区别出不同大小的包?

最新喜欢:

ljmmaryljmmar...
suerdj2k
驱动牛犊
驱动牛犊
  • 注册日期2004-12-28
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-24 16:52
我觉得你这样把包从核心层传到用户层,修改完在发到核心层,效率会不太好。
============================== 苏州工业园区 NDIS驱动 软件研发
yujianru
驱动牛犊
驱动牛犊
  • 注册日期2004-11-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-06 21:24
怎么让passthru跑起来???
lipluto
驱动牛犊
驱动牛犊
  • 注册日期2002-12-08
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望47点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-07 22:05
内核态想用户态传递消息,更常用的方法是用户态程序开一个监听线程,不断(某一间隔)的试图从内核读取数据。
lipluto
驱动牛犊
驱动牛犊
  • 注册日期2002-12-08
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望47点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-07 22:08
你的PtReceivePacket的参数是否没有写全,包的长度我记得可以从参数中获得(以太网包长度)
游客

返回顶部