tcp/ip 详细解析以及网络层简单的发送syn

利用tcp发送syn,我们可以从网络层进行下发,其实就是组装tcp /ip包发送出去.

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//#include <asm/types.h>
#include <linux/ip.h>
//#include <linux/tcp_new.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include <sys/time.h>

#define getrandom(min, max) ((rand() % (int)(((max)+1) - (min))) + (min))

void send_tcp(int sockfd, struct sockaddr_in *addr);
unsigned short checksum(unsigned short *buffer, int size);
unsigned short random_port(unsigned short minport, unsigned short maxport);
void random_ip(char *str);

//nmap:sudo nmap -sP 192.168.1.* 检测内网ip
//nmap:sudo nmap -sS 192.168.1.2 -D 192.168.1.3 用后面的假ip欺诈前面的内网ip,并获取开放的端口号.D:decoys诱饵
//查看公网ip:curl ident.me
int main(int argc, char **argv) 
{
	int sockfd;
	struct sockaddr_in addr;
	//int dport;
	int on = 1;
	if (argc != 3) 
	{
		printf("usage: <command_name> <target_ip> <port>\n");
		exit(-1);
	}
	bzero(&addr, sizeof(struct sockaddr_in));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(atoi(argv[2]));
	//addr.sin_addr.s_addr=inet_aton(argv[1]);
	inet_pton(AF_INET, argv[1], &addr.sin_addr);
	/*if(inet_aton(argv[1],&addr.sin_addr)==0){
	 * 	host=gethostbyname
	 * 		}*/
	sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);//SOCK_RAW原始套接字,root才可以创建
	if (sockfd<0) 
	{
		printf("Socket error!\n");
		exit(-1);
	}
	setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));//IP_HDRINCL自己编写ip头
	struct timeval tv,tm;
	gettimeofday(&tv,NULL);
	while (1) 
	{
		static int i = 0;
		++i;
		//if(i=5) break;
		send_tcp(sockfd, &addr);
		sleep(1024);
		//gettimeofday(&tm,NULL);
		//if(tv.tv_sec + 10 <= tm.tv_sec) break;
	}
	printf("exit.\n");
	return 0;
}

void send_tcp(int sockfd, struct sockaddr_in *addr) 
{
	char buff[sizeof(struct iphdr) + sizeof(struct tcphdr)];
	memset(buff,0x0,sizeof(buff));
	struct iphdr *ip_header = (struct iphdr *)buff;
	struct tcphdr *tcp_header = (struct tcphdr *)&buff[sizeof(struct iphdr)];
	unsigned short source_port = random_port(1024, 5000);
	char ip_str[50];
	struct in_addr ip;

	//random_ip(ip_str);
	//if (inet_aton(ip_str, &ip) == 0) 
	//{
	//	printf("inet_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值