亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

攔截原始套接字輸入輸出的方法和系統(tǒng)與流程

文檔序號(hào):11960027閱讀:913來源:國(guó)知局
攔截原始套接字輸入輸出的方法和系統(tǒng)與流程

本發(fā)明涉及數(shù)據(jù)攔截技術(shù)領(lǐng)域,特別是涉及一種攔截原始套接字輸入輸出的方法和系統(tǒng)。



背景技術(shù):

原始套接字具有廣泛的用途,特別是用于自定義協(xié)議(標(biāo)準(zhǔn)協(xié)議TCP、UDP和ICMP等外)的數(shù)據(jù)收發(fā)。在Linux下攔截套接字IO的一般方法是攔截對(duì)應(yīng)的套接字系統(tǒng)調(diào)用,對(duì)于發(fā)送為sendmsg和sendto,對(duì)于接收為recvmsg和recvfrom。這種方法雖然也能攔截原始套接字IO,但要先判斷套接字的類型,如果為SOCK_RAW(原始套接字類型),那么進(jìn)行攔截處理,這樣一來由于每次IO都要判斷套接字類型,性能就比較低了。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明所要解決的技術(shù)問題是提供一種攔截原始套接字輸入輸出的方法,直接攔截所有進(jìn)程的原始套接字輸入輸出。

本發(fā)明所要解決的另一技術(shù)問題是提供一種攔截原始套接字輸入輸出的系統(tǒng),直接攔截所有進(jìn)程的原始套接字輸入輸出。

為了解決上述的技術(shù)問題,本發(fā)明的技術(shù)方案如下:

一種攔截原始套接字輸入輸出的方法,用于Linux內(nèi)核,包括:查找所述Linux內(nèi)核中內(nèi)置的原始套接字接口;清除CPU的控制寄存器的寫保護(hù)位;將所述Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)保存到所述Linux內(nèi)核中新分配的原始套接字接口中;將第二接收消息函數(shù)和第二發(fā)送消息函數(shù)分別替換所述Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù);還原所述CPU的控制寄存器的寫保護(hù)位。

進(jìn)一步,所述查找Linux內(nèi)核中內(nèi)置的原始套接字接口的過程包括:初始化套接字接口,所述套接字接口為原始套接字類型;注冊(cè)所述套接字接口,所述套接字接口位于以SOCK_RAW為索引的雙向循環(huán)鏈表的鏈表頭的后面;獲取所述套接字接口的后一個(gè)套接字接口,該后一個(gè)套接字接口為所述Linux內(nèi)核中內(nèi)置的原始套接字接口;注銷所述套接字接口。

進(jìn)一步,在所述將所述Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)保存到所述Linux內(nèi)核中新分配的原始套接字接口中的過程之前,還包括:在所述Linux內(nèi)核中新分配的原始套接字接口中分配子單元。

進(jìn)一步,所述將所述Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)保存到所述Linux內(nèi)核中新分配的原始套接字接口中的過程包括:將所述第一接收消息函數(shù)和所述第一發(fā)送消息函數(shù)保存到所述子單元中。

進(jìn)一步,在所述還原所述CPU的控制寄存器的寫保護(hù)位的過程之后,還包括:清除所述CPU的控制寄存器的寫保護(hù)位;將所述子單元中的所述第一接收消息函數(shù)和所述第一發(fā)送消息函數(shù)分別替換所述Linux內(nèi)核中內(nèi)置的原始套接字接口中的所述第二接收消息函數(shù)和所述第二發(fā)送消息函數(shù);還原所述CPU的控制寄存器的寫保護(hù)位;釋放所述子單元。

以及,一種攔截原始套接字輸入輸出的系統(tǒng),用于Linux內(nèi)核,包括:查找模塊,用于查找所述Linux內(nèi)核中內(nèi)置的原始套接字接口;寫保護(hù)位清除模塊,用于清除CPU的控制寄存器的寫保護(hù)位;存儲(chǔ)模塊,用于將所述Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)保存到所述Linux內(nèi)核中新分配的原始套接字接口中;第一替換模塊,用于將第二接收消息函數(shù)和第二發(fā)送消息函數(shù)分別替換所述Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù);寫保護(hù)位還原模塊,用于還原所述CPU的控制寄存器的寫保護(hù)位。

