端口扫描原理与实现_用c实现端口扫描

hacker|
241

大哥大姐们,忙我弄下怎么知道自己或是别人的端口,?通过工具还是别的扫描……急……跪求

一般, 入侵个人PC机. 是不用这个工具的.

一般常规利用端口: 42,21,23,80,135,445,1433,3389,4899.

等等. 一般,只要扫这些端口就OK了.

扫你自己的有漏洞,建议你打全补丁.

这说明网镖开始起作用了

金山网镖是一种防火墙软件,主要是杜绝一些恶意的连接,对进入和出的数据、端口等进行监控,极大的提高了系统的安全性,如果使用得当,不仅可以拦截类似你所说的冲击波等病毒的攻击,而且可以防范黑客的端口扫描程序,如果本机加载了木马程序,也会予以拦截。

如果你嫌总是弹出窗口太麻烦的话,那么弹出窗口时如果有,不再弹出窗口的选项请勾选,如果没有,那就打开金山网镖的主窗口,在选项里边找类似的方法

│ 1│

└—┘0x0000000A:IRQL_NOT_LESS_OR_EQUAL

◆错误分析:主要是由问题的驱动程序、有缺陷或不兼容的硬件与软件造成的. 从技术角度讲. 表明在内核模式中存在以太高的进程内部请求级别(IRQL)访问其没有权限访问的内存地址.

◇解决方案:请用前面介绍的解决方案中的2、3、5、8、9方案尝试排除.

┌—┐

│ 2│

└—┘0x00000012:TRAP_CAUSE_UNKNOWN

◆错误分析:如果遇到这个错误信息, 那么很不幸, 应为KeBudCheck分析的结果是错误原因未知.

◇解决方案:既然微软都帮不上忙, 就得靠自己了, 请仔细回想这个错误是什么时候出现的; 第一次发生时你对系统做了哪些操作; 发生时正在进行什么操作. 从这些信息中找出可能的原因, 从而选择相应解决方案尝试排除.

┌—┐

│ 3│

└—┘0x0000001A:MEMORY_MANAGEMENT

◆错误分析:这个内存管理错误往往是由硬件引起的, 比如: 新安装的硬件、内存本身有问题等.

◇解决方案:如果是在安装Windows时出现, 有可能是由于你的电脑达不到安装Windows的最小内存和磁盘要求.

┌—┐

│ 4│

└—┘0x0000001E:KMODE_EXCEPTION_NOT_HANDLED

◆错误分析:Windows内核检查到一个非法或者未知的进程指令, 这个停机码一般是由问题的内存或是与前面0x0000000A相似的原因造成的.

◇解决方案:

(1)硬件兼容有问题:请对照前面提到的最新硬件兼容性列表, 查看所有硬件是否包含在该列表中.

(2)有问题的设备驱动、系统服务或内存冲突和中断冲突: 如果在蓝屏信息中出现了驱动程序的名字, 请试着在安装模式或者故障恢复控制台中禁用或删除驱动程序, 并禁用所有刚安装的驱动和软件. 如果错误出现在系统启动过程中, 请进入安全模式, 将蓝屏信息中所标明的文件重命名或者删除.

(3)如果错误信息中明确指出Win32K.sys: 很有可能是第三方远程控制软件造成的, 需要从故障恢复控制台中将对该软件的服务关闭.

(4)在安装Windows后第一次重启时出现:最大嫌疑可能时系统分区的磁盘空间不足或BIOS兼容有问题.

(5)如果是在关闭某个软件时出现的:很有可能时软件本省存在设计缺陷, 请升级或卸载它.

┌—┐

│ 5│0x00000023:FAT_FILE_SYSTEM

└—┘0x00000024:NTFS_FILE_SYSTEM

◆错误分析:0x00000023通常发生在读写FAT16或者FAT32文件系统的系统分区时, 而0x00000024则是由于NTFS.sys文件出现错误(这个驱动文件的作用是容许系统读写使用NTFS文件系统的磁盘). 这两个蓝屏错误很有可能是磁盘本身存在物理损坏, 或是中断要求封包(IRP)损坏而导致的. 其他原因还包括:硬盘磁盘碎片过多; 文件读写操作过于频繁, 并且数据量非常达或者是由于一些磁盘镜像软件或杀毒软件引起的.

◇解决方案:

第一步:首先打开命令行提示符, 运行\\"Chkdsk /r\\"(注:不是CHKDISK, 感觉象这个, 但是……)命令检查并修复硬盘错误, 如果报告存在怀道(Bad Track), 请使用硬盘厂商提供的检查工具进行检查和修复.

