基于Python實(shí)現(xiàn)主機(jī)遠(yuǎn)程控制
前言:
本文為 HITwh 網(wǎng)絡(luò)空間安全專業(yè)網(wǎng)絡(luò)空間安全設(shè)計(jì)與實(shí)踐 I 的選題之一,主要實(shí)現(xiàn)了遠(yuǎn)程監(jiān)控局域網(wǎng)內(nèi)的主機(jī)桌面與網(wǎng)絡(luò)情況、簡單鍵鼠控制、遠(yuǎn)程斷網(wǎng)(ARP 攻擊)、數(shù)據(jù)加密傳輸?shù)裙δ堋S捎诒疚氖怯?Word 直接復(fù)制到 Typora 中生成的,盡管經(jīng)過了簡單的修改,但仍不能保證所有格式都正確,且很多圖片模糊不清,暫時(shí)沒有辦法解決。如果有需要,請(qǐng)?jiān)谖恼履┪舱?qǐng)我喝杯奶茶后發(fā)郵件告知我,我將把原 Word 文檔以郵件形式發(fā)給您;或者您也可以直接加我的微信。
1.概要設(shè)計(jì)
本次設(shè)計(jì)為遠(yuǎn)程控制主機(jī),我選擇的遠(yuǎn)程主機(jī)為 windows 10 虛擬機(jī)(運(yùn)行在 VMWare Workstation Pro 16 中)。系統(tǒng)環(huán)境為 Windows 10,使用語言為 python,版本 3.9,編程軟件為 VS Code。
主要功能包括:圖形化界面,視頻監(jiān)控,鼠標(biāo)鍵盤遠(yuǎn)程控制,記錄監(jiān)控時(shí)長,監(jiān)控硬件資源使用,監(jiān)控網(wǎng)絡(luò)活動(dòng),中斷網(wǎng)絡(luò)訪問等。為了更好的性能,還需要使用多線程模型。
功能結(jié)構(gòu)圖如圖 1 所示:
圖形化界面由 pyqt5
實(shí)現(xiàn),程序運(yùn)行后,會(huì)啟動(dòng)主界面(圖形界面一),然后阻塞,等待用戶操作。在該界面上,用戶可以輸入目標(biāo)主機(jī) IP,然后開啟視頻監(jiān)控線程、硬件資源使用監(jiān)控線程和監(jiān)控時(shí)長記錄線程,其中前兩個(gè)線程都需要使用 socket 通信。視頻監(jiān)控線程需要不斷接收目的主機(jī)發(fā)來的數(shù)據(jù)包,將數(shù)據(jù)包的內(nèi)容轉(zhuǎn)換成相應(yīng)的圖片,然后顯示在主界面上;硬件資源使用監(jiān)控線程需要在另一個(gè) socket 上接收目標(biāo)主機(jī)發(fā)來的 CPU 使用率、內(nèi)存使用率以及總內(nèi)存等硬件資源信息,然后將其格式化后顯示在主界面;監(jiān)控時(shí)長記錄線程需要記錄當(dāng)前視頻監(jiān)控的時(shí)長,格式化后將其顯示在主界面。鍵鼠控制我放在了主線程,當(dāng)用戶在視頻界面點(diǎn)擊某個(gè)位置時(shí),將記錄點(diǎn)擊坐標(biāo),并根據(jù)縮放比例轉(zhuǎn)換成目標(biāo)主機(jī)桌面的坐標(biāo),然后將相應(yīng)的鍵鼠操作用整數(shù)表示,和坐標(biāo)一起發(fā)送給目標(biāo)主機(jī),目標(biāo)主機(jī)接收后將進(jìn)行相對(duì)應(yīng)的操作。同時(shí),表示鍵鼠操作的整數(shù)將被加密,加密方法為 RSA。視頻監(jiān)控隨時(shí)可以結(jié)束,也可以截取當(dāng)前的屏幕截圖并保存。
在視頻監(jiān)控的同時(shí),用戶可以選擇性地開啟網(wǎng)絡(luò)活動(dòng)監(jiān)控線程。如果用戶需要開啟,則需要先在設(shè)置界面(圖形界面二)進(jìn)行過濾設(shè)置,選擇需要捕獲的數(shù)據(jù)包,可以從網(wǎng)絡(luò)接口、協(xié)議類型、源主機(jī)、目的主機(jī)幾個(gè)方面進(jìn)行設(shè)置。開啟該線程后,本機(jī)將開始抓包,并將抓到的包進(jìn)行處理后顯示在主界面。抓包過程中,隨時(shí)可以暫?;蚪K止,終止后可以將抓到的數(shù)據(jù)包保存為 pacp 格式,以供后續(xù)使用 wireshark 詳細(xì)查看。用戶也可以選擇中斷目標(biāo)主機(jī)的網(wǎng)絡(luò)訪問,原理即為 ARP 攻擊,該選項(xiàng)將會(huì)開啟一個(gè)線程,持續(xù)向目標(biāo)主機(jī)發(fā)送 ARP 包。
當(dāng)因?yàn)橛脩羰褂貌划?dāng)而導(dǎo)致錯(cuò)誤時(shí),都會(huì)彈出錯(cuò)誤窗口(圖形界面三),該窗口將提示具體是哪個(gè)地方出錯(cuò)了。
2.詳細(xì)設(shè)計(jì)
Python 對(duì)于多線程的支持對(duì)用戶非常友好,使用 Threading
庫,可以非常方便的創(chuàng)建一個(gè)新線程并使其運(yùn)行,也可以通過 Event()函數(shù)來協(xié)調(diào)多線程之間的運(yùn)行與阻塞。圖形化界面也可以通過 pyqt5 非常方便的編寫。
視頻監(jiān)控的主要原理為目標(biāo)主機(jī)截取當(dāng)前桌面截圖并通過 socket 發(fā)送給本機(jī),本機(jī)接收后將圖片改變?yōu)樾枰母袷讲@示在主界面。但是有一個(gè)主要問題就是,每次目標(biāo)主機(jī)每次截取的圖片大小基本都在 500KB 以上,有些甚至達(dá)到了 1MB,如果每秒截取十張,并且全部發(fā)送,那么需要的網(wǎng)絡(luò)帶寬為 5M/s 到 10M/s,網(wǎng)絡(luò)負(fù)擔(dān)明顯過大。因此,可以采取差異化傳輸。同樣為每秒截取十張圖片,即每 100 毫秒截取一張,目標(biāo)主機(jī)與本機(jī)剛建立連接時(shí),截取的第一張圖片將完整發(fā)送,之后,目標(biāo)主機(jī)截取每一張圖片后都將與上一張比較,若沒有變化,則不發(fā)送,100 毫秒再截取下一張;如果有變化,則將兩張圖片做減法,找到有差異的部分,僅發(fā)送差異化的部分。比如,當(dāng)前截取的圖片與上一張圖片僅有一個(gè)光標(biāo)的差別,那么就會(huì)只發(fā)送該光標(biāo)。為了繼續(xù)優(yōu)化,將再次比較差異化部分與當(dāng)前截圖的大小,哪一個(gè)小就發(fā)送哪一個(gè)。為了方便本機(jī)確定接收到的圖片是完整圖片還是差異化圖片,將在數(shù)據(jù)包設(shè)置一個(gè)標(biāo)志位,1 表示完整圖片,0 表示差異化圖片。目標(biāo)主機(jī)差異化發(fā)送圖片的偽代碼如圖 2 所示,本機(jī)的圖片傳輸流程圖分別如圖 3 所示。
鍵鼠控制同樣通過 socket 實(shí)現(xiàn)。目標(biāo)主機(jī)的分辨率為 1920*1080,為了能夠在畫面中全部顯示目標(biāo)主機(jī)的監(jiān)控畫面,我將圖片縮小到了原來的 0.6 倍,然后在主界面顯示。顯示圖片的部件為重寫后的 QLabel,我在其中重寫了鼠標(biāo)事件和鍵盤事件,即附錄源程序中的 MyQLabel 類。當(dāng)用戶在 QLabel(即顯示的監(jiān)控畫面)上進(jìn)行鼠標(biāo)操作時(shí),重寫后的鼠標(biāo)事件將會(huì)立即獲得當(dāng)前坐標(biāo)、用戶的操作(鼠標(biāo)按下或鼠標(biāo)釋放),并得知操作的左鍵還是右鍵,然后調(diào)用發(fā)送函數(shù),將鼠標(biāo)按鍵、鼠標(biāo)操作以及坐標(biāo)(除以 0.6)一起打包發(fā)送給目標(biāo)主機(jī)。目標(biāo)主機(jī)接收到這些信息后,將會(huì)把鼠標(biāo)移動(dòng)到相應(yīng)的坐標(biāo),執(zhí)行相應(yīng)的操作。鍵盤操作和鼠標(biāo)操作類似,但由于使用的 keyboard 庫與 pyqt5 的鍵盤事件返回的鍵盤碼不太兼容,因此目前只能確保英文字母輸入正常,且不支持組合鍵。本機(jī)鍵鼠控制的流程圖如圖 4 所示,目標(biāo)主機(jī)端鍵鼠控制的流程圖以及偽代碼因?yàn)榉浅:唵危辉俳o出,可參考附錄源程序。
目標(biāo)主機(jī)硬件資源的監(jiān)控也是通過 socket 實(shí)現(xiàn)的。目標(biāo)主機(jī)每兩秒發(fā)送一次 CPU 使用率、內(nèi)存使用率和總內(nèi)存,本機(jī)循環(huán)接收,接收到后即進(jìn)行格式轉(zhuǎn)換與單位轉(zhuǎn)換,然后填充到主界面對(duì)應(yīng)的位置。本機(jī)對(duì)應(yīng)的流程圖如圖 5 所示,目標(biāo)主機(jī)發(fā)送硬件資源信息的流程圖非常簡單,不再給出。
監(jiān)控時(shí)長的記錄主要是通過 python
的 time 庫實(shí)現(xiàn)的。當(dāng)開始監(jiān)控一臺(tái)主機(jī)時(shí),就會(huì)獲取當(dāng)前時(shí)間,并開啟一個(gè)新的線程用來記錄時(shí)間,每秒更新一次。偽代碼如圖 6 所示。
截圖功能可以截取當(dāng)前目標(biāo)主機(jī)的桌面,這個(gè)十分容易實(shí)現(xiàn),因?yàn)樵诎褕D片顯示到主界面之前,一定需要用一個(gè)變量 img 來存儲(chǔ)它,只要在按下截圖按鍵時(shí),立即獲得當(dāng)前的 img,然后保存為 png 文件即可。
在監(jiān)控過程中,隨時(shí)可以結(jié)束視頻監(jiān)控,由于視頻監(jiān)控而開啟的各個(gè)線程也將會(huì)隨之阻塞或退出。這些線程都是通過一個(gè)定義為event_monitor
的線程事件來調(diào)度的。當(dāng) event_monitor 被設(shè)置時(shí)(event_monitor.set()函數(shù)調(diào)用),所有線程都將開啟,并正常運(yùn)行,各個(gè)線程通過 event_monitor.is_set()函數(shù)來檢測(cè)對(duì)應(yīng)的進(jìn)程事件是否被設(shè)置;當(dāng)用戶選擇結(jié)束線程時(shí),將會(huì)調(diào)用 event_monitor.clear()函數(shù),清除該事件的設(shè)置,并斷開 socket 連接,相應(yīng)的進(jìn)程也就會(huì)阻塞(如監(jiān)控時(shí)間記錄線程)或退出(圖片接收線程、硬件使用信息接收線程)。結(jié)束視頻監(jiān)控的流程圖如圖 7 所示。
至此,關(guān)于主機(jī)控制模塊的基本功能都已經(jīng)介紹完畢。下面給將開始介紹網(wǎng)絡(luò)活動(dòng)監(jiān)控模塊。
網(wǎng)絡(luò)活動(dòng)監(jiān)控模塊最主要的功能就是抓包,使用 python 的 scapy 庫中的 sniff 函數(shù)可以實(shí)現(xiàn)抓取特定網(wǎng)卡上的數(shù)據(jù)包。但是,sniff 函數(shù)抓取的數(shù)據(jù)包只能解析到 TCP/UDP 層,再往下就無法解析了,統(tǒng)一標(biāo)記為 RAW。這個(gè)可以通過端口號(hào)來解決,后面會(huì)進(jìn)行說明。在開始抓包之前,我們還希望能對(duì)抓到的包進(jìn)行簡單的過濾。為了滿足這一要求,用戶可以點(diǎn)擊設(shè)置按鍵,進(jìn)入到設(shè)置界面,進(jìn)行抓包選項(xiàng)設(shè)置:網(wǎng)絡(luò)接口,協(xié)議類型,主機(jī),源主機(jī)以及目的主機(jī)。因?yàn)槲沂窃谧约旱奶摂M機(jī)上進(jìn)行的,虛擬機(jī)使用的是 NAT 模式,因此網(wǎng)絡(luò)接口默認(rèn)為” VMware Network Adapter VMnet8”。協(xié)議類型可以從一個(gè)下拉框中選擇:Any, TCP, UDP, IP, HTTP, HTTPS, SMTP 等。主機(jī)則默認(rèn)為當(dāng)前正在進(jìn)行視頻監(jiān)控的主機(jī) IP,源主機(jī)和目的主機(jī)用戶可以指定。在設(shè)置這些選項(xiàng)的過程中,實(shí)際上就是構(gòu)造了一條 filter 語句,這個(gè)語句將作為參數(shù)傳入 sniff 函數(shù)。構(gòu)造 filter 語句的偽代碼如圖 8 所示。
過濾語句構(gòu)造好后,就可以開始抓包了,流程圖如圖 9 所示。首先設(shè)置以下按鍵,比如在抓包的時(shí)候?qū)⒈4骀I設(shè)置為不可用。然后調(diào)用 sniff 函數(shù)進(jìn)行抓包,每抓到一個(gè)包,就開始逐層解析。
首先是以太網(wǎng)幀,在這里協(xié)議類型可能有 IPv4, ARP, IPv6 等,使用 packet[Ether].type 可以獲得一個(gè) 2 字節(jié)的十六進(jìn)制數(shù),這個(gè)數(shù)字對(duì)應(yīng)了協(xié)議類型。比如,0x0800 表示 IPv4。可以使用一個(gè)字典類型的數(shù)據(jù)結(jié)構(gòu)來保存十六進(jìn)制數(shù)與對(duì)應(yīng)的協(xié)議類型。然后解析 IP 層數(shù)據(jù)報(bào),同樣也可以使用 packet[IP].proto 獲得一個(gè)整數(shù),然后這個(gè)整數(shù)對(duì)應(yīng)了某種協(xié)議類型,比如,4 對(duì)應(yīng)了 IP。這種對(duì)應(yīng)關(guān)系依然可以用字典來保存。要獲取源主機(jī) IP 和目的主機(jī) IP,可以使用 packet[IP].src 和 packet[IP].dst 分別獲得。接下來的 TCP/UDP 層報(bào)文段類似,也可以通過 packet[TCP/UDP].sport 和 packet[TCP/UDP].dport 來獲取端口號(hào)。然后根據(jù)端口號(hào)來確定更具體的協(xié)議類型,如 Http(tcp port 80), Https(tcp port 443), SMTP(tcp port 25), Telnet(tcp port 23), SNMP(udp port 161)等。這些協(xié)議類型和端口號(hào)的映射關(guān)系也要用字典保存。當(dāng)確定具體的協(xié)議類型、源地址、目的地址、端口、報(bào)文長度、報(bào)文內(nèi)容等信息后,就可以將其顯示在主界面了。
在抓包過程中,隨時(shí)可以暫停,此時(shí)將會(huì)把變量 flag_pause 設(shè)置為 Ture(初始為 False),這時(shí)抓包進(jìn)程仍在繼續(xù),但不會(huì)進(jìn)行數(shù)據(jù)包的解析與展示。再次點(diǎn)擊開始按鍵,如果 flag_pause 為 True,那么將把該變量設(shè)置為 True,抓到包后會(huì)繼續(xù)解析并展示。同時(shí),按下暫停鍵后,開始按鍵將被設(shè)置為可用,暫停鍵本身被設(shè)置為不可用。過程十分簡單,不再展示流程圖。
如果想要終止抓包進(jìn)程,那么可以按下終止按鍵,此時(shí)將進(jìn)行以下操作:調(diào)用函數(shù) event_stop_capture.set()
,即抓包進(jìn)程將會(huì)阻塞;設(shè)置相應(yīng)的按鍵是否可用,比如,這時(shí)候保存按鍵就可以使用了;清空數(shù)據(jù)包列表,因?yàn)樗凶サ降臄?shù)據(jù)包都保存在一個(gè)列表中,清空后,下次點(diǎn)擊開始按鍵就會(huì)重新開始抓包。過程很簡單,也不再展示流程圖或偽代碼。
不管是我們?cè)噲D攻擊目標(biāo)主機(jī),還是在目標(biāo)主機(jī)遭受攻擊時(shí)希望保護(hù)它,都可能需要強(qiáng)制中斷目標(biāo)主機(jī)的網(wǎng)絡(luò)訪問。該功能可以通過 ARP 攻擊來實(shí)現(xiàn)。流程圖如上頁圖 10 所示。首先需要知道目標(biāo)主機(jī)的 IP 和網(wǎng)關(guān) IP,然后使用 Scapy 庫的 getmacbyip()函數(shù)和 get_if_hwaddr()函數(shù)可以分別獲得目標(biāo)主機(jī)的 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=目標(biāo)主機(jī) MAC 地址, pdst=目標(biāo)主機(jī) IP)。該 ARP 包的源地址為網(wǎng)關(guān) IP 和網(wǎng)關(guān) MAC 地址,目的地址為目標(biāo)主機(jī)的 IP 和 MAC 地址。然后構(gòu)造以太網(wǎng)幀:Ether(src=網(wǎng)關(guān) MAC 地址, dst=目標(biāo)主機(jī) MAC 地址)。構(gòu)造完成后,每隔一秒向目標(biāo)主機(jī)發(fā)送一次,這樣目標(biāo)主機(jī)將無法正常進(jìn)行網(wǎng)絡(luò)訪問。同樣,該功能也需要開啟一個(gè)新線程,通過 event_cutoff 這個(gè)線程事件來協(xié)調(diào)。
當(dāng)用戶想要允許目標(biāo)主機(jī)的網(wǎng)絡(luò)訪問時(shí),只需要點(diǎn)擊恢復(fù)網(wǎng)絡(luò)按鍵,這樣 event_cutoff 這個(gè)事件將會(huì)被清空,相應(yīng)線程將會(huì)停止發(fā)送 ARP 數(shù)據(jù)包,目標(biāo)主機(jī)的網(wǎng)絡(luò)訪問也會(huì)隨之恢復(fù)正常。
到此為止,遠(yuǎn)程控制主機(jī)的兩個(gè)主要模塊已經(jīng)敘述完畢,其他的還有加密功能和錯(cuò)誤提示功能。
為了防止遠(yuǎn)程控制模塊的鼠標(biāo)鍵盤操作被他人竊取,我將鍵鼠操作進(jìn)行了加密。在本機(jī)的鍵鼠操作都是通過 socket 發(fā)往目標(biāo)主機(jī)的,發(fā)送的是四個(gè)數(shù)字:左鍵或右鍵或鍵盤某個(gè)按鍵對(duì)應(yīng)的整數(shù),按鍵按下或釋放對(duì)應(yīng)的整數(shù),橫坐標(biāo),縱坐標(biāo)。我將第一個(gè)整數(shù),即左鍵或右鍵或某個(gè)鍵盤按鍵對(duì)應(yīng)的整數(shù)進(jìn)行了加密,加密方式為 RSA。首先使用 Python 的 RSA 模塊生成密鑰,包括公鑰和私鑰,并保存在文件中。其中,公鑰放在本機(jī),私鑰需要放在目標(biāo)主機(jī)。然后,每次進(jìn)行鍵鼠操作,按鍵對(duì)應(yīng)的整數(shù)都會(huì)被 RSA 公鑰加密為一個(gè) 16bit 長的十六進(jìn)制數(shù),然后將該十六進(jìn)制數(shù)和其他三個(gè)數(shù)字一同發(fā)往目標(biāo)主機(jī)。目標(biāo)主機(jī)接收后,將前十六位提取出來,并使用私鑰解密,然后在它的屏幕上還原相應(yīng)操作。流程圖如圖 11 所示。
錯(cuò)誤提示功能主要是檢測(cè)用戶的使用是否規(guī)范。假如用戶沒有指定目標(biāo)主機(jī) IP 就開始進(jìn)行抓包、視頻監(jiān)控或 ARP 攻擊等行為,就會(huì)彈窗提示用戶需要設(shè)置 IP。
2.調(diào)試分析
在編程過程中,遇到的第一個(gè)問題是 Scapy 只能確認(rèn)到 TCP/UDP 這一層,無法確定具體是 Http 協(xié)議、Https 協(xié)議或 SMTP 協(xié)議等。我最初的想法是想辦法去解析更深一層,即 RAW 層的內(nèi)容,從中可以獲得某些字符串如’Http’,進(jìn)而確定具體的協(xié)議類型。但是查找了各種資料,依然沒有可行方案,最后突然意識(shí)到,可以通過端口號(hào)來判斷具體的協(xié)議類型。比如,Http 協(xié)議的數(shù)據(jù)包通過 TCP 80 端口,Https 協(xié)議的數(shù)據(jù)包通過 TCP 443 端口。而通過 Scapy 可以很輕松的獲得端口號(hào)等信息。于是,我使用一個(gè)字典來保存端口號(hào)(或其他整數(shù))和協(xié)議類型的映射關(guān)系,端口號(hào)(或其他整數(shù))作為鍵,協(xié)議類型作為值,當(dāng)抓到一個(gè)數(shù)據(jù)包后,通過端口號(hào)來找到字典中對(duì)應(yīng)的鍵值對(duì),進(jìn)而就可以確定協(xié)議類型。
在做視頻監(jiān)控模塊時(shí),我本來計(jì)算將傳送的每一張圖片加密,密鑰使用一張隨機(jī)生成的圖片,將密鑰圖片與要發(fā)送的每一張圖片的每一個(gè)像素進(jìn)行異或,然后發(fā)送加密后的圖片。本機(jī)接收到圖片后,再次與密鑰圖片進(jìn)行異或,得到的就是原圖片。但是,由于其中的格式轉(zhuǎn)換過于復(fù)雜,我做了接近三天仍沒有絲毫進(jìn)展,只好放棄,去做了鍵鼠操作的加密。
另外就是發(fā)送圖片的時(shí)候,在前文也敘述過,我最開始是采取整張圖片完全發(fā)送的,這樣對(duì)網(wǎng)絡(luò)負(fù)擔(dān)過大。我想過犧牲一些清晰度來減輕網(wǎng)絡(luò)負(fù)擔(dān),但是為了本機(jī)監(jiān)控方便,將畫面縮放到原來的 0.6 倍本身就已經(jīng)損失了很多清晰度,如果再壓縮,那么在本機(jī)就很難看清楚畫面了,監(jiān)控也就失去了意義。后來在參考另外一個(gè)項(xiàng)目時(shí)得到了靈感,即使用差異化傳輸。這樣,對(duì)網(wǎng)絡(luò)的負(fù)擔(dān)基本可以不需要考慮。
現(xiàn)在回顧整個(gè)設(shè)計(jì)過程,主要涉及到了 socket 編程、arp 攻擊原理、scapy 庫的使用、多線程模型、圖片處理(opencv 的使用)、RSA 加密以及基本的計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)等。在學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)時(shí)曾經(jīng)做過抓包實(shí)驗(yàn),但那是使用 wireshark 工具來進(jìn)行抓包,本次課設(shè)則是自己手寫了一個(gè)抓包工具,對(duì)抓包的原理有了更加深刻的理解。而圖片處理、opencv 庫和 Pillow 庫的使用則是之前沒有接觸過的,通過這次課設(shè),也對(duì)它們的基本使用方法有了一個(gè)大概的了解。Socket 編程是這學(xué)期剛學(xué)習(xí)的內(nèi)容,雖然 python 的 socket 操作與 C 語言相比簡單了很多,但作為復(fù)習(xí)來講還是有益處的,并且也算是增加了使用經(jīng)驗(yàn)。
3.測(cè)試結(jié)果
接下來我將展示遠(yuǎn)程控制主機(jī)課程設(shè)計(jì)最終實(shí)現(xiàn)的功能:界面展示,視頻監(jiān)控,遠(yuǎn)程控制,硬件資源使用信息監(jiān)控,網(wǎng)絡(luò)活動(dòng)監(jiān)控的開始、暫停與終止,保存截圖和數(shù)據(jù)包等。
首先是程序運(yùn)行后的主界面,如下圖所示。
到此這篇關(guān)于基于Python實(shí)現(xiàn)主機(jī)遠(yuǎn)程控制的文章就介紹到這了,更多相關(guān)Python實(shí)現(xiàn)主機(jī)遠(yuǎn)程控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何理解python接口自動(dòng)化之logging日志模塊
代碼需要經(jīng)歷開發(fā)、調(diào)試、審查、測(cè)試或者上線等不同階段,在“測(cè)試”時(shí),可能只想看警告和錯(cuò)誤信息,然而在“調(diào)試”時(shí),可能還想看到跟調(diào)試相關(guān)的信息。如果想打印出使用的模塊以及代碼運(yùn)行的時(shí)間,那么代碼很容易變得混亂。使用logging日志模塊,就能很容易地解決2021-06-06python des,aes,rsa加解密的實(shí)現(xiàn)
這篇文章主要介紹了python des,aes,rsa加解密的實(shí)現(xiàn),幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01

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

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

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