進(jìn)一步,所述查找模塊包括:初始化子模塊,用于初始化套接字接口,所述套接字接口為原始套接字類型;注冊(cè)子模塊,用于注冊(cè)所述套接字接口,所述套接字接口位于以SOCK_RAW為索引的雙向循環(huán)鏈表的鏈表頭的后面;獲取子模塊,用于獲取所述套接字接口的后一個(gè)套接字接口,該后一個(gè)套接字接口為所述Linux內(nèi)核中內(nèi)置的原始套接字接口;注銷子模塊,用于注銷所述套接字接口。

進(jìn)一步,還包括:分配模塊,在所述將所述Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)保存到所述Linux內(nèi)核中新分配的原始套接字接口中的過程之前,所述分配模塊用于在所述Linux內(nèi)核中新分配的原始套接字接口中分配子單元。

進(jìn)一步:所述存儲(chǔ)模塊用于將所述第一接收消息函數(shù)和所述第一發(fā)送消息函數(shù)保存到所述子單元中。

進(jìn)一步,還包括:第二替換模塊,在清除所述CPU的控制寄存器的寫保護(hù)位的過程之后,所述第二替換模塊用于將所述子單元中的所述第一接收消息函數(shù)和所述第一發(fā)送消息函數(shù)分別替換所述Linux內(nèi)核中內(nèi)置的原始套接字接口中的所述第二接收消息函數(shù)和所述第二發(fā)送消息函數(shù);釋放模塊,在還原所述CPU的控制寄存器的寫保護(hù)位的過程之后,所述釋放模塊用于釋放所述子單元。

與現(xiàn)有技術(shù)相比,本發(fā)明包括以下優(yōu)點(diǎn):

1、本發(fā)明實(shí)施例的攔截原始套接字輸入輸出的方法,運(yùn)行在內(nèi)核態(tài),直接攔截所有進(jìn)程的原始套接字輸入輸出(IO),提高了攔截性能。

2、本發(fā)明實(shí)施例的攔截原始套接字輸入輸出的系統(tǒng),運(yùn)行在內(nèi)核態(tài),直接攔截所有進(jìn)程的原始套接字輸入輸出(IO),提高了攔截性能。

附圖說明

圖1是本發(fā)明實(shí)施例的攔截原始套接字輸入輸出的方法的流程圖;

圖2是本發(fā)明實(shí)施例的查找Linux內(nèi)核中內(nèi)置的原始套接字接口的過程的流程圖;

圖3是本發(fā)明實(shí)施例的注冊(cè)套接字接口之前的雙向循環(huán)鏈表的示意圖;

圖4是本發(fā)明實(shí)施例的注冊(cè)套接字接口之后的雙向循環(huán)鏈表的示意圖;

圖5是本發(fā)明實(shí)施例的攔截原始套接字輸入輸出的方法在還原CPU的控制寄存器的寫保護(hù)位的過程之后的流程圖;

圖6是本發(fā)明實(shí)施例的攔截原始套接字輸入輸出的系統(tǒng)的結(jié)構(gòu)示意圖;

圖7是本發(fā)明又一個(gè)實(shí)施例的攔截原始套接字輸入輸出的系統(tǒng)的結(jié)構(gòu)示意圖。

具體實(shí)施方式

為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說明。

本發(fā)明實(shí)施例公開了一種攔截原始套接字輸入輸出的方法。該方法用于Linux內(nèi)核。由于該方法實(shí)現(xiàn)在Linux內(nèi)核中,為了防止其它內(nèi)核模塊可能也注冊(cè)了原始套接字接口,因此需要在操作系統(tǒng)啟動(dòng)時(shí)優(yōu)先加載該Linux內(nèi)核模塊。如圖1所示,為本發(fā)明實(shí)施例的攔截原始套接字輸入輸出的方法的流程圖。該方法具體包括如下的步驟:

步驟S101:查找Linux內(nèi)核中內(nèi)置的原始套接字接口。

在Linux內(nèi)核中,struct proto_ops變量的結(jié)構(gòu)提供了協(xié)議無關(guān)的套接字層到協(xié)議相關(guān)的傳輸層的轉(zhuǎn)接,例如,IPv4協(xié)議族中內(nèi)置的inet_sockraw_ops。因此,該Linux內(nèi)核中內(nèi)置的原始套接字接口可以為inet_sockraw_ops。

步驟S102:清除CPU的控制寄存器的寫保護(hù)位。

清除CPU的控制寄存器的寫保護(hù)位后,可寫入數(shù)據(jù)。

