antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1601回复:10

在Ptreceive 中安装这一段程序,死机。附代码

楼主#
更多 发布于:2003-01-20 14:14
在Ptreceive()中,我的程序运行
Packet = NdisGetReceivedPacket();总是NULL,所以我将过滤的程序
写在if(Packet!=NULL)
       ......;
       else  
         过滤;
也就是直接修改HeaderBuffer,和Lookaheadbuffer中的值;但是只要一安装程序,死机(不蓝屏,但是鼠标键盘都没反映了)
代码如下:



Packet = NdisGetReceivedPacket(....);
if(Packet != NULL)
       {........;}
       else
{
DbgPrint(\"==>xpassthru Protocol PtReceive RePacket!:\");
            NdisMoveMemory(&EthHeader,HeaderBuffer,sizeof(ETHHDR));

if(!(EthHeader.Type ^ ETHERTYPE_IP))//根据HeaderBuffer的内容,
                               //判断下一个协议是否是IP
{
                NdisMoveMemory(&IpHeader,LookAheadBuffer,sizeof(IPHDR));
if( IpHeader.Saddr == Htonl(FilterIpAddress) )//判断LookAheadBuffer中的地址
                                          //是否是要过滤的地址
{    
DbgPrint(\"==>HAVE FILTER THE IP ADDRESS ************************\");
IpHeader.Saddr = Htonl(ConvertoIpAddress);
IpHeader.Cksum = CheckSum(( PUSHORT )&IpHeader, sizeof(IPHDR));
                    NdisMoveMemory( LookAheadBuffer, &IpHeader, sizeof(IPHDR) );
}
}

           if ( !(IpHeader.Ipp ^ IPPROTO_TCP) ) //判断下一个协议是否TCP
  {
 DbgPrint(\"==>NEXT PORTOCOL IS TCP PROTOCOL ************************\");
 NdisMoveMemory(&TcpHeader,(PUCHAR)LookAheadBuffer+sizeof(IPHDR),sizeof(TCPHDR));
     if ( TcpHeader.Sport == Htons(HTTP_PORT) )//判断过滤的端口号
 {  
   DbgPrint(\"==>HAVE FILTER THE HTTP PORT 8080 ************************\");
   TcpHeader.Sport = 0x8888;
       NdisMoveMemory((PUCHAR)LookAheadBuffer+sizeof(IPHDR),&TcpHeader,sizeof(TCPHDR));
 }  
  }
 
}


放弃瘟草,现吃李草
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-20 14:17
有哪位大虾个我一点指点,不胜感谢:)
放弃瘟草,现吃李草
yc.cf
驱动牛犊
驱动牛犊
  • 注册日期2002-11-01
  • 最后登录2006-03-06
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-20 17:55
IPHDR,ETHHDR 是怎么定义的?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-21 18:59
IPHDR,he  ETHER,是没有错的。是从TCP/IP的协议栈中COPY出来的
放弃瘟草,现吃李草
yc.cf
驱动牛犊
驱动牛犊
  • 注册日期2002-11-01
  • 最后登录2006-03-06
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-21 20:33
我加到代码里,没事啊。2000+sp3
把你的代码放上来我编译了试试
guitar_string
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2004-06-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-26 16:51
你做的和我要做的大致相同,不知道你的问题解决了没有?
我的实现中还需要有对端口号的改写,我找不到实现的函数,不知道你能否给我一些指点呢?
guitar_string
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2004-06-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-26 16:53
你做的和我要做的大致相同,不知道你的问题解决了没有?
我的实现中还需要有对端口号的改写,我找不到实现的函数,不知道你能否给我一些指点呢?

下面是我的一个帖子:
1、我已经知道 UNIT NDIS_GET__PACKET_PROTOCOL_TYPE (IN PNDIS_PACKET Packet) 可以判断packet的协议类型是否为TCP/IP,但是要更进一步判断是否为http请求呢? 找不到答案
故请问:如何实现,存放具体协议类型的位置再packet的哪个地方

2、已经知道 NdisChainBufferAtFront 可以将一个buffer链接到packet的最前面,但能否用它实现再次封包呢? 找不到答案
故请问:如何create一个新的IP包头,如何修改为http请求的包的port号,再次封包是否会产生IP包因超出最大长度限制而分包的问题
liuzq
驱动小牛
驱动小牛
  • 注册日期2003-05-25
  • 最后登录2004-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-06-26 20:42
guitar_string :

如要判断是否http包则要分析TCP header中的端口号了,80:http
110:pop3 25:smtp是传输层了

antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-26 21:05
我的错误原因是:
程序里在 没有帖出的函数里有个死循环:)
放弃瘟草,现吃李草
liuzq
驱动小牛
驱动小牛
  • 注册日期2003-05-25
  • 最后登录2004-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-26 21:08
antspower:

你是怎样调试驱动的?
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-27 08:35
驱动不是由我调用啊,他什么时候调用使用NDIS说了算
或者我没明白你的意思
放弃瘟草,现吃李草
游客

返回顶部