第二步:接着禁用所有即使扫描文件的软件, 比如:杀毒软件、防火墙或备份工具.

第三步:右击C:\\winnt\\system32\\drivers\\fastfat.sys文件并选择\\"属性\\", 查看其版本是否与当前系统所使用的Windows版本相符.(注:如果是XP, 应该是C:\\windows\\system32\\drivers\\fastfat.sys)

第四步:安装最新的主板驱动程序, 特别IDE驱动. 如果你的光驱、可移动存储

对于端口扫描,开始ip和结束ip如何设置?

1 开始-运行,输入cmd /k ipconfig/all,找到IP Address后面的数字串,如扫描局域网内电脑,把第四位数字改为1 开始, 254结束。

2 扫描互联网IP,就ping 域名的IP作为开始和结束IP(相同)

那种扫描不能正确的判断windows系统的端口开放

1. 完全连接扫描

完全连接,利用TCP/IP协议的三次握手连接机制,使源主机和目的主机的某个端口建立一次完整的连接,如果建立成功,则表明该端口开放。否则表明该端口关闭。

2. 半连接扫描

半连接扫描是指在源主机和目标主机的三次握手连接过程中,只完成前两次握手,不建立异常完整的连接。

3. SYN扫描

首先向目标主机发送连接请求,当目标主机返回响应后,立即切断连接过程,并查看响应情况。

如果目标主机返回ACK信息,表示目标主机的该端口开发。如果目标主机返回RESET信息,表示该端口没有开放。

4. ID头信息扫描

首先知道一个概念,dumb主机:不太活跃的主机,类似于这个服务器上没有什么服务,被别人空置的主机。

首先由源主机A向dumb主机B发出连续的ping包,并查看数据包的ID头信息。每个顺序数据包的ID头会增加1。然后由源主机A假冒主机B的地址向目标的主机C的任意端口(1-65535)发送SYN数据包,这时,主机C向主机B发送的数据包有两种可能结果:

SYN | ACK表示改端口处于监听状态;

RST | ACK表示改端口处于非监听状态;

由后续ping包的响应信息的ID头信息可以看出,如果主机C的某个端口是开放的,则主机B返回A的数据包中,ID头的值不是递增1。如果主机C的端口是非开放的,则主机B返回A的数据包中,ID头的值递增1,非常规律。

5. 隐蔽扫描

隐蔽扫描是指能够成功的绕过IDS(intrusion detection system入侵检测系统)、防火墙和监视系统等安全机制,取得目标主机端口信息的一种扫描方式。

6. SYN | ACK扫描

由源主机向目标主机的某个端口直接发送SYN | ACK数据包,而不是先发SYN数据包。由于这种方式不发送SYN数据包,目标主机会认证这是一次错误的连接,从而会报错。

如果目标主机的该端口没有开放,则会发送RST信息。如果目标主机的该端口处于开放状态(listening),则不会返回任何信息,而是直接将这个数据包抛弃。

7. FIN扫描

源主机A向目标主机B发送FIN数据包,然后查看反馈信息,如果端口返回RESET(RST)信息,则说明该端口关闭。如果端口没有返回然后信息,则说明该端口开放。

8. ACK扫描

由主机A向目标主机B发送FIN数据包,查看反馈数据包的TTL值和WIN值。开放端口所返回的数据包的TTL值小于64,关闭端口的返回值大于64。开放端口的返回值大于64.开放端口返回的WIN值大于0,关闭端口的返回值一般等于0。

9. NULL扫描

将源主机发送的数据包中的ACK、FIN、RST、SYN、URG、PSH等标志位全部置空。如果目标主机没有返回任何信息,则表明该端口是开放的。如果返回RST信息,则表明该端口是关闭的。

10. XMAS扫描

XMAS扫描的原理和NULL相同,只是将要发送的数据包中的ACK、FIN、RST、SYN、URG、PSH等标志位全部设置为1。如果目标主机没有返回任何信息,则表明该端口是开放的,如果返回RST信息,则表明该端口关闭。

C语言与网络问题 高手进

ping命令是dos命令可以创建一个cmd进程,然后建立两个管道用来得到结果 实现.

下面是一个网络编程的实例, Syn扫描器代码,可以作为参考.

基本可以看为是 ping命令的实现

//getallIP.cpp

#include winsock2.h

#include stdio.h

#pragma comment(lib,"ws2_32.lib")

int main()

