当前位置:编程学习 > 网站相关 >>

linux下S扫描器

熟悉s扫描器的人都知道它是wineggdrop 写的一个端口扫描工具,小黑入门必学啊。今天我也捣鼓了一个linux下的s扫描器,只支持syn半开扫描方式,速度也是相当的快的
 

至少需要提供2个参数 一个是扫描的ip 或者 ip段 一个是 要扫描的端口 可选参数 /save 表示是不是要把扫描结构记录到文件 。。。
看看效果

ip支持很多种格式 例如
11.11.11.11/24 或者 /16 /8
11.111.11.11,22.22.22.22-33.33.33.33
只要之间使用 , 分割开来就行了
端口也是支持格式
21,22,23,3389-10000
扫描速度和windows下的s扫描器差不多 看你网速了。
源代码如下,需要的话自己编译下
gcc s.c -lpthread -o s
有什么问题可以留言,代码在 bt5 上面编译通过 其他机器应该没什么问题。
PS 运行需要root 权限

 

/*
TCP Syn port scanner
By:sincoder
Blog:www.sincoder.com
Team: www.90sec.org

gcc -lpthread s.c -o s

*/

#include <stdio.h> //printf
#include <string.h> //memset
#include <stdlib.h> //for exit(0);
#include <sys/socket.h>
#include <errno.h> //For errno - the error number
#include <pthread.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <netdb.h>        //hostend
#include <arpa/inet.h>
#include <netinet/tcp.h>        //Provides declarations for tcp header
#include <netinet/ip.h>        //Provides declarations for ip header
#define  msg(fmt,arg...) printf(fmt,##arg);fflush(stdout)

const char *logFileName = "Result.txt";
int log_fd = 0;  // for log
int bIsLogRet = 0 ;//is log scan result
uint32_t g_bind_ip = 0; // 绑定的本地ip
uint8_t g_port_list[0xFFFF] = {0}; //要扫描的端口相应的位会被置1
volatile int g_IsTimeToShutDown = 0;

enum IpSingType
{
       IP_TYPE_RANGE,
       IP_TYPE_SINGLE
};

typedef struct _IPSting
{
       enum IpSingType type;
       uint32_t start_ip;
       uint32_t end_ip;
}IPString;

IPString *g_ScanIpList = NULL;
uint32_t  g_IpCount = 0;

#pragma pack(push,1)

typedef struct _ip_header
{
       unsigned char  h_lenver; //4位首部长度+4位IP版本号
       unsigned char  tos; //8位服务类型TOS
       unsigned short total_len; //16位总长度(字节)
       unsigned short ident; //16位标识
       unsigned short frag_and_flags; //3位标志位
       unsigned char  ttl; //8位生存时间 TTL
       unsigned char  proto; //8位协议 (TCP, UDP 或其他)
       unsigned short checksum; //16位IP首部校验和
       uint32_t   sourceIP; //32位源IP地址
       uint32_t   destIP; //32位目的IP地址
}IP_HEADER;

typedef struct _tcp_header //定义TCP首部
{
       unsigned short th_sport; //16位源端口
       unsigned short th_dport; //16位目的端口
       uint32_t   th_seq; //32位序列号
       uint32_t   th_ack; //32位确认号
       unsigned char  th_lenres; //4位首部长度/6位保留字
       unsigned char  th_flag; //6位标志位
       unsigned short th_win; //16位窗口大小
       unsigned short th_sum; //16位校验和
       unsigned short th_urp; //16位紧急数据偏移量
}TCP_HEADER;

typedef struct _psd_header //定义TCP伪首部
{
       unsigned long saddr; //源地址
       unsigned long daddr; //目的地址
       char mbz;
       char ptcl; //协议类型
       unsigned short tcpl; //TCP长度
}PSD_HEADER;

#pragma pack(pop)

/*
Get ip from domain name
*/
uint32_t hostname_to_ip(char * hostname)
{
       struct hostent *he;
       struct in_addr **addr_list;
       int i;
       //msg("%s:%s\n",__func__,hostname);
       if ( (he = gethostbyname( hostname ) ) == NULL)
       {
               // get the host info
               //herror("gethostbyname");
               //use inet_ntoa
               return inet_addr(hostname);
       }

       addr_list = (struct in_addr **) he->h_addr_list;

       for(i = 0; addr_list[i] != NULL; i++)
       {
               //Return the first one;
               return (*addr_list[i]).s_addr;
               //return inet_ntoa(*addr_list[i]) ;
       }
       return 0;
}

unsigned short checkSum(void * buffer, int size)
{
       unsigned long cksum=0;
       while (size >1) {
               cksum += *(unsigned short *)buffer;
               size -= sizeof(unsigned short);
               buffer = (char *)buffer + sizeof(unsigned short);
       }
       if (size) cksum += *(unsigned char*) buffer;
       cksum = (cksum >> 16) + (cksum&0xffff);
       cksum += (cksum >> 16);
       return (unsigned short) (~cksum);
}

int        buildSynPacket(char * buf, u_long saddr, u_long sport, u_long daddr, u_long dport)
{
       int        len = 0;
       IP_HEADER ip_header;
       TCP_HEADER tcp_header;
       PSD_HEADER psd_header;
       //填充IP首部
       ip_header.h_lenver=(4<<4 | sizeof(ip_

补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,