69,371
社区成员
发帖
与我相关
我的任务
分享
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <strings.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#define DESTPORT 80
#define LOCALPORT 12345
/* 发送SYN数据报 */
void send_tcp(int sockfd, struct sockaddr_in* addr);
unsigned short check_sum(unsigned short* addr, int len);
int main(int argc, char* argv[]) {
int sockfd;
struct sockaddr_in addr; // 目标IP地址结构体
int on = 1;
// 初始化目标IP地址结构体
bzero(&addr, sizeof(struct sockaddr_in));
addr.sin_family = PF_INET;
addr.sin_port = htons(DESTPORT);
inet_aton(argv[1], &addr.sin_addr);
/* 创建TCP原始套接字 */
sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
/* 设置IP数据报格式, 开启IP_HDRINCL */
setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
/* 将进程的有效用户ID设置为0 */
setuid(getuid());
/* 发送SYN数据报 */
send_tcp(sockfd, &addr);
return 0;
}
/* 发送SYN数据报 */
void send_tcp(int sockfd, struct sockaddr_in* addr) {
char buffer[100]; // 存放用户自定义的IP数据包
struct ip* ip;
struct tcphdr* tcp;
int head_len;
head_len = sizeof(struct ip) + sizeof(struct tcphdr);
bzero(buffer, 100);
/* 填充IP数据报的头部 */
ip = (struct ip*)buffer;
ip->ip_v = IPVERSION;
ip->ip_hl = sizeof(struct ip) >> 2;
ip->ip_tos = 0;
ip->ip_len = htons(head_len);
ip->ip_id = 0;
ip->ip_off = 0;
ip->ip_ttl = 64;
ip->ip_p = IPPROTO_TCP;
ip->ip_sum = 0;
ip->ip_dst = addr->sin_addr; // 目标IP地址
printf("目标IP地址: %s\n", inet_ntoa(addr->sin_addr));
/* 填充TCP数据包 */
tcp = (struct tcphdr*)(buffer + sizeof(struct ip));
tcp->source = htons(LOCALPORT); // 本地端口
tcp->dest = addr->sin_port; // 目的端口
tcp->seq = 1234;
tcp->ack_seq = 0;
tcp->doff = 5;
tcp->syn = 1; // 请求建立连接
tcp->ack = 0;
tcp->window = 5000;
tcp->check = 0;
ip->ip_src.s_addr = 0x12345678;
printf("address is %s\n", inet_ntoa(ip->ip_src));
sendto(sockfd, buffer, head_len, 0, (struct sockaddr*)addr, sizeof(struct sockaddr));
}