{

////////////////

// 初始化 Windows sockets API.

//

WORD wVersionRequested = MAKEWORD(2, 2);

WSADATA wsaData;

if (WSAStartup(wVersionRequested, wsaData)) {

printf("WSAStartup failed %s\n", WSAGetLastError());

return 0;

}

//////////////////

// 获得主机名.

//

char hostname[256];

int res = gethostname(hostname, sizeof(hostname));

if (res != 0) {

printf("Error: %u\n", WSAGetLastError());

return 0;

}

printf("hostname=%s\n", hostname);

////////////////

// 根据主机名获取主机信息.

//

hostent* pHostent = gethostbyname(hostname);

if (pHostent==NULL) {

printf("Error: %u\n", WSAGetLastError());

return 0;

}

//////////////////

// 解析返回的hostent信息.

//

hostent he = *pHostent;

printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n",

he.h_name, he.h_aliases, he.h_addrtype, he.h_length);

sockaddr_in sa;

//根据 he.h_addr_list[nAdapter]是否为空来获取所有IP地址

for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {

memcpy ( sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);

// 输出机器的IP地址.

printf("Address [%d%]: %s\n",nAdapter, inet_ntoa(sa.sin_addr)); // 显示地址串

}

//////////////////

// 终止 Windows sockets API

//

WSACleanup();

return 0;

}

//mstcpip.h

// Copyright (C) Microsoft Corporation, 1996-1999

#if _MSC_VER 1000

#pragma once

#endif

/* Argument structure for SIO_KEEPALIVE_VALS */

struct tcp_keepalive {

u_long onoff;

u_long keepalivetime;

u_long keepaliveinterval;

};

// New WSAIoctl Options

#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

#define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2)

#define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3)

#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)

#define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5)

#define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6)

#define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7)

#define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8)

#define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9)

#define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10)

#define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11)

//synscan.cpp

#include winsock2.h

#include ws2tcpip.h

#include stdio.h

#include time.h

#include "mstcpip.h"

#pragma comment(lib,"ws2_32.lib")

#define SEQ 0x28376839

SOCKET sockRaw = INVALID_SOCKET,

sockListen = INVALID_SOCKET;

struct sockaddr_in dest;

BOOL ScanOK=FALSE;

char *DEST_HOST;

int DEST_PORT;

int DEST_PORTEND;

int play=0;

clock_t start,end;//程序运行的起始和结束时间

float costtime;//程序耗时

typedef struct _iphdr

{

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首部校验和

unsigned int sourceIP; //32位源IP地址

unsigned int destIP; //32位目的IP地址

}IP_HEADER;

typedef struct _tcphdr //定义TCP首部

{

USHORT th_sport; //16位源端口

USHORT th_dport; //16位目的端口

unsigned int th_seq; //32位序列号

unsigned int th_ack; //32位确认号

unsigned char th_lenres; //4位首部长度/6位保留字

unsigned char th_flag; //6位标志位

USHORT th_win; //16位窗口大小

USHORT th_sum; //16位校验和

USHORT th_urp; //16位紧急数据偏移量

}TCP_HEADER;

struct //定义TCP伪首部

{

unsigned long saddr; //源地址

unsigned long daddr; //目的地址

char mbz;

char ptcl; //协议类型

unsigned short tcpl; //TCP长度

}psd_header;

//SOCK错误处理程序

void CheckSockError(int iErrorCode, char *pErrorMsg)

{

if(iErrorCode==SOCKET_ERROR)

{

printf("%s Error:%d\n", pErrorMsg, GetLastError());

closesocket(sockRaw);

ExitProcess(-1);

}

}

//计算检验和

USHORT checksum(USHORT *buffer, int size)

{

unsigned long cksum=0;

while (size 1)

{

cksum += *buffer++;

size -= sizeof(USHORT);

}

if (size)

{

cksum += *(UCHAR*)buffer;

}

cksum = (cksum 16) + (cksum 0xffff);

cksum += (cksum 16);

return (USHORT)(~cksum);

}

//IP解包程序

bool DecodeIPHeader(char *buf, int bytes)

{

IP_HEADER *iphdr;

TCP_HEADER *tcphdr;

unsigned short iphdrlen;

iphdr = (IP_HEADER *)buf;

iphdrlen = sizeof(unsigned long) * (iphdr-h_lenver 0xf);

tcphdr = (TCP_HEADER*)(buf + iphdrlen);

//是否来自目标IP

if(iphdr-sourceIP != dest.sin_addr.s_addr) return false;

//序列号是否正确

if((ntohl(tcphdr-th_ack) != (SEQ+1)) (ntohl(tcphdr-th_ack) != SEQ)) return false;

//if(tcphdr-th_flag == 20)return true;

//SYN/ACK - 扫描到一个端口

if(tcphdr -th_flag == 18)

{

printf("\t%d\t open \n",ntohs(tcphdr-th_sport));

return true;

}

return true;

}