步驟S103:將Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)保存到Linux內(nèi)核中新分配的原始套接字接口中。

其中,在Linux中,接收消息函數(shù)一般用recvmsg表示,發(fā)送消息函數(shù)一般用sendmsg表示。應(yīng)當(dāng)理解的是,本發(fā)明中的“第一”、“第二”僅用于區(qū)分,沒有實(shí)際含義。優(yōu)選的,該Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)可置于Linux內(nèi)核中內(nèi)置的原始套接字接口分配的存儲(chǔ)單元中。

步驟S104:將第二接收消息函數(shù)和第二發(fā)送消息函數(shù)分別替換Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)。

優(yōu)選的,替換Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)后的第二接收消息函數(shù)和第二發(fā)送消息函數(shù)可置于Linux內(nèi)核中內(nèi)置的原始套接字接口分配的存儲(chǔ)單元中。

步驟S105:還原CPU的控制寄存器的寫保護(hù)位。

還原CPU的控制寄存器的寫保護(hù)位后,不可寫入數(shù)據(jù)。

通過上述的步驟S102~步驟S105實(shí)現(xiàn)掛鉤IO的過程。

本發(fā)明實(shí)施例的攔截原始套接字輸入輸出的方法,運(yùn)行在內(nèi)核態(tài),直接攔截所有進(jìn)程的原始套接字輸入輸出(IO),提高了攔截性能。本發(fā)明實(shí)施例的方法可支持IPv4和IPv6。

如圖2所示,為本發(fā)明實(shí)施例的查找Linux內(nèi)核中內(nèi)置的原始套接字接口的過程的流程圖。由于內(nèi)置的原始套接字接口(inet_sockraw_ops)為L(zhǎng)inux內(nèi)核未導(dǎo)出的內(nèi)部符號(hào),因此需要通過特別的方法找到它,該特別的方法基于如下的原理:

(1)所有的原始套接字類型的接口均存放在以原始套接字類型(SOCK_RAW)為索引的雙向循環(huán)鏈表中,而Linux內(nèi)核中內(nèi)置的原始套接字接口inet_sockraw_ops就在該鏈表的末尾。

(2)Linux內(nèi)核提供了調(diào)用接口API:注冊(cè)套接字接口(inet_register_protosw)。對(duì)于原始套接字類型的接口,該API將輸入的套接字接口插入到該鏈表頭的后面。

因此,基于上述的原理,查找Linux內(nèi)核中內(nèi)置的原始套接字接口的具體過程如下:

步驟S201:初始化套接字接口。

其中,該套接字接口為原始套接字類型(SOCK_RAW)。

步驟S202:注冊(cè)套接字接口。

具體的,可通過調(diào)用inet_register_protosw函數(shù)注冊(cè)該套接字接口。如圖3和4所示,分別為本發(fā)明實(shí)施例的注冊(cè)套接字接口之前的雙向循環(huán)鏈表的示意圖及注冊(cè)套接字接口之后的雙向循環(huán)鏈表的示意圖。從圖中可以看出,注冊(cè)套接字接口之后,該套接字接口位于以SOCK_RAW為索引的雙向循環(huán)鏈表的鏈表頭的后面。

步驟S203:獲取該套接字接口的后一個(gè)套接字接口。

其中,該后一個(gè)套接字接口為L(zhǎng)inux內(nèi)核中內(nèi)置的原始套接字接口,如圖4所示。

步驟S204:注銷套接字接口。

具體的,可通過調(diào)用inet_unregister_protosw函數(shù)注銷該套接字接口。

通過上述的過程,可查找到Linux內(nèi)核中內(nèi)置的原始套接字接口。

優(yōu)選的,在步驟S103之前,還包括在Linux內(nèi)核中新分配的原始套接字接口中分配子單元的步驟。

該Linux內(nèi)核中新分配的原始套接字接口中的子單元具有存儲(chǔ)的功能。具體的,該Linux內(nèi)核中新分配的原始套接字接口中的子單元可以是協(xié)議操作對(duì)象old_ops。

在分配了該子單元后,本發(fā)明的方法可將所述第一接收消息函數(shù)和第一發(fā)送消息函數(shù)保存到該子單元中。

在本發(fā)明一優(yōu)選的實(shí)施例中,在步驟S105之后,還包括卸鉤IO的過程。如圖5所示,為本發(fā)明實(shí)施例的攔截原始套接字輸入輸出的方法在還原CPU的控制寄存器的寫保護(hù)位的過程之后的流程圖。該過程具體如下:

