1. 程式人生 > >linux下埠掃描程式(C)

linux下埠掃描程式(C)

網路攻擊第一步是掃描目標機的開放埠,其原理是(摘自http://www.pconline.com.cn/pcjob/nettech/safe/others/0502/557020_1.html):

根據TCP協議規範,當一臺計算機收到一個TCP連線建立請求報文(TCP SYN)的時候,做這樣的處理:

  1、 如果請求的TCP埠是開放的,則迴應一個TCP ACK報文,並建立TCP連線控制結構(TCB);
  2、 如果請求的TCP埠沒有開放,則迴應一個TCP RST(TCP頭部中的RST標誌設為1)報文,告訴發起計算機,該埠沒有開放。

  相應地,如果IP協議棧收到一個UDP報文,做如下處理:

  1、 如果該報文的目標埠開放,則把該UDP報文送上層協議(UDP)處理,不迴應任何報文(上層協議根據處理結果而回應的報文例外);


  2、 如果該報文的目標埠沒有開放,則向發起者回應一個ICMP不可達報文,告訴發起者計算機該UDP報文的埠不可達。

  利用這個原理,攻擊者計算機便可以通過傳送合適的報文,判斷目標計算機哪些TCP或UDP埠是開放的,過程如下:

  1、 發出埠號從0開始依次遞增的TCP SYN或UDP報文(埠號是一個16位元的數字,這樣最大為65535,數量很有限);
  2、 如果收到了針對這個TCP報文的RST報文,或針對這個UDP報文的ICMP不可達報文,則說明這個埠沒有開放;
  3、 相反,如果收到了針對這個TCP SYN報文的ACK報文,或者沒有接收到任何針對該UDP報文的ICMP報文,則說明該TCP埠是開放的,UDP埠可能開放(因為有的實現中可能不迴應ICMP不可達報文,即使該UDP埠沒有開放)。


  這樣繼續下去,便可以很容易的判斷出目標計算機開放了哪些TCP或UDP埠,然後針對埠的具體數字,進行下一步攻擊,這就是所謂的埠掃描攻擊。

   根據以上原理,我編寫了以下程式碼(只進行了TCP掃描):

#include<stdlib.h>
#include<stdio.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<fcntl.h>
#include<time.h>
#include<sys/types.h>
#define TIMEOUT 5 //由於把socket設定為非阻塞,使用select函式,觀察其
                //5秒後的是否連線成功,連線不成功則認為其埠沒有開放



struct servenet{
    char * s_name;
	char** s_aliases;
	int    s_port;
	char*  s_proto;
};


//引數是目標機的IP
int main(int argc,char** argv)
{
	struct sockaddr_in server;
	int ret;
	int len;
	int scanport;
    int start_port=0;
    int end_port=1024;
	int sockfd;

	fd_set rset;
	fd_set wset; 
        struct servenet *sp;

	

       
    for(scanport=start_port;scanport<end_port;scanport++)
    {


    	if (-1==(sockfd=socket(AF_INET,SOCK_STREAM,0)))
		{
		perror("can not create socket\n");
		exit(1);
		}
		
		memset(&server,0,sizeof(struct sockaddr_in));
		server.sin_family = AF_INET;
		server.sin_addr.s_addr = inet_addr(argv[1]);
		server.sin_port = htons(scanport);
 		
                int flag = fcntl(sockfd, F_GETFL,0);
		fcntl(sockfd,F_SETFL, flag|O_NONBLOCK);
		struct timeval tm;
		tm.tv_sec = TIMEOUT;
		tm.tv_usec = 0;
        
		//connect為非阻塞,連線不成功立即返回-1
		if (!connect(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr))){
			 sp=getservbyport(htons(scanport),"tcp");
 
        	printf("tcp port %d open:%s\n ",scanport,sp->s_name);

			
                }//假如連線不成功,則執行select,直到超時
		else {
			FD_ZERO(&rset);
			FD_ZERO(&wset);
			FD_SET(sockfd, &rset);
			FD_SET(sockfd, &wset);
			int error; //錯誤程式碼
			int len = sizeof(error); 
			//5秒後檢視socket的狀態變化 
			if (select(sockfd+1,&rset,&wset,NULL,&tm)>0){
				getsockopt(sockfd, SOL_SOCKET, SO_ERROR,&error, &len );
				if(error == 0)
					printf("Port %d is opened\n", scanport);
			}
		
		}
		close(sockfd);

	}
		return 0;

}


相關推薦

linux掃描程式C

網路攻擊第一步是掃描目標機的開放埠,其原理是(摘自http://www.pconline.com.cn/pcjob/nettech/safe/others/0502/557020_1.html): 根據TCP協議規範,當一臺計算機收到一個TCP連線建立請求報文(TCP

Linux掃描程式nmap介紹

NMAP(1)                      Nmap Reference Guide                      NMAP(1) NAME        nmap - Network exploration tool and security / port sc

Linux串列程式設計教程——串列程式設計詳原始碼解:http://blog.csdn.net/u011192270/article/details/48174353 Linux的串列程式設計(二----圖文並茂,講解深刻http://blog.csdn.net/w28252

Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂,講解深刻)http://blog.csdn.ne

linuxoracle11G DG搭建:興許驗證操作

