tcp,tcp syn,tcp fin,tcp null,icmp 扫描linux c代码实现

本文介绍了一种使用C语言在Linux环境下实现TCP SYN、TCP FIN、TCP NULL和ICMP扫描的方法,通过.c和.h文件进行编程实现网络扫描技术。
摘要由CSDN通过智能技术生成

.c 文件


#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>        
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <linux/tcp.h>
#include <linux/ip.h>
#include <unistd.h>
#include <pthread.h>
#include "yldscan.h"


//定义参数解析结构
typedef struct __list_arg{
    char scanname[256];
    char dstaddr[32];
    unsigned short port_start;    
    unsigned short port_end;
}ListArg;


#define SCAN_TYPE_TCPSYN 0
#define SCAN_TYPE_TCPFIN 1
#define SCAN_TYPE_TCPNULL 2

#define myprintf(str,arg...) printf(str,##arg)
#define SELFIP "192.168.22.102"

int g_scantype = 0;

static int  parse_arg(int argc,char *argv[],ListArg *parg)
{
    if(argc <= 1)
    { 
        return -1;
    }
   
    if(!strcmp(argv[1],"tcpsyn") || !strcmp(argv[1],"tcp") || !strcmp(argv[1],"tcpfin") || !strcmp(argv[1],"tcpnull"))
    {
        if(argc < 5)
            return -1;

        if(!strcmp(argv[1],"tcpsyn"))
          sprintf(parg->scanname,"%s","tcpsyn");
        else if(!strcmp(argv[1],"tcp"))
          sprintf(parg->scanname,"%s","tcp");
        else if(!strcmp(argv[1],"tcpfin"))
          sprintf(parg->scanname,"%s","tcpfin");
        else if(!strcmp(argv[1],"tcpnull"))
          sprintf(parg->scanname,"%s","tcpnull");
               
        parg->port_start = atoi(argv[2]);
        parg->port_end = atoi(argv[3]);
        if(parg->port_start > 65535  || parg->port_start <=0  || parg->port_end > 65535 || parg->port_end <=0)
           return -1;
        if(parg->port_start > parg->port_end)
           return -1;
        sprintf(parg->dstaddr,"%s",argv[4]);  
    }  
    else if(!strcmp(argv[1],"ping"))
    {
        if(argc < 3)
            return -1;
        sprintf(parg->scanname,"%s","ping");
        sprintf(parg->dstaddr,"%s",argv[2]);
    }
    else
       return -1;

    return 0; 
}

//校验和计算
unsigned short calc_cksum(char *buff,int len)
{
    int blen = len;
    unsigned short *mid = (unsigned short*)buff;
    unsigned short te = 0;
    unsigned int sum = 0;
 
    while(blen > 1)
    {
       sum += *mid++;
       blen -= 2; 
    }

    if(blen == 1)
    {
       te = *(unsigned char*)mid;
       te  = (te << 8) & 0xff;
       sum += te;   
    } 

    sum = (sum >> 16) + (sum&0xffff); 
    sum += sum >>16;  
    return (unsigned short)(~sum);
}

void show_usage(void)
{
       myprintf("Usage...: \n tcp startport endport ipaddr\n");   
       myprintf(" tcpsyn   startport endport ipaddr\n");   
       myprintf(&#
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值