void usage(void)

{

printf("\t===================SYN portscaner======================\n");

printf("\t============gxisone@hotmail.com 2004/7/6===========\n");

printf("\tusage: synscan DomainName[IP] StartPort-EndPort\n");

printf("\tExample: synscan 1-139\n");

printf("\tExample: synscan 192.168.1.1 8000-9000\n");

}

DWORD WINAPI RecvThread(LPVOID para)//接收数据线程函数

{

int iErrorCode;

struct hostent *hp;

char RecvBuf[65535]={0};

sockListen = socket(AF_INET , SOCK_RAW , IPPROTO_IP);

CheckSockError(sockListen, "socket");

//设置IP头操作选项

BOOL bOpt = true;

iErrorCode = setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char *)bOpt,sizeof(bOpt));

CheckSockError(iErrorCode, "setsockopt()");

//获得本地IP

SOCKADDR_IN sa;

unsigned char LocalName[256];

iErrorCode = gethostname((char*)LocalName,sizeof(LocalName)-1);

CheckSockError(iErrorCode, "gethostname()");

if((hp = gethostbyname((char*)LocalName)) == NULL)

{

CheckSockError(SOCKET_ERROR, "gethostbyname()");

}

memcpy(sa.sin_addr.S_un.S_addr,hp-h_addr_list[1],hp-h_length);

sa.sin_family = AF_INET;

sa.sin_port = htons(7000);

iErrorCode = bind(sockListen, (PSOCKADDR)sa, sizeof(sa));

CheckSockError(iErrorCode, "bind");

//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包

DWORD dwBufferLen[10] ;

DWORD dwBufferInLen = 1 ;

DWORD dwBytesReturned = 0 ;

iErrorCode=WSAIoctl(sockListen, SIO_RCVALL,dwBufferInLen, sizeof

(dwBufferInLen),dwBufferLen, sizeof(dwBufferLen),dwBytesReturned , NULL , NULL );

CheckSockError(iErrorCode, "Ioctl");

memset(RecvBuf, 0, sizeof(RecvBuf));

//接收数据

for(;;)

{

iErrorCode = recv(sockListen, RecvBuf, sizeof(RecvBuf), 0);

//CheckSockError(iErrorCode, "recv");

DecodeIPHeader(RecvBuf,iErrorCode) ;

}

if(ScanOK)

{

closesocket(sockListen);

return 0;

}

}

void playx(void) // 定义状态提示函数

{

// 进度条

char *plays[12]=

{

" | ",

" / ",

" - ",

" \\ ",

" | ",

" / ",

" - ",

" \\ ",

" | ",

" / ",

" - ",

" \\ ",

};

printf(" =%s=\r", plays[play]);

play=(play==11)?0:play+1;

Sleep(2);

}

//主函数

int main(int argc,char **argv)

{

char *p;

if(argc!=3)

{

usage();

return 0;

}

p=argv[2];//处理端口参数

if(strstr(argv[2],"-"))

{ DEST_PORT=atoi(argv[2]);

for(;*p;)

if(*(p++)=='-')break;

DEST_PORTEND=atoi(p);

if(DEST_PORT1 || DEST_PORTEND65535)

{ printf("Port Error!\n");

return 0;

}

}

DEST_HOST=argv[1];

usage();

int iErrorCode;

int datasize;

struct hostent *hp;

IP_HEADER ip_header;

TCP_HEADER tcp_header;

char SendBuf[128]={0};

//初始化SOCKET

WSADATA wsaData;

iErrorCode = WSAStartup(MAKEWORD(2,2),wsaData);

CheckSockError(iErrorCode, "WSAStartup()");

sockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);

CheckSockError(sockRaw, "socket()");

sockListen = socket(AF_INET , SOCK_RAW , IPPROTO_IP);

CheckSockError(sockListen, "socket");

//设置IP头操作选项

BOOL bOpt = true;

iErrorCode = setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char *)bOpt,sizeof(bOpt));

CheckSockError(iErrorCode, "setsockopt()");

//获得本地IP

SOCKADDR_IN sa;

unsigned char LocalName[256];

