扫描某个IP地址的所有TCP端口,可指定要扫描的线程数以及超时时间设置。可用于扫描某台机器打开了什么端口。
项目是win32程序,可直接编译通过,效果如图:
程序就五个目标文件,通过分析命令行参数进行执行的,没有命令行参数则直接退出。工程如图:
程序的主要源码:
typedef enum
{
CLOSED = 0,
OPENED = 1,
TIMEDOUT = 2
} port_response;
typedef void (*rescb)(port_response resp, unsigned short port);
//网络初始化
void net_init();
//释放网络
void net_end();
//参数
void struct_init(rescb cb, unsigned long wait_time);
//释放资源
void net_uninit();
//网络添加扫描对象
int net_add(unsigned long ip, unsigned short port, unsigned long time);
//网络检查
int net_check(unsigned long time);
//将一个IP转换成一个互联网标准点分格式的字符串
char *net_get_aip(unsigned long ip);
//将一个点分十进制的IP转换成一个长整数型数
unsigned long net_get_iip(char *aip);
int main(int argc, char *argv[])
{
int PortCount;
unsigned long time;
//输出简介
print_general();
argc = 2;
argv[0]="123";
argv[1]="192.168.1.114";
if (argc < 2)
{
//输出帮助信息
print_help();
return 0;
}
//分析参数 得到要扫描的端口数量
PortCount = parse_arguments(argc, argv);
//输出 根据命令行参数匹配得出的配置信息
print_config();
//初始化网络
net_init();
//加载文件
if (options & OPTIONS_RESOLVE_PORTS)
port_res_file = read_file(PORT_RES_FILENAME);
total_scanned = 0;
time = get_time();
//是异步扫描还是连接扫描
if (options & OPTIONS_SYN_SCAN)
SynScan(argv[1], PortCount);
else
ConnectScan();
time = get_time() - time;
//输出信息
if (options & OPTIONS_ONFLY_HIDE)
{
port_instance *tmp, *pi = oports;
while (pi)
{
tmp = pi->next;
process_open_port(pi->port);
free(pi);
pi = tmp;
}
}
printf("\nTotal ports scanned: %d\nTotal ports open: %d\n", total_scanned, total_opened);
printf("\n# Scan time: %u.%03u seconds\n\n", (unsigned int)(time / 1000), (unsigned int)(time % 1000));
if (options & OPTIONS_RESOLVE_PORTS) free(port_res_file);
if (options & OPTIONS_RESOLVE_MAC) print_MAC();
net_end();
return 0;
}
学习的目的是成熟!~