步驟S501:清除CPU的控制寄存器的寫保護(hù)位。

清除CPU的控制寄存器的寫保護(hù)位后,可寫入數(shù)據(jù)。

步驟S502:將子單元中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)分別替換Linux內(nèi)核中內(nèi)置的原始套接字接口中的第二接收消息函數(shù)和第二發(fā)送消息函數(shù)。

優(yōu)選的,替換Linux內(nèi)核中內(nèi)置的原始套接字接口中的第二接收消息函數(shù)和第二發(fā)送消息函數(shù)后的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)可置于Linux內(nèi)核內(nèi)置的原始套接字接口分配的存儲(chǔ)單元中。

例如,該子單元是協(xié)議操作對(duì)象old_ops,則將協(xié)議操作對(duì)象old_ops中保存的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)分別替換Linux內(nèi)核中內(nèi)置的原始套接字接口分配的存儲(chǔ)單元中的第二接收消息函數(shù)和第二發(fā)送消息函數(shù)。

步驟S503:還原CPU的控制寄存器的寫保護(hù)位。

還原CPU的控制寄存器的寫保護(hù)位后,不可寫入數(shù)據(jù)。

步驟S504:釋放子單元。

例如,該子單元是協(xié)議操作對(duì)象old_ops,則釋放該協(xié)議操作對(duì)象old_ops。

釋放子單元后,不再占用Linux內(nèi)核中的內(nèi)存空間。

通過上述的過程,使得Linux內(nèi)核中內(nèi)置的原始套接字接口中的接收消息函數(shù)和發(fā)送消息函數(shù)恢復(fù)為原來的接收消息函數(shù)和發(fā)送消息函數(shù),保持了原程序的健壯性。

綜上所述,本發(fā)明實(shí)施例的方法由于可直接攔截所有進(jìn)程的原始套接字輸入輸出(IO),因此可用于防火墻或主機(jī)防護(hù)系統(tǒng)中,丟棄接收和發(fā)送的攻擊或病毒數(shù)據(jù)包。

本發(fā)明實(shí)施例還公開了一種攔截原始套接字輸入輸出的系統(tǒng)。該系統(tǒng)用于Linux內(nèi)核。如圖6所示,為本發(fā)明實(shí)施例的攔截原始套接字輸入輸出的系統(tǒng)的結(jié)構(gòu)示意圖。該系統(tǒng)具體包括如下的結(jié)構(gòu)。

查找模塊601:用于查找Linux內(nèi)核中內(nèi)置的原始套接字接口。

在Linux內(nèi)核中,struct proto_ops變量的結(jié)構(gòu)提供了協(xié)議無關(guān)的套接字層到協(xié)議相關(guān)的傳輸層的轉(zhuǎn)接,例如,IPv4協(xié)議族中內(nèi)置的inet_sockraw_ops。因此,該Linux內(nèi)核中內(nèi)置的原始套接字接口可以為inet_sockraw_ops。

寫保護(hù)位清除模塊602:用于清除CPU的控制寄存器的寫保護(hù)位。

清除CPU的控制寄存器的寫保護(hù)位后,可寫入數(shù)據(jù)。

存儲(chǔ)模塊603:用于將Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)保存到Linux內(nèi)核中新分配的原始套接字接口中。

其中,在Linux中,接收消息函數(shù)一般用recvmsg表示,發(fā)送消息函數(shù)一般用sendmsg表示。優(yōu)選的,該Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)可置于Linux內(nèi)核中內(nèi)置的原始套接字接口分配的存儲(chǔ)單元中。

第一替換模塊604:用于將第二接收消息函數(shù)和第二發(fā)送消息函數(shù)分別替換Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)。

優(yōu)選的,替換Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)后的第二接收消息函數(shù)和第二發(fā)送消息函數(shù)可置于Linux內(nèi)核分配中內(nèi)置的原始套接字接口的存儲(chǔ)單元中。

寫保護(hù)位還原模塊605:用于還原CPU的控制寄存器的寫保護(hù)位。

還原CPU的控制寄存器的寫保護(hù)位后,不可寫入數(shù)據(jù)。

通過寫保護(hù)位清除模塊602、存儲(chǔ)模塊603、第一替換模塊604、寫保護(hù)位還原模塊605可實(shí)現(xiàn)掛鉤IO的過程。