歸檔 驗證 補充 over nts content -s 環境 fontsize linux下oracle11G DG搭建(四):興許驗證操作 環境 名稱 主庫 備庫 主機名 bjsrv shsrv 軟件版本號 RedH

LinuxMySQL的基礎

mysql基於解釋MYSQL的基礎1. MySQL服務器中幫助的使用格式: mysql> help command eg: mysql> help create database Name: ‘CREATE DATABASE‘ Description: Sy

linux殺死進程kill的N種方法

linxu、ps、kill首先,用ps查看進程,方法如下:$ ps -ef……smx 1822 1 0 11:38 ? 00:00:49 gnome-terminalsmx 1823 1822 0 11:38 ? 00:00:00 gnome-

Linux的基本指令

文章目錄 1.檔案系統層次結構 1.1根目錄下重要的目錄 2. 對目錄進行操作 2.1 樹狀目錄結構的解釋 2.2 目錄的基本命令 1. cp 指令:複製一個或多個檔案

Linux使用ElasticSearch教程

一:ElasticSearch在Linux下安裝簡單總結.       1.本次安裝的版本是ES6.3.2.版本.下載到壓縮包.解壓後直接來到當前的解壓目錄.       cd config     &n

Linux生成隨機密碼

1、使用SHA演算法來加密日期,並輸出結果的前32個字元: date +%s |sha256sum |base64 |head -c 32 ;echo 生成結果如下: ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4 2、使用內嵌的/dev/urandom,並過濾掉那些日常

Linux程序的總結3

程序的控制 1.程序的建立 fork()函式 在一個程式碼段中建立一個新的子程序可以使用fork()函式。 1.fork()函式以父程序為模板創建出了一個子程序,但是父子程序程式碼共享,資料獨有一份。也就是分配新的記憶體塊和核心資料結構。然後父程序的部分資料拷貝到了子程序。

Linux程序的總結2

程的優先順序 由於每個程序的任務所要消耗的資源量不同。所以要對程序進行分級制度。 為什麼要有程序的優先順序? 計算機只有一個cpu,採用了分時機制,讓每個程式在cpu上執行很短的時間。這個時間非常短,人的感知無法仔細的觀察到。切換時間片的時候,有的程序需要緊急處理,有的程序可以放

Linux安裝微信

擴充套件:https://www.cnblogs.com/dunitian/p/9124806.html 安裝過程如下: 1.下載最新版本tar.gz壓縮包https://github.com/geeeeeeeeek/electronic-wechat/releases/download/V2.0/lin

linux卸載mysqlrpm

bubuko info 是否 用戶和用戶組 mysq 安裝 del 用戶及用戶組 .com linux下卸載mysql 查看是否安裝了mysql的組件 rpm –qa |grep –I mysql 卸載前關閉mysql服務 service mysql status se

linux解除安裝mysqlrpm

linux下解除安裝mysql 檢視是否安裝了mysql的元件 rpm –qa |grep –I mysql   解除安裝前關閉mysql服務 service mysql status service mysql stop 檢視mysql對應的資料夾資訊  

對於Linux的伺服器程式設計2

對於驚群問題,我們可以使用一個主執行緒來接受連線,並且把這個連線套接字傳遞到子程序裡面,讓子程序來處理這個連線。這種方法需要程序間通訊:通過Unix套接字來在程序之間傳遞套接字。【注意不能使用Unix套接字***直接***傳遞描述符到子程序,因為雖然父程序和子程序獲得的檔案描述符相同,但是子程序

對於Linux的伺服器程式設計1

在Linux下面,對於海量連線並且每個連線在大部分時間裡面都是不活躍的情況下,我們使用Epoll來解決C10K[C10M]問題。 1.如何使用Epoll:man Epoll。即為三個系統呼叫。 2.在伺服器擁有多個CPU的情況下,我們需要多執行緒或者多程序來幫助我們提高程式的效能,所以就需要

手寫一個Linux的debug工具

寫在前面 學習過Linux程式設計的同學都或多或少用過gdb來除錯自己的程式,但是並沒有很多的資源讓我們學習有關偵錯程式的東西。希望通過這篇文章,你可以瞭解基本的除錯原理,更重要的是可以寫出一個自己的簡易除錯工具。更有趣的是,你可以瞭解如何修改記憶體,來“愚弄

Linux的賬號管理3-chage/usermod/userdel

chage命令: 可以更好的展示和修改密碼的屬性,直接修改配置檔案也是可以的 -l:檢視一個賬戶和密碼有關的時間引數 -d:YYYY-MM-DD,修改最近一次更改密碼的時間 -E: YYYY-MM-DD,修改賬號的失效時間 -I:天數,設定密碼幾天後失效 -m:天數,設定密碼至少保留

Linux的賬戶管理1--passwd和shadow

Linux中的使用者分為兩大類 超級使用者:root(預設) 普通使用者:其餘都是普通使用者 超級使用者登入是“#”的表示,普通使用者登入是“$”的標誌 [[email protected] ~]# [[email protected] ~]$ 方括號中的文

linux的i節點node

對於Unix系列的作業系統,大多都有v節點。但是對於linux來說,只有通用的i節點,卻沒有v節點。 下面來探討一下,linux下的i節點。       linux中,檔案查詢不是通過檔名稱來查詢的。實際上是通過i節點來實現檔案的查詢定位的。我們可以形象的將i節點看做