欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python實現(xiàn)主機遠程控制

 更新時間:2022年01月26日 17:05:54   作者:newlw???  
這篇文章主要介紹了基于Python實現(xiàn)主機遠程控制,本文為?HITwh?網(wǎng)絡(luò)空間安全專業(yè)網(wǎng)絡(luò)空間安全設(shè)計與實踐選題,主要實現(xiàn)了遠程監(jiān)控局域網(wǎng)內(nèi)的主機桌面與網(wǎng)絡(luò)情況、簡單鍵鼠控制、遠程斷網(wǎng)(ARP?攻擊)、數(shù)據(jù)加密傳輸?shù)裙δ?,下面來看看具體實現(xiàn)過程吧

前言:

本文為 HITwh 網(wǎng)絡(luò)空間安全專業(yè)網(wǎng)絡(luò)空間安全設(shè)計與實踐 I 的選題之一,主要實現(xiàn)了遠程監(jiān)控局域網(wǎng)內(nèi)的主機桌面與網(wǎng)絡(luò)情況、簡單鍵鼠控制、遠程斷網(wǎng)(ARP 攻擊)、數(shù)據(jù)加密傳輸?shù)裙δ?。由于本文是?Word 直接復(fù)制到 Typora 中生成的,盡管經(jīng)過了簡單的修改,但仍不能保證所有格式都正確,且很多圖片模糊不清,暫時沒有辦法解決。如果有需要,請在文章末尾請我喝杯奶茶后發(fā)郵件告知我,我將把原 Word 文檔以郵件形式發(fā)給您;或者您也可以直接加我的微信。

1.概要設(shè)計

本次設(shè)計為遠程控制主機,我選擇的遠程主機為 windows 10 虛擬機(運行在 VMWare Workstation Pro 16 中)。系統(tǒng)環(huán)境為 Windows 10,使用語言為 python,版本 3.9,編程軟件為 VS Code。

主要功能包括:圖形化界面,視頻監(jiān)控,鼠標鍵盤遠程控制,記錄監(jiān)控時長,監(jiān)控硬件資源使用,監(jiān)控網(wǎng)絡(luò)活動,中斷網(wǎng)絡(luò)訪問等。為了更好的性能,還需要使用多線程模型。

功能結(jié)構(gòu)圖如圖 1 所示:

圖形化界面由 pyqt5 實現(xiàn),程序運行后,會啟動主界面(圖形界面一),然后阻塞,等待用戶操作。在該界面上,用戶可以輸入目標主機 IP,然后開啟視頻監(jiān)控線程、硬件資源使用監(jiān)控線程和監(jiān)控時長記錄線程,其中前兩個線程都需要使用 socket 通信。視頻監(jiān)控線程需要不斷接收目的主機發(fā)來的數(shù)據(jù)包,將數(shù)據(jù)包的內(nèi)容轉(zhuǎn)換成相應(yīng)的圖片,然后顯示在主界面上;硬件資源使用監(jiān)控線程需要在另一個 socket 上接收目標主機發(fā)來的 CPU 使用率、內(nèi)存使用率以及總內(nèi)存等硬件資源信息,然后將其格式化后顯示在主界面;監(jiān)控時長記錄線程需要記錄當(dāng)前視頻監(jiān)控的時長,格式化后將其顯示在主界面。鍵鼠控制我放在了主線程,當(dāng)用戶在視頻界面點擊某個位置時,將記錄點擊坐標,并根據(jù)縮放比例轉(zhuǎn)換成目標主機桌面的坐標,然后將相應(yīng)的鍵鼠操作用整數(shù)表示,和坐標一起發(fā)送給目標主機,目標主機接收后將進行相對應(yīng)的操作。同時,表示鍵鼠操作的整數(shù)將被加密,加密方法為 RSA。視頻監(jiān)控隨時可以結(jié)束,也可以截取當(dāng)前的屏幕截圖并保存。

