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_
补充:综合编程 , 安全编程 ,