王艳平《网络与通信程序设计》,phoenixFW 谁把驱动防火墙测试成功了的?

LENOVO_ 2011-03-07 11:12:15
《windows网络与通信程序设计》 中的 phoenixFW 有应用层和驱动层的封包过滤,
应用层的过滤没有问题,是可以拦截成功的。

但是那个驱动层的,她修改的 passthru 中间层驱动,添加了自己的过滤规则,但是我怎么尝试也过滤不了指定的封包。

王艳平的做法是这样的:
拦截 MPSend MPSendPackets 向外发包的函数

FltFilterSendPacket -> FltReadPacketData -> NdisQueryBufferSafe
-> FltCheckFilterRules

用 VMWare + WinDbg 调试 FltReadPacketData 这个函数,当有TCP连接发生时,发现每次 都是读取 34 字节的数据,即ETHeader + IPHeader 的长度,后面的TCPHeader 都没有,导致下面的检测函数 FltCheckFilterRules 总是返回 TRUE,也就是没有过滤成功。

-------------------------------------
拦截 PtReceivePacket PtReceive 接收封包的函数 也存在同样的问题。

谁把这个工程改成功了的? 指点一下。

...全文
88 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
LENOVO_ 2011-03-10
  • 打赏
  • 举报
回复
问题已经 解决了

原因就是 使用 NdisQueryBufferSafe 没有做好 条件判定,导致过早跳出循环


// 遍历封包中的缓冲区描述表,将数据复制到用户缓冲区
pBufferDes = pPacket->Private.Head;
while(pBufferDes != NULL && pBufferDes != pPacket->Private.Tail )
{
// 获取此缓冲区描述表的缓冲区信息
NdisQueryBufferSafe(pBufferDes, &pBuf, &nBufferSize, NormalPagePriority);

if(pBuf == NULL)
return;

if(nNumberToRead > nBufferSize) // 复制整个缓冲区
{
NdisMoveMemory(lpBufferIn + *lpNumberOfRead, pBuf, nBufferSize);
nNumberToRead -= nBufferSize;
*lpNumberOfRead += nBufferSize;
}
else // 仅复制剩下的部分
{
NdisMoveMemory(lpBufferIn + *lpNumberOfRead, pBuf, nNumberToRead);
*lpNumberOfRead += nNumberToRead;
return;
}


// 下一个缓冲区描述表
pBufferDes = pBufferDes->Next;

}


上面的代码是错误的 ,拷贝了 34 字节 就 条件判断为真 跳出了。

正确的代码应该是:


int packetSize=0;
PUCHAR pBuf=NULL;
UINT bufLength=0;
MDL *pNext=NULL;
UINT i=0;


NdisQueryPacket(pPacket,NULL,NULL,NULL,&packetSize);

NdisQueryBufferSafe(pPacket->Private.Head,
&pBuf,
&bufLength,
32);
NdisMoveMemory(lpBufferIn,pBuf,bufLength);
*lpNumberOfRead = bufLength;
i=bufLength;
pNext=pPacket->Private.Head;

for(;;)
{
if(pNext == pPacket->Private.Tail)
break;
pNext=pNext->Next;
if(pNext == NULL)
break;
NdisQueryBufferSafe(pNext,&pBuf,&bufLength,32);
NdisMoveMemory(lpBufferIn + i,pBuf,bufLength);
*lpNumberOfRead += bufLength;
i+=bufLength;
}


这个才能完整的拷贝整个数据封包。
LENOVO_ 2011-03-09
  • 打赏
  • 举报
回复
人工置顶,会的前辈过来支招,帮助一下。
smwhotjay 2011-03-08
  • 打赏
  • 举报
回复
看过,没深入驱动防火墙.只把驱动部分学了.
无水先生 2011-03-08
  • 打赏
  • 举报
回复
没看过该书呀

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