利用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_