在視頻監(jiān)控的同時,用戶可以選擇性地開啟網(wǎng)絡(luò)活動監(jiān)控線程。如果用戶需要開啟,則需要先在設(shè)置界面(圖形界面二)進行過濾設(shè)置,選擇需要捕獲的數(shù)據(jù)包,可以從網(wǎng)絡(luò)接口、協(xié)議類型、源主機、目的主機幾個方面進行設(shè)置。開啟該線程后,本機將開始抓包,并將抓到的包進行處理后顯示在主界面。抓包過程中,隨時可以暫?;蚪K止,終止后可以將抓到的數(shù)據(jù)包保存為 pacp 格式,以供后續(xù)使用 wireshark 詳細查看。用戶也可以選擇中斷目標主機的網(wǎng)絡(luò)訪問,原理即為 ARP 攻擊,該選項將會開啟一個線程,持續(xù)向目標主機發(fā)送 ARP 包。

當(dāng)因為用戶使用不當(dāng)而導(dǎo)致錯誤時,都會彈出錯誤窗口(圖形界面三),該窗口將提示具體是哪個地方出錯了。

2.詳細設(shè)計

Python 對于多線程的支持對用戶非常友好,使用 Threading 庫,可以非常方便的創(chuàng)建一個新線程并使其運行,也可以通過 Event()函數(shù)來協(xié)調(diào)多線程之間的運行與阻塞。圖形化界面也可以通過 pyqt5 非常方便的編寫。

視頻監(jiān)控的主要原理為目標主機截取當(dāng)前桌面截圖并通過 socket 發(fā)送給本機,本機接收后將圖片改變?yōu)樾枰母袷讲@示在主界面。但是有一個主要問題就是,每次目標主機每次截取的圖片大小基本都在 500KB 以上,有些甚至達到了 1MB,如果每秒截取十張,并且全部發(fā)送,那么需要的網(wǎng)絡(luò)帶寬為 5M/s 到 10M/s,網(wǎng)絡(luò)負擔(dān)明顯過大。因此,可以采取差異化傳輸。同樣為每秒截取十張圖片,即每 100 毫秒截取一張,目標主機與本機剛建立連接時,截取的第一張圖片將完整發(fā)送,之后,目標主機截取每一張圖片后都將與上一張比較,若沒有變化,則不發(fā)送,100 毫秒再截取下一張;如果有變化,則將兩張圖片做減法,找到有差異的部分,僅發(fā)送差異化的部分。比如,當(dāng)前截取的圖片與上一張圖片僅有一個光標的差別,那么就會只發(fā)送該光標。為了繼續(xù)優(yōu)化,將再次比較差異化部分與當(dāng)前截圖的大小,哪一個小就發(fā)送哪一個。為了方便本機確定接收到的圖片是完整圖片還是差異化圖片,將在數(shù)據(jù)包設(shè)置一個標志位,1 表示完整圖片,0 表示差異化圖片。目標主機差異化發(fā)送圖片的偽代碼如圖 2 所示,本機的圖片傳輸流程圖分別如圖 3 所示。

鍵鼠控制同樣通過 socket 實現(xiàn)。目標主機的分辨率為 1920*1080,為了能夠在畫面中全部顯示目標主機的監(jiān)控畫面,我將圖片縮小到了原來的 0.6 倍,然后在主界面顯示。顯示圖片的部件為重寫后的 QLabel,我在其中重寫了鼠標事件和鍵盤事件,即附錄源程序中的 MyQLabel 類。當(dāng)用戶在 QLabel(即顯示的監(jiān)控畫面)上進行鼠標操作時,重寫后的鼠標事件將會立即獲得當(dāng)前坐標、用戶的操作(鼠標按下或鼠標釋放),并得知操作的左鍵還是右鍵,然后調(diào)用發(fā)送函數(shù),將鼠標按鍵、鼠標操作以及坐標(除以 0.6)一起打包發(fā)送給目標主機。目標主機接收到這些信息后,將會把鼠標移動到相應(yīng)的坐標,執(zhí)行相應(yīng)的操作。鍵盤操作和鼠標操作類似,但由于使用的 keyboard 庫與 pyqt5 的鍵盤事件返回的鍵盤碼不太兼容,因此目前只能確保英文字母輸入正常,且不支持組合鍵。本機鍵鼠控制的流程圖如圖 4 所示,目標主機端鍵鼠控制的流程圖以及偽代碼因為非常簡單,不再給出,可參考附錄源程序。