iErrorCode = gethostname((char*)LocalName,sizeof(LocalName)-1);

CheckSockError(iErrorCode, "gethostname()");

if((hp = gethostbyname((char*)LocalName)) == NULL)

{

CheckSockError(SOCKET_ERROR, "gethostbyname()");

}

memcpy(sa.sin_addr.S_un.S_addr,hp-h_addr_list[1],hp-h_length);

sa.sin_family = AF_INET;

sa.sin_port = htons(7000);

iErrorCode = bind(sockListen, (PSOCKADDR)sa, sizeof(sa));

CheckSockError(iErrorCode, "bind");

//获得目标主机IP

memset(dest,0,sizeof(dest));

dest.sin_family = AF_INET;

dest.sin_port = htons(DEST_PORT);

if((dest.sin_addr.s_addr = inet_addr(DEST_HOST)) == INADDR_NONE)

{

if((hp = gethostbyname(DEST_HOST)) != NULL)

{

memcpy((dest.sin_addr),hp-h_addr_list[1],hp-h_length);

dest.sin_family = hp-h_addrtype;

printf("dest.sin_addr = %s\n",inet_ntoa(dest.sin_addr));

}

else

{

CheckSockError(SOCKET_ERROR, "gethostbyname()");

}

}

//开启监听线程

HANDLE Thread=CreateThread(NULL,0,RecvThread,0,0,0);

//填充IP首部

ip_header.h_lenver=(44 | sizeof(ip_header)/sizeof(unsigned long));

//高四位IP版本号,低四位首部长度

ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节)

ip_header.ident=1; //16位标识

ip_header.frag_and_flags=0; //3位标志位

ip_header.ttl=128; //8位生存时间TTL

ip_header.proto=IPPROTO_TCP; //8位协议(TCP,UDP…)

ip_header.checksum=0; //16位IP首部校验和

ip_header.sourceIP=sa.sin_addr.s_addr; //32位源IP地址

ip_header.destIP=dest.sin_addr.s_addr; //32位目的IP地址

//填充TCP首部

tcp_header.th_sport=htons(7000); //源端口号

tcp_header.th_lenres=(sizeof(TCP_HEADER)/44|0); //TCP长度和保留位

tcp_header.th_win=htons(16384);

//填充TCP伪首部(用于计算校验和,并不真正发送)

psd_header.saddr=ip_header.sourceIP;

psd_header.daddr=ip_header.destIP;

psd_header.mbz=0;

psd_header.ptcl=IPPROTO_TCP;

psd_header.tcpl=htons(sizeof(tcp_header));

Sleep(500);

printf("\n");

printf("Scaning %s\n",DEST_HOST);

start=clock();//开始计时

for(;DEST_PORTDEST_PORTEND;DEST_PORT++)

{

playx();

tcp_header.th_dport=htons(DEST_PORT); //目的端口号

tcp_header.th_ack=0; //ACK序列号置为0

tcp_header.th_flag=2; //SYN 标志

tcp_header.th_seq=htonl(SEQ); //SYN序列号

tcp_header.th_urp=0; //偏移

tcp_header.th_sum=0; //校验和

//计算TCP校验和,计算校验和时需要包括TCP pseudo header

memcpy(SendBuf,psd_header,sizeof(psd_header));

memcpy(SendBuf+sizeof(psd_header),tcp_header,sizeof(tcp_header));

tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));

//计算IP校验和

memcpy(SendBuf,ip_header,sizeof(ip_header));

memcpy(SendBuf+sizeof(ip_header),tcp_header,sizeof(tcp_header));

memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);

datasize=sizeof(ip_header)+sizeof(tcp_header);

ip_header.checksum=checksum((USHORT *)SendBuf,datasize);

//填充发送缓冲区

memcpy(SendBuf,ip_header,sizeof(ip_header));

//发送TCP报文

iErrorCode=sendto(sockRaw,SendBuf,datasize,0,(struct sockaddr*) dest,

sizeof(dest));

CheckSockError(iErrorCode, "sendto()");

}

end=clock();//计时结束

ScanOK=TRUE;

printf("Closeing Thread.....\n");

WaitForSingleObject(Thread,5000);

CloseHandle(Thread);

costtime= (float)(end - start) / CLOCKS_PER_SEC; //转换时间格式

printf("Cost time:%f Sec",costtime);//显示耗时

//退出前清理

if(sockRaw != INVALID_SOCKET) closesocket(sockRaw);

WSACleanup();

return 0;

}

0条大神的评论

发表评论