底层技术:如何撤消一个TCP连接?

ExitWindows 2003-09-19 10:18:14
现采用sniff技术,截听到底层TCP数据包,现想撤除此TCP链接(代替其它程序发出撤出请求),请问该发出如何的TCP包?
TCP包头格式为:
typedef struct stuTcp{// TCP头
unsigned short PortSour;
unsigned short PortTar;
ULONG SeqNum;
ULONG AckNum;
BYTE HeadLen;
BYTE Flag;
unsigned short WindowSize;
unsigned short CheckSum;
unsigned short InstancyPointer;
}NetStu_TcpHead;
除了Flag为RST(0x04),其它各单元的数据该如何确定?
...全文
153 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohedou 2003-09-29
  • 打赏
  • 举报
回复
look ^ study
ExitWindows 2003-09-29
  • 打赏
  • 举报
回复
风铃请收短信.
windbells 2003-09-29
  • 打赏
  • 举报
回复
to ExitWindows (void)
留下你的qq或email地址,我把我写的序列号计算部分的代码给你发过去,还要注意有个发送方向的问题。
fengge8ylf 2003-09-28
  • 打赏
  • 举报
回复
up
danfeng 2003-09-27
  • 打赏
  • 举报
回复
gz
starcbh 2003-09-27
  • 打赏
  • 举报
回复
截获??是看到了还是拦下来了?
windbells 2003-09-27
  • 打赏
  • 举报
回复
ack和seq的填充肯定有问题
不是加1不加1的问题,需要根据包的状态位判断,
一般带有ack标志的,发送的ack为零,seq为截获包的ack加要发送包长+syn+fin
不带ack标志的也类似,只要区别处理就好了。
mysasina 2003-09-26
  • 打赏
  • 举报
回复
如果能截获到他们之间的通信包,可以获取序列号是可以成功的,不然的话不太可能
GX_NET 2003-09-24
  • 打赏
  • 举报
回复
其实也可以用api钩子,sniff模拟reset报,或者自己做一个dll替换系统的 (比较笨的方法呀)
ydfok 2003-09-23
  • 打赏
  • 举报
回复
一群牛人~~~
Fengq 2003-09-23
  • 打赏
  • 举报
回复
学习
fanfyj 2003-09-23
  • 打赏
  • 举报
回复
关注
bsk 2003-09-23
  • 打赏
  • 举报
回复
关注
ExitWindows 2003-09-23
  • 打赏
  • 举报
回复
我的相关代码如下:
检测到A向B连接,现假冒A向B发RST包, pIpFrameHead, pTcp为检测到的A的包;
My_MacLen 为常量6,即网卡地址的字节数
NetCksum()为生成校验码的函数