目標主機硬件資源的監(jiān)控也是通過 socket 實現(xiàn)的。目標主機每兩秒發(fā)送一次 CPU 使用率、內(nèi)存使用率和總內(nèi)存,本機循環(huán)接收,接收到后即進行格式轉(zhuǎn)換與單位轉(zhuǎn)換,然后填充到主界面對應(yīng)的位置。本機對應(yīng)的流程圖如圖 5 所示,目標主機發(fā)送硬件資源信息的流程圖非常簡單,不再給出。

監(jiān)控時長的記錄主要是通過 python 的 time 庫實現(xiàn)的。當(dāng)開始監(jiān)控一臺主機時,就會獲取當(dāng)前時間,并開啟一個新的線程用來記錄時間,每秒更新一次。偽代碼如圖 6 所示。

截圖功能可以截取當(dāng)前目標主機的桌面,這個十分容易實現(xiàn),因為在把圖片顯示到主界面之前,一定需要用一個變量 img 來存儲它,只要在按下截圖按鍵時,立即獲得當(dāng)前的 img,然后保存為 png 文件即可。

在監(jiān)控過程中,隨時可以結(jié)束視頻監(jiān)控,由于視頻監(jiān)控而開啟的各個線程也將會隨之阻塞或退出。這些線程都是通過一個定義為event_monitor 的線程事件來調(diào)度的。當(dāng) event_monitor 被設(shè)置時(event_monitor.set()函數(shù)調(diào)用),所有線程都將開啟,并正常運行,各個線程通過 event_monitor.is_set()函數(shù)來檢測對應(yīng)的進程事件是否被設(shè)置;當(dāng)用戶選擇結(jié)束線程時,將會調(diào)用 event_monitor.clear()函數(shù),清除該事件的設(shè)置,并斷開 socket 連接,相應(yīng)的進程也就會阻塞(如監(jiān)控時間記錄線程)或退出(圖片接收線程、硬件使用信息接收線程)。結(jié)束視頻監(jiān)控的流程圖如圖 7 所示。

至此,關(guān)于主機控制模塊的基本功能都已經(jīng)介紹完畢。下面給將開始介紹網(wǎng)絡(luò)活動監(jiān)控模塊。

網(wǎng)絡(luò)活動監(jiān)控模塊最主要的功能就是抓包,使用 python 的 scapy 庫中的 sniff 函數(shù)可以實現(xiàn)抓取特定網(wǎng)卡上的數(shù)據(jù)包。但是,sniff 函數(shù)抓取的數(shù)據(jù)包只能解析到 TCP/UDP 層,再往下就無法解析了,統(tǒng)一標記為 RAW。這個可以通過端口號來解決,后面會進行說明。在開始抓包之前,我們還希望能對抓到的包進行簡單的過濾。為了滿足這一要求,用戶可以點擊設(shè)置按鍵,進入到設(shè)置界面,進行抓包選項設(shè)置:網(wǎng)絡(luò)接口,協(xié)議類型,主機,源主機以及目的主機。因為我是在自己的虛擬機上進行的,虛擬機使用的是 NAT 模式,因此網(wǎng)絡(luò)接口默認為” VMware Network Adapter VMnet8”。協(xié)議類型可以從一個下拉框中選擇:Any, TCP, UDP, IP, HTTP, HTTPS, SMTP 等。主機則默認為當(dāng)前正在進行視頻監(jiān)控的主機 IP,源主機和目的主機用戶可以指定。在設(shè)置這些選項的過程中,實際上就是構(gòu)造了一條 filter 語句,這個語句將作為參數(shù)傳入 sniff 函數(shù)。構(gòu)造 filter 語句的偽代碼如圖 8 所示。