本發(fā)明實(shí)施例的攔截原始套接字輸入輸出的系統(tǒng),可直接攔截所有進(jìn)程的原始套接字輸入輸出(IO),提高了攔截性能。本發(fā)明實(shí)施例的系統(tǒng)可支持IPv4和IPv6。

如圖7所示,為本發(fā)明又一個(gè)實(shí)施例的攔截原始套接字輸入輸出的系統(tǒng)的結(jié)構(gòu)示意圖。本發(fā)明又一個(gè)實(shí)施例中,該系統(tǒng)的查找模塊具體包括如下的結(jié)構(gòu):

初始化子模塊6011:用于初始化套接字接口。

其中,該套接字接口為原始套接字類型(SOCK_RAW)。

注冊(cè)子模塊6012:用于注冊(cè)套接字接口。

具體的,注冊(cè)子模塊6012可通過調(diào)用inet_register_protosw函數(shù)注冊(cè)該套接字接口。

獲取子模塊6013:用于獲取該套接字接口的后一個(gè)套接字接口。

其中,該后一個(gè)套接字接口為L(zhǎng)inux內(nèi)核中內(nèi)置的原始套接字接口。

注銷子模塊6014:用于注銷套接字接口。

具體的,注銷子模塊6014可通過調(diào)用inet_unregister_protosw函數(shù)注銷該套接字接口。

通過上述的模塊設(shè)計(jì),使得該系統(tǒng)可查找到Linux內(nèi)核中內(nèi)置的原始套接字接口。

優(yōu)選的,該系統(tǒng)還包括:分配模塊606。

在存儲(chǔ)模塊603將Linux內(nèi)核中內(nèi)置的原始套接字接口中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)保存到Linux內(nèi)核中新分配的原始套接字接口中的過程之前,分配模塊606用于在Linux內(nèi)核中新分配的原始套接字接口中分配子單元。

該Linux內(nèi)核中新分配的原始套接字接口中的子單元具有存儲(chǔ)的功能。具體的,該Linux內(nèi)核中新分配的原始套接字接口中的子單元可以是協(xié)議操作對(duì)象old_ops。

當(dāng)分配模塊606分配了該子單元后,存儲(chǔ)模塊603可用于將第一接收消息函數(shù)和第一發(fā)送消息函數(shù)保存到該子單元中。

優(yōu)選的,該系統(tǒng)還包括:第二替換模塊607和釋放模塊608,用于實(shí)現(xiàn)卸鉤IO的過程。

卸鉤IO的過程中,在寫保護(hù)位清除模塊602清除CPU的控制寄存器的寫保護(hù)位的過程之后,第二替換模塊607,用于將子單元中的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)分別替換Linux內(nèi)核中內(nèi)置的原始套接字接口中的第二接收消息函數(shù)和第二發(fā)送消息函數(shù)。優(yōu)選的,替換Linux內(nèi)核中內(nèi)置的原始套接字接口中的第二接收消息函數(shù)和第二發(fā)送消息函數(shù)后的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)可置于Linux內(nèi)核內(nèi)置的原始套接字接口分配的存儲(chǔ)單元中。

例如,該子單元是協(xié)議操作對(duì)象old_ops,則第二替換模塊607將協(xié)議操作對(duì)象old_ops中保存的第一接收消息函數(shù)和第一發(fā)送消息函數(shù)分別替換Linux內(nèi)核中內(nèi)置的原始套接字接口分配的存儲(chǔ)單元中的第二接收消息函數(shù)和第二發(fā)送消息函數(shù)。

在寫保護(hù)位還原模塊605還原CPU的控制寄存器的寫保護(hù)位的過程之后,釋放模塊608用于釋放該子單元。

例如,該子單元是協(xié)議操作對(duì)象old_ops,則釋放模塊608釋放該協(xié)議操作對(duì)象old_ops。

釋放子單元后,不再占用Linux內(nèi)核中的內(nèi)存空間。

通過設(shè)置上述的模塊,該系統(tǒng)可使Linux內(nèi)核中內(nèi)置的原始套接字接口中的接收消息函數(shù)和發(fā)送消息函數(shù)恢復(fù)為原來的接收消息函數(shù)和發(fā)送消息函數(shù),保持了原程序的健壯性。

以上對(duì)本發(fā)明所提供的技術(shù)方案,進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1