void TcpTerminal( NetStu_IpFrameHead *pIpFrameHead, NetStu_TcpHead *pTcp )
{
// 缓冲区
BYTE bBuff[2048]={0};
NetStu_TcpHead *pTcpR = (NetStu_TcpHead *)(bBuff + sizeof(NetStu_IpFrameHead));
pTcpR->PortSour = pTcp->PortSour;
pTcpR->PortTar = pTcp->PortTar;
pTcpR->SeqNum = pTcp->SeqNum;
pTcpR->AckNum = htonl( htonl(pTcp->AckNum)+1 );// ?????????
pTcpR->HeadLen = 0x50;
pTcpR->Flag = 0x04;// RST
pTcpR->WindowSize = htons(0x10);//0x00;
pTcpR->CheckSum = 0;
// 计算TCP校验和
struct{
ULONG uIpSour;
ULONG uIpTar;
BYTE bFill;
BYTE bProtocol;
unsigned short sTcpLen;
NetStu_TcpHead Tcp;
BYTE bData[1024*2];
}TcpCksumHead;// 为计算校验和而生成的伪头标
TcpCksumHead.uIpSour = pIpFrameHead->uIpSender;
TcpCksumHead.uIpTar = pIpFrameHead->uIpReceiver;
TcpCksumHead.bFill = 0;
TcpCksumHead.bProtocol = 0x06;
TcpCksumHead.sTcpLen = htons( (unsigned short)sizeof(NetStu_TcpHead) );
memcpy( &TcpCksumHead.Tcp, pTcpR, sizeof(NetStu_TcpHead) );
pTcpR->CheckSum = NetCksum( (unsigned short*)&TcpCksumHead, 12+sizeof(NetStu_TcpHead) );

// FRAME IP
NetStu_IpFrameHead *pIpFrameR = (NetStu_IpFrameHead *)bBuff;
memcpy( pIpFrameR->sFrame.MacSour, pIpFrameHead->sFrame.MacSour, My_MacLen );
memcpy( pIpFrameR->sFrame.MacTar, pIpFrameHead->sFrame.MacTar, My_MacLen );
pIpFrameR->sFrame.Flag0 = pIpFrameHead->sFrame.Flag0;
pIpFrameR->sFrame.Flag1 = pIpFrameHead->sFrame.Flag1;

pIpFrameR->VerHlen = 0x45;
pIpFrameR->Tos = 0;
pIpFrameR->iIpLen = htons( (unsigned short)( sizeof(NetStu_IpFrameHead) - 2*My_MacLen + sizeof(NetStu_TcpHead) ) );
pIpFrameR->iIpID = pIpFrameHead->iIpID;
pIpFrameR->DfSegpos = 0x0040;
pIpFrameR->TTL = 0x80;
pIpFrameR->Protocol = 0x06;//06:TCP 17:UDP
pIpFrameR->CheckSum = 0;
pIpFrameR->uIpReceiver = pIpFrameHead->uIpReceiver;
pIpFrameR->uIpSender = pIpFrameHead->uIpSender;
//pIpFrameR->CheckSum = NetCksum( (unsigned short*)&(pIpFrameR->VerHlen), sizeof(NetStu_IpFrameHead)-sizeof(NetStu_TcpHead) );//+iMsg404Len );
pIpFrameR->CheckSum = NetCksum( (unsigned short*)&(pIpFrameR->VerHlen), sizeof(NetStu_IpHead)-2 );

extern Stru_AdapterPacket *g_pAdapter;
PacketSend( g_pAdapter->pAdapter, bBuff, 6*2+htons(pIpFrameR->iIpLen) );

return;
}

截包看了,包中的各项数据都是对的,就是不生效,请大侠指点.
AaronChan 2003-09-23
  • 打赏
  • 举报
回复
学习,看到头大哟!:)
mybcsdn 2003-09-23
  • 打赏
  • 举报
回复
gz
everandforever 2003-09-23
  • 打赏
  • 举报
回复
typedef struct stuTcp{// TCP头
unsigned short PortSour;
unsigned short PortTar;
ULONG SeqNum;
ULONG AckNum;
BYTE HeadLen;
BYTE Flag;
unsigned short WindowSize;
unsigned short CheckSum;
unsigned short InstancyPointer;
}NetStu_TcpHead;
//-----------
据TCP结构,
BYTE HeadLen;
BYTE Flag;
这部分应该是:

4位首部长度 | 保留6位 | URG | ACK | PSH | RST | SYN | FIN
----------------------------------------------------------
TCP头第12字节 | TCP头第13字节

总共16位,2字节.
everandforever 2003-09-23
  • 打赏
  • 举报
回复
typedef struct stuTcp{// TCP头
unsigned short PortSour;
unsigned short PortTar;
ULONG SeqNum;
ULONG AckNum;
BYTE HeadLen;
BYTE Flag;
unsigned short WindowSize;
unsigned short CheckSum;
unsigned short InstancyPointer;
}NetStu_TcpHead;
//-----------
据TCP结构,
BYTE HeadLen;
BYTE Flag;
这部分应该是:

4位首部长度 | 保留6位 | URG | ACK | PSH | RST | SYN | FIN
----------------------------------------------------------
TCP头第12字节 | TCP头第13字节

总共16位,2字节.
flinming 2003-09-23
  • 打赏
  • 举报
回复
学习。。。
everandforever 2003-09-23
  • 打赏
  • 举报
回复
邮箱: eien@eyou.com

winpcap和sniff技术,我都不会用.

HeadLen的问题, 我只知道 TCP头 里面 包头长度 那个部分只有四位,最大为二进制 1111(0x0F,15),所以 TCP包头 最长为15 * 4 = 60字节.

如果你能把自己截到的包直接丢弃, 不妨直接使用它的 SN 和 ACK .

SN是根据你在这个TCP连接上已经发送的包数,字节数,还有连接的初始SN(ISN)来计算的.
ACK是根据收到的对方发来的SN, 对其加一, 得到的.

<<TCP/IP详解>>卷一,17-24章.
加载更多回复(26)

18,356

社区成员

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

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