過濾語句構(gòu)造好后,就可以開始抓包了,流程圖如圖 9 所示。首先設(shè)置以下按鍵,比如在抓包的時候?qū)⒈4骀I設(shè)置為不可用。然后調(diào)用 sniff 函數(shù)進行抓包,每抓到一個包,就開始逐層解析。

首先是以太網(wǎng)幀,在這里協(xié)議類型可能有 IPv4, ARP, IPv6 等,使用 packet[Ether].type 可以獲得一個 2 字節(jié)的十六進制數(shù),這個數(shù)字對應(yīng)了協(xié)議類型。比如,0x0800 表示 IPv4。可以使用一個字典類型的數(shù)據(jù)結(jié)構(gòu)來保存十六進制數(shù)與對應(yīng)的協(xié)議類型。然后解析 IP 層數(shù)據(jù)報,同樣也可以使用 packet[IP].proto 獲得一個整數(shù),然后這個整數(shù)對應(yīng)了某種協(xié)議類型,比如,4 對應(yīng)了 IP。這種對應(yīng)關(guān)系依然可以用字典來保存。要獲取源主機 IP 和目的主機 IP,可以使用 packet[IP].src 和 packet[IP].dst 分別獲得。接下來的 TCP/UDP 層報文段類似,也可以通過 packet[TCP/UDP].sport 和 packet[TCP/UDP].dport 來獲取端口號。然后根據(jù)端口號來確定更具體的協(xié)議類型,如 Http(tcp port 80), Https(tcp port 443), SMTP(tcp port 25), Telnet(tcp port 23), SNMP(udp port 161)等。這些協(xié)議類型和端口號的映射關(guān)系也要用字典保存。當(dāng)確定具體的協(xié)議類型、源地址、目的地址、端口、報文長度、報文內(nèi)容等信息后,就可以將其顯示在主界面了。

在抓包過程中,隨時可以暫停,此時將會把變量 flag_pause 設(shè)置為 Ture(初始為 False),這時抓包進程仍在繼續(xù),但不會進行數(shù)據(jù)包的解析與展示。再次點擊開始按鍵,如果 flag_pause 為 True,那么將把該變量設(shè)置為 True,抓到包后會繼續(xù)解析并展示。同時,按下暫停鍵后,開始按鍵將被設(shè)置為可用,暫停鍵本身被設(shè)置為不可用。過程十分簡單,不再展示流程圖。

如果想要終止抓包進程,那么可以按下終止按鍵,此時將進行以下操作:調(diào)用函數(shù) event_stop_capture.set(),即抓包進程將會阻塞;設(shè)置相應(yīng)的按鍵是否可用,比如,這時候保存按鍵就可以使用了;清空數(shù)據(jù)包列表,因為所有抓到的數(shù)據(jù)包都保存在一個列表中,清空后,下次點擊開始按鍵就會重新開始抓包。過程很簡單,也不再展示流程圖或偽代碼。

不管是我們試圖攻擊目標主機,還是在目標主機遭受攻擊時希望保護它,都可能需要強制中斷目標主機的網(wǎng)絡(luò)訪問。該功能可以通過 ARP 攻擊來實現(xiàn)。流程圖如上頁圖 10 所示。首先需要知道目標主機的 IP 和網(wǎng)關(guān) IP,然后使用 Scapy 庫的 getmacbyip()函數(shù)和 get_if_hwaddr()函數(shù)可以分別獲得目標主機的 MAC 地址和網(wǎng)關(guān)的 MAC 地址,然后構(gòu)造 ARP 數(shù)據(jù)包:ARP(hwsrc=網(wǎng)關(guān) MAC 地址, psrc=網(wǎng)關(guān) IP, hwdst=目標主機 MAC 地址, pdst=目標主機 IP)。該 ARP 包的源地址為網(wǎng)關(guān) IP 和網(wǎng)關(guān) MAC 地址,目的地址為目標主機的 IP 和 MAC 地址。然后構(gòu)造以太網(wǎng)幀:Ether(src=網(wǎng)關(guān) MAC 地址, dst=目標主機 MAC 地址)。構(gòu)造完成后,每隔一秒向目標主機發(fā)送一次,這樣目標主機將無法正常進行網(wǎng)絡(luò)訪問。同樣,該功能也需要開啟一個新線程,通過 event_cutoff 這個線程事件來協(xié)調(diào)。

