kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4553回复:35

自己构造的ndis包发送不出去

楼主#
更多 发布于:2004-04-21 11:32
如下:我的构造包的数据都是正确的,但不知道为什么,老是发送不出去(sniffer在别的机器上监控),ndissend返回状态为pending,我怀疑构造包有些问题,谢谢大家帮我指点!


NDIS_STATUS SendPacket(
 IN NDIS_HANDLE ProtocolBindingContext,
 IN PVOID pBuffer,
 IN ULONG uBufferSize)
{
 PADAPT pAdapt = (PADAPT)ProtocolBindingContext;

 PNDIS_PACKET MyPacket;
 NDIS_STATUS  Status;

 PNDIS_BUFFER pNdis_Ether;
 PEtherHeader pEtherheader;  //以太网头
 PIPHeader  pIpHeader;
 PUDPHeader  pUdpHeader;
 PUCHAR   pData;
 PUCHAR   pMemory;
 PRSVD   Rsvd;

 UINT i = 0;
 UINT uOffset;
 USHORT iLen;

 int j;

 UINT uTotalLen=sizeof(EtherHeader)+sizeof(IPHeader)+sizeof(UDPHeader)+uBufferSize;
 if(uTotalLen>MAX_ETHER_SIZE)
  return NDIS_STATUS_FAILURE;

 //分配一个包
 NdisAllocatePacket(&Status,&MyPacket,pAdapt->SendPacketPoolHandle);
 if(Status != NDIS_STATUS_SUCCESS)
 {
  DbgPrint(\"nNdisAllocatePacket() failed\\n\");
  return Status;
 }
 Rsvd = (PRSVD)(MyPacket->ProtocolReserved);
 Rsvd->OriginalPkt = NULL;
 
 //分配以太网包头NDIS_MEMORY_NONCACHED
 Status = NdisAllocateMemory(&pMemory,BUFFER_SIZE,0,HighestAcceptableMax);
 if(Status != NDIS_STATUS_SUCCESS)
 {
  NdisDprFreePacket(MyPacket);
  return Status;
 }
 uOffset=0;
 pEtherheader=(PEtherHeader)&pMemory[uOffset];

 for(i = 0;i<6;i++)
  pEtherheader->ether_dst = gDestMac;
 for(i = 0;i<6;i++)
  pEtherheader->ether_src= gSrcMac ;

 pEtherheader->type = htons(IP);    //IP数据报

 uOffset=sizeof(EtherHeader);
 pIpHeader=(PIPHeader)&(((PUCHAR)pEtherheader)[uOffset]);

 pIpHeader->version=5;   //版本:主机顺序,如果是网络顺序则是首部长度
 pIpHeader->header_len=IPVERSION;//sizeof(IPHeader); //首部长度:主机顺序,如果是网络顺序则是版本号
 pIpHeader->type=0;      //服务类型
 iLen=sizeof(IPHeader)+sizeof(UDPHeader)+uBufferSize;
 pIpHeader->length=htons(iLen);//总长度
 pIpHeader->id=0;      //标识符
 pIpHeader->flag_offset=0;    //标志(3)偏移(13)
 pIpHeader->time=0;      //生成时间
 pIpHeader->protocol=PROT_UDP;   //协议类型
 pIpHeader->crc_val=Checksum((USHORT *)pIpHeader,sizeof(IPHeader));     //校验和
 pIpHeader->src_addr=gSrcIp;    //源地址
 pIpHeader->des_addr=gDestIp;   //目的地址
 
 uOffset=sizeof(EtherHeader)+sizeof(IPHeader);
 pUdpHeader=(PUDPHeader)&(((PUCHAR)pEtherheader)[uOffset]);
 
 pUdpHeader->uh_dport=htons(SERVER_PORT);
 pUdpHeader->uh_sport=htons(HOST_PORT);
 pUdpHeader->uh_sum=Checksum((USHORT *)pUdpHeader,sizeof(UDPHeader));
 iLen=sizeof(UDPHeader)+uBufferSize;
 pUdpHeader->uh_ulen=htons(iLen);
 
 uOffset=sizeof(EtherHeader)+sizeof(IPHeader)+sizeof(UDPHeader);
 pData=&(((PUCHAR)pEtherheader)[uOffset]);
 NdisMoveMemory(pData,pBuffer,uBufferSize);
 iLen=1;

 for(i=0;iLen!=0;i++)
 {
  for(j=0;j<16;j++)
  {
   iLen=i*16+j;
   if(iLen<uTotalLen)
    DbgPrint(\"%2x  \",pMemory[iLen]);
   else
   {
    iLen=0;
    break;
   }
  }
  DbgPrint(\"\\n\");
 }

 NdisAllocateBuffer(
  &Status,
  &pNdis_Ether,
  pAdapt->SendPacketPoolHandle,
  pEtherheader,
  BUFFER_SIZE);
 if(Status != NDIS_STATUS_SUCCESS)
 {
  NdisFreePacket(MyPacket);
  NdisFreeMemory(pMemory,BUFFER_SIZE,0);
  return Status;
 }
 pNdis_Ether->Next = NULL;
 //将以太网头送入包中
 NdisChainBufferAtBack(MyPacket,pNdis_Ether);

 //NdisSetPacketFlags(MyPacket,pAdapt->Medium);

 NdisSend(&Status, pAdapt->BindingHandle, MyPacket);
 DbgPrint(\"Status=%d,pAdapt->BindingHandle=%x\\n\",Status,pAdapt->BindingHandle);
 if (Status != NDIS_STATUS_PENDING)
 {
  NdisFreePacket(MyPacket);
  NdisFreeMemory(pMemory,BUFFER_SIZE,0);
  NdisFreeBuffer(pNdis_Ether);
 }
 return Status;
}


最新喜欢:

kgdiwsskgdiws... temptemptempte...
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-21 13:06
返回PENDING 是很正常的。
但你的代码有很多问题,我大致看了一下,就发现几处。
1、pNdis_Ether->Next = NULL;
//将以太网头送入包中
NdisChainBufferAtBack(MyPacket,pNdis_Ether);
估计这样不行。
NdisAllocateBuffer(&Status,
&pPacketBuffer,
pAdapt->BufferPoolHandle,
pPacketContent,
PacketLen
);
NdisChainBufferAtFront(MyPacket,pPacketBuffer);
MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;
SendRsvd->Mark = MARK;
NDIS_SET_PACKET_HEADER_SIZE(MyPacket,14);
NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);
NdisSend(&Status,pAdapt->BindingHandle,MyPacket);
这是比较流行的发送单包的方法,按为软的方法,是要调一个查询函数,具体我记不清了,但结果是一样。
2、pIpHeader->crc_val=Checksum((USHORT *)pIpHeader,sizeof(IPHeader)); //校验和
至少应当是这样
pIpHeader->crc_val=0;
pIpHeader->crc_val=Checksum((USHORT *)pIpHeader,sizeof(IPHeader)); //校验和
3、pUdpHeader->uh_sum=Checksum((USHORT *)pUdpHeader,sizeof(UDPHeader));
这个Checksum我估计和上边的一个是同一个函数吧,肯定不行,UDP计算校验和与IP头不同,应当有伪头的。
4、pIpHeader->time=0; //生成时间
这个TIME估计是TTL,0肯定送不出去,通常是128,snifer几个包看看。

kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-21 14:42
大虾就是大虾,一看就知道了这么多错误:(,小弟照着把目前发现的问题都改掉了,但仍然接收不成功,还望继续帮忙:
前面我分配缓冲区时
NdisAllocateBuffer(
&Status,
&pNdis_Ether,
pAdapt->SendPacketPoolHandle,
pEtherheader,
BUFFER_SIZE);
其中使用了SendPacketPoolHandle,这个有错误,现在变成了buffer缓冲池,校验和部分的代码一并贴出,但udp据说并没有严格检查检验和,所以我暂且设为0;我相信这个代码也是大家想要的,所以请大家来一起研究

USHORT Checksum(USHORT *addr, int len)
{
register int iLeft=len;
register USHORT *w=addr;
register USHORT sum=0;
USHORT answer=0;

while(iLeft>1)
{
sum+=*w++;
iLeft-=2;
}
if(iLeft==1)
{
*(UCHAR *)(&answer)=*(UCHAR *)w;
sum+=answer;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return answer;
}
NDIS_STATUS SendPacket(
IN NDIS_HANDLE ProtocolBindingContext,
IN PVOID pBuffer,
IN ULONG uBufferSize)
{
PADAPT pAdapt = (PADAPT)ProtocolBindingContext;

PNDIS_PACKET MyPacket;
NDIS_STATUS Status;

PNDIS_BUFFER pNdis_Ether;
PEtherHeader pEtherheader; //以太网头
PIPHeader pIpHeader;
PUDPHeader pUdpHeader;
PUCHAR pData;
PUCHAR pMemory;
PRSVD Rsvd;

UINT i = 0;
UINT uOffset;
USHORT iLen;

int j;

UINT uTotalLen=sizeof(EtherHeader)+sizeof(IPHeader)+sizeof(UDPHeader)+uBufferSize;
if(uTotalLen>MAX_ETHER_SIZE)
return NDIS_STATUS_FAILURE;

//分配一个包
NdisAllocatePacket(&Status,&MyPacket,gPacketPool);
if(Status != NDIS_STATUS_SUCCESS)
{
DbgPrint(\"nNdisAllocatePacket() failed\\n\");
return Status;
}
Rsvd = (PRSVD)(MyPacket->ProtocolReserved);
Rsvd->OriginalPkt = NULL;

//分配以太网包头NDIS_MEMORY_NONCACHED
Status = NdisAllocateMemory(&pMemory,BUFFER_SIZE,0,HighestAcceptableMax);
if(Status != NDIS_STATUS_SUCCESS)
{
NdisDprFreePacket(MyPacket);
return Status;
}
uOffset=0;
pEtherheader=(PEtherHeader)&pMemory[uOffset];

for(i = 0;i<6;i++)
pEtherheader->ether_dst = gDestMac;
for(i = 0;i<6;i++)
pEtherheader->ether_src= gSrcMac ;

pEtherheader->type = htons(IP); //IP数据报

uOffset=sizeof(EtherHeader);
pIpHeader=(PIPHeader)&(((PUCHAR)pEtherheader)[uOffset]);

pIpHeader->version=5; //版本:主机顺序,如果是网络顺序则是首部长度
pIpHeader->header_len=IPVERSION;//sizeof(IPHeader); //首部长度:主机顺序,如果是网络顺序则是版本号
pIpHeader->type=0; //服务类型
iLen=sizeof(IPHeader)+sizeof(UDPHeader)+uBufferSize;
pIpHeader->length=htons(iLen); //总长度
pIpHeader->id=0; //标识符
pIpHeader->flag_offset=0; //标志(3)偏移(13)
pIpHeader->time=128; //生成时间
pIpHeader->protocol=PROT_UDP; //协议类型
// pIpHeader->crc_val=0;
pIpHeader->crc_val=Checksum((USHORT *)pIpHeader,sizeof(IPHeader)); //校验和
pIpHeader->src_addr=gSrcIp; //源地址
pIpHeader->des_addr=gDestIp; //目的地址

uOffset=sizeof(EtherHeader)+sizeof(IPHeader);
pUdpHeader=(PUDPHeader)&(((PUCHAR)pEtherheader)[uOffset]);

pUdpHeader->uh_dport=htons(SERVER_PORT);
pUdpHeader->uh_sport=htons(HOST_PORT);
// pUdpHeader->uh_sum=Checksum((USHORT *)pUdpHeader,sizeof(UDPHeader));
pUdpHeader->uh_sum=0;
iLen=sizeof(UDPHeader)+uBufferSize;
pUdpHeader->uh_ulen=htons(iLen);

uOffset=sizeof(EtherHeader)+sizeof(IPHeader)+sizeof(UDPHeader);
pData=&(((PUCHAR)pEtherheader)[uOffset]);
NdisMoveMemory(pData,pBuffer,uBufferSize);
iLen=1;

for(i=0;iLen!=0;i++)
{
for(j=0;j<16;j++)
{
iLen=i*16+j;
if(iLen<uTotalLen)
DbgPrint(\"%2x  \",pMemory[iLen]);
else
{
iLen=0;
break;
}
}
DbgPrint(\"\\n\");
}

NdisAllocateBuffer(
&Status,
&pNdis_Ether,
gBufferPool,
pMemory,
BUFFER_SIZE);
if(Status != NDIS_STATUS_SUCCESS)
{
NdisFreePacket(MyPacket);
NdisFreeMemory(pMemory,BUFFER_SIZE,0);
return Status;
}


//将以太网头送入包中
NdisChainBufferAtFront(MyPacket, pNdis_Ether);
//NdisSetPacketFlags(MyPacket,pAdapt->Medium);

MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;
NDIS_SET_PACKET_HEADER_SIZE(MyPacket,14);
NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);

NdisSend(&Status, pAdapt->BindingHandle, MyPacket);
if (Status != NDIS_STATUS_PENDING)
{
NdisFreePacket(MyPacket);
NdisFreeMemory(pMemory,BUFFER_SIZE,0);
NdisFreeBuffer(pNdis_Ether);
}
return Status;
}

zxcasd
驱动牛犊
驱动牛犊
  • 注册日期2001-06-14
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-21 14:48
你能肯定包中的数据是没有问题的么?有没有在发送前检查过你构造的packet结构中的数据?
死了都要爱......
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-21 14:53
呵呵,我把包中的数据打印出来了,这个数据是代码中间的那个双循环打印出来的,我上午对照过,大概应该是没有问题的
0  e0  4d   0  13  c1   0   a  eb  15  16   e   8   0  45   0  
0  30   0   0   0   0  80  11  3a  be  c0  a8   0  eb  c0  a8  
0  ec  1a  f5  1a  ff   0  1c   0   0  69  20  6c  6f  76  65  
20  79  6f  75  21   0  bf  b5  d6  be  ba  ec  3a  ca
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-21 15:30
哈哈,问题搞顶,ip头的校验和不对,所以在目标机收不到,多谢各位鼎力相助
aldsd
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2005-05-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-21 17:32
请问其中的gBufferPool 变量是怎样得到的?
aldsd
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-21 17:37
NdisAllocateBufferPool(&Status,&gBufferPool,NUM_OF_BUFFERS);
if(Status != NDIS_STATUS_SUCCESS)
return Status;


if(gBufferPool)
NdisFreeBufferPool(gBufferPool);
aldsd
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2005-05-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-04-22 08:50
kangzh:
  我借鉴你的代码,自己在packet协议驱动程序中构造了一个arp包并试图发送,但是一执行NdisSend()就蓝屏重启,能不能帮我看一看错在哪里,帖子标题是“在packet中构造arp包发送失败的问题 ”,谢谢。
aldsd
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-04-22 09:00
可能问题不出现在ndissend中,你看一下ptsendcomplete中,是否泄载有问题,并在那便设一个断点
aldsd
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2005-05-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-22 11:38
果然是SendComplete里处理的问题,现在可以发送了。
谢谢。
aldsd
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-04-23 11:38
还要麻烦大家,我的crc老是计算不正确,感觉无路可走了,
USHORT Checksum(USHORT *pAddr, int len)
{
USHORT sum=0;
while(len>1)
{
sum+=*pAddr++;
len-=2;
}
if(len>0)
sum+=*(UCHAR *)pAddr;

sum=(sum >> 16)+(sum & 0xffff);
sum+=(sum >> 16);
return (~sum)  & 0xffff;
}

对这段ip头计算,就是和sniffer计算的不一样
其中第一行正确,第二行错误(只差一个字节)
ip  checksum=0xb705

45 00 00 3c 00 94 00 00 80 01 b7 05 c0 a8 00 eb c0 a8 00 ec
45 00 00 3c 00 94 00 00 80 01 ba 05 c0 a8 00 eb c0 a8 00 ec


另外通过上面的checksum计算udp_crc效果也是一样,和正确的计算值只差一个字节,我感觉是某个细节有问题,但搞不定
zxcasd
驱动牛犊
驱动牛犊
  • 注册日期2001-06-14
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-04-23 12:21
还要麻烦大家,我的crc老是计算不正确,感觉无路可走了,
USHORT Checksum(USHORT *pAddr, int len)
{
USHORT sum=0;
while(len>1)
{
sum+=*pAddr++;
len-=2;
}
if(len>0)
sum+=*(UCHAR *)pAddr;

sum=(sum >> 16)+(sum & 0xffff);
sum+=(sum >> 16);
return (~sum)  & 0xffff;
}

对这段ip头计算,就是和sniffer计算的不一样
其中第一行正确,第二行错误(只差一个字节)
ip  checksum=0xb705

45 00 00 3c 00 94 00 00 80 01 b7 05 c0 a8 00 eb c0 a8 00 ec
45 00 00 3c 00 94 00 00 80 01 ba 05 c0 a8 00 eb c0 a8 00 ec


另外通过上面的checksum计算udp_crc效果也是一样,和正确的计算值只差一个字节,我感觉是某个细节有问题,但搞不定


checksum在计算前要置0x0000,应该不会有问题
死了都要爱......
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-04-23 13:34
haha ,搞顶,把上面
USHORT sum=0;
改成
int sum=0;
就可以了
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-05-10 14:33
kangzh:在你的代码中用了htons这个函数好多次,请问能把这个函数贴出来吗?谢谢了!
pIpHeader->length=htons(iLen); 这个是用来填IP的报文长度的吧,不知道是如何实现的.我最近也在做一个防火墙,其中就有个包的构造,不知道MAC帧,UDP/IP数据报中的数据长度怎么计算,怎么填这个字段.
marvie
驱动牛犊
驱动牛犊
  • 注册日期2004-03-09
  • 最后登录2005-07-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-05-10 15:03
htons是TCP/IP的一个函数吧,功能就是把u_short的数据类型转化成网络的数据类型(一般是big-endian)
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-05-10 16:25
ULONG htonl(ULONG hostlong)
{
return ((hostlong << 24) | ((hostlong & 0xFF00) << 8) |
((hostlong & 0xFF0000) >> 8) | (hostlong >> 24));
}

ULONG ntohl(ULONG netlong)
{
return htonl(netlong);
}

USHORT htons(USHORT hostshort)
{
return ((hostshort << 8) | (hostshort >> 8));
}

USHORT ntohs(USHORT netshort)
{
return htons(netshort);
}
jackieky
驱动牛犊
驱动牛犊
  • 注册日期2004-02-10
  • 最后登录2004-08-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-05-10 20:45
谢了 kangzh,我正在调试。由于不大熟悉你的数据结构,费了好的劲才调好。然后装上后发现系统立刻就重新启动,:)可能是其他地方的问题了,比如资源释放什么的。我先调下,你的已经调试通过了。是吧,以后有什么问题还要向你请教,先谢了
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-05-11 09:03
呵呵,大家相互帮忙
cmymfc
驱动牛犊
驱动牛犊
  • 注册日期2003-11-30
  • 最后登录2012-06-20
  • 粉丝0
  • 关注0
  • 积分62分
  • 威望8点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-05-11 09:37
asmsys大侠真是厉害啊,偶像,可否给我一个截获ip包的代码
上一页
游客

返回顶部