當(dāng)用戶想要允許目標主機的網(wǎng)絡(luò)訪問時,只需要點擊恢復(fù)網(wǎng)絡(luò)按鍵,這樣 event_cutoff 這個事件將會被清空,相應(yīng)線程將會停止發(fā)送 ARP 數(shù)據(jù)包,目標主機的網(wǎng)絡(luò)訪問也會隨之恢復(fù)正常。

到此為止,遠程控制主機的兩個主要模塊已經(jīng)敘述完畢,其他的還有加密功能和錯誤提示功能。

為了防止遠程控制模塊的鼠標鍵盤操作被他人竊取,我將鍵鼠操作進行了加密。在本機的鍵鼠操作都是通過 socket 發(fā)往目標主機的,發(fā)送的是四個數(shù)字:左鍵或右鍵或鍵盤某個按鍵對應(yīng)的整數(shù),按鍵按下或釋放對應(yīng)的整數(shù),橫坐標,縱坐標。我將第一個整數(shù),即左鍵或右鍵或某個鍵盤按鍵對應(yīng)的整數(shù)進行了加密,加密方式為 RSA。首先使用 Python 的 RSA 模塊生成密鑰,包括公鑰和私鑰,并保存在文件中。其中,公鑰放在本機,私鑰需要放在目標主機。然后,每次進行鍵鼠操作,按鍵對應(yīng)的整數(shù)都會被 RSA 公鑰加密為一個 16bit 長的十六進制數(shù),然后將該十六進制數(shù)和其他三個數(shù)字一同發(fā)往目標主機。目標主機接收后,將前十六位提取出來,并使用私鑰解密,然后在它的屏幕上還原相應(yīng)操作。流程圖如圖 11 所示。

錯誤提示功能主要是檢測用戶的使用是否規(guī)范。假如用戶沒有指定目標主機 IP 就開始進行抓包、視頻監(jiān)控或 ARP 攻擊等行為,就會彈窗提示用戶需要設(shè)置 IP。

2.調(diào)試分析

在編程過程中,遇到的第一個問題是 Scapy 只能確認到 TCP/UDP 這一層,無法確定具體是 Http 協(xié)議、Https 協(xié)議或 SMTP 協(xié)議等。我最初的想法是想辦法去解析更深一層,即 RAW 層的內(nèi)容,從中可以獲得某些字符串如’Http’,進而確定具體的協(xié)議類型。但是查找了各種資料,依然沒有可行方案,最后突然意識到,可以通過端口號來判斷具體的協(xié)議類型。比如,Http 協(xié)議的數(shù)據(jù)包通過 TCP 80 端口,Https 協(xié)議的數(shù)據(jù)包通過 TCP 443 端口。而通過 Scapy 可以很輕松的獲得端口號等信息。于是,我使用一個字典來保存端口號(或其他整數(shù))和協(xié)議類型的映射關(guān)系,端口號(或其他整數(shù))作為鍵,協(xié)議類型作為值,當(dāng)抓到一個數(shù)據(jù)包后,通過端口號來找到字典中對應(yīng)的鍵值對,進而就可以確定協(xié)議類型。

在做視頻監(jiān)控模塊時,我本來計算將傳送的每一張圖片加密,密鑰使用一張隨機生成的圖片,將密鑰圖片與要發(fā)送的每一張圖片的每一個像素進行異或,然后發(fā)送加密后的圖片。本機接收到圖片后,再次與密鑰圖片進行異或,得到的就是原圖片。但是,由于其中的格式轉(zhuǎn)換過于復(fù)雜,我做了接近三天仍沒有絲毫進展,只好放棄,去做了鍵鼠操作的加密。

另外就是發(fā)送圖片的時候,在前文也敘述過,我最開始是采取整張圖片完全發(fā)送的,這樣對網(wǎng)絡(luò)負擔(dān)過大。我想過犧牲一些清晰度來減輕網(wǎng)絡(luò)負擔(dān),但是為了本機監(jiān)控方便,將畫面縮放到原來的 0.6 倍本身就已經(jīng)損失了很多清晰度,如果再壓縮,那么在本機就很難看清楚畫面了,監(jiān)控也就失去了意義。后來在參考另外一個項目時得到了靈感,即使用差異化傳輸。這樣,對網(wǎng)絡(luò)的負擔(dān)基本可以不需要考慮。

現(xiàn)在回顧整個設(shè)計過程,主要涉及到了 socket 編程、arp 攻擊原理、scapy 庫的使用、多線程模型、圖片處理(opencv 的使用)、RSA 加密以及基本的計算機網(wǎng)絡(luò)知識等。在學(xué)習(xí)計算機網(wǎng)絡(luò)時曾經(jīng)做過抓包實驗,但那是使用 wireshark 工具來進行抓包,本次課設(shè)則是自己手寫了一個抓包工具,對抓包的原理有了更加深刻的理解。而圖片處理、opencv 庫和 Pillow 庫的使用則是之前沒有接觸過的,通過這次課設(shè),也對它們的基本使用方法有了一個大概的了解。Socket 編程是這學(xué)期剛學(xué)習(xí)的內(nèi)容,雖然 python 的 socket 操作與 C 語言相比簡單了很多,但作為復(fù)習(xí)來講還是有益處的,并且也算是增加了使用經(jīng)驗。

3.測試結(jié)果

接下來我將展示遠程控制主機課程設(shè)計最終實現(xiàn)的功能:界面展示,視頻監(jiān)控,遠程控制,硬件資源使用信息監(jiān)控,網(wǎng)絡(luò)活動監(jiān)控的開始、暫停與終止,保存截圖和數(shù)據(jù)包等。

首先是程序運行后的主界面,如下圖所示。

 到此這篇關(guān)于基于Python實現(xiàn)主機遠程控制的文章就介紹到這了,更多相關(guān)Python實現(xiàn)主機遠程控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python?tuple方法和string常量介紹

    Python?tuple方法和string常量介紹

    這篇文章主要介紹了Python?tuple方法和string常量,文章基于python的相關(guān)資料展開詳細內(nèi)容,對初學(xué)python的通知有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • Python并行庫joblib之delayed函數(shù)與Parallel函數(shù)詳解

    Python并行庫joblib之delayed函數(shù)與Parallel函數(shù)詳解

    這篇文章主要介紹了Python并行庫joblib之delayed函數(shù)與Parallel函數(shù)詳解,Joblib就是一個可以簡單地將Python代碼轉(zhuǎn)換為并行計算模式的軟件包,它可非常簡單并行我們的程序,從而提高計算速度,需要的朋友可以參考下
    2023-08-08
  • 利用Pygame制作躲避僵尸游戲

    利用Pygame制作躲避僵尸游戲

    本文參考了神廟逃亡,利用Pygame實現(xiàn)一個人躲避僵尸的小游戲,主要的是精靈、精靈組之間相撞、相交的處理,感興趣的可以了解一下
    2022-05-05
  • python百行代碼實現(xiàn)漢服圈圖片爬取

    python百行代碼實現(xiàn)漢服圈圖片爬取

    這篇文章主要為大家介紹了使用python百行代碼來實現(xiàn)漢服圈的圖片爬取,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • Python的Flask框架中使用Flask-SQLAlchemy管理數(shù)據(jù)庫的教程

    Python的Flask框架中使用Flask-SQLAlchemy管理數(shù)據(jù)庫的教程

    在Python中我們可以使用SQLAlchemy框架進行數(shù)據(jù)庫操作,那么對應(yīng)的在Flask框架中我們可以使用SQLAlchemy,下面我們就來看一下Python的Flask框架中使用Flask-SQLAlchemy管理數(shù)據(jù)庫的教程
    2016-06-06
  • 最新評論