python 通過郵件控制實現遠端控制電腦操作
阿新 • • 發佈:2020-03-18
0x00 思路
之前在部落格上看到了使用python通過微信的介面,與微信互動的方式來控制電腦的攝像頭、開關機等。但是這種方式需要首先在python上登入自己的微信才可以,同時微信端也會有已經在網頁端登入的字樣,很顯眼。因此想到了另外一種互動方式,通過郵件進行互動。
通過郵件的方式不要求使用者實時線上,只需要程式隔一段時間掃描一下郵箱的新郵件即可。這種互動方式更為方便。其次,這種方式也更為隱蔽,不會干擾微信的使用。
0x01 需要用到的庫
主要是python的一些用於收發郵件的庫
import smtplib from email.parser import Parser from email.header import decode_header from email.utils import parseaddr import poplib import pyautogui from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.header import Header import os
0x02 具體實現
首先,實現郵件的讀取功能。讀取最新的一封郵件內容,這條內容中包含我們要做的事情,比如查詢ip地址、獲取螢幕截圖等。
在獲取內容之前,先將郵箱的登入等做好初始化
def email_init(): email = '[email protected]' #登入的郵箱賬號 password = 'xxxxx' # 注意這裡不是郵箱密碼 是要登入的郵箱的授權碼 pop3_server = 'pop.qq.com' # 連線到POP3伺服器: server = poplib.POP3_SSL(pop3_server,995) server.set_debuglevel(0) server.user(email) server.pass_(password) resp,mails,octets = server.list() index = len(mails) resp,lines,octets = server.retr(index) # 這裡index代表讀取最後一封郵件 也就是第一封 msg_content = b'\r\n'.join(lines).decode('utf-8') msg = Parser().parsestr(msg_content) return msg,server
要注意密碼不是郵箱的密碼,是授權碼,具體獲取方式可以百度。
隨後就可以將進行郵件的讀取了。
def print_info(msg,indent=0): if indent == 0: for header in ['From','To','Subject']: value = msg.get(header,'') if value: if header == 'Subject': value = decode_str(value) else: hdr,addr = parseaddr(value) name = decode_str(hdr) value = u'%s <%s>' % (name,addr) print('%s%s: %s' % (' ' * indent,header,value)) if msg.is_multipart(): parts = msg.get_payload() for n,part in enumerate(parts): print('%spart %s' % (' ' * indent,n)) print('%s--------------------' % (' ' * indent)) return print_info(part,indent + 1) else: content_type = msg.get_content_type() if content_type=='text/plain' or content_type=='text/html': content = msg.get_payload(decode=True) charset = guess_charset(msg) if charset: content = content.decode(charset) print('%sText: %s' % (' ' * indent,content)) return content else: print('%sAttachment: %s' % (' ' * indent,content_type))
將上一步得到的msg引數傳入到讀取函式中,通過遞迴呼叫查詢郵件內容並解碼。其中涉及到遞迴呼叫中的輸出問題,我再上一篇文章中有提到:https://www.jb51.net/article/182761.htm
另外,涉及的解析函式decode_str()如下
def decode_str(s): value,charset = decode_header(s)[0] if charset: value = value.decode(charset) return value
在郵件中讀取相關命令後,就是對命令執行,然後在通過郵件的形式反饋命令結果了。
這裡以返回螢幕截圖以及執行dos命令為例
def send_result(kind,result): # 第三方 SMTP 服務 mail_host = "smtp.163.com" mail_user = "@163.com" #傳送資訊的郵箱 這裡我是用的163郵箱 mail_pass = "xxxxxxx" # 郵箱的授權碼 sender = '[email protected]' #傳送方地址 receivers = ['[email protected]'] #收件地址 if kind == 1: # 第一方式 反饋螢幕截圖 print('Sending screenshot.') # 建立一個帶附件的例項 message = MIMEMultipart() message['From'] = '<[email protected]>' message['To'] = '<[email protected]>' subject = 'Hacker Center reply' message['Subject'] = Header(subject,'utf-8') # 郵件正文內容 message.attach(MIMEText('Hacker Server replay','plain','utf-8')) if os.path.exists("./screenshot.jpg"): # 構造附件1,傳送當前目錄下的 test.txt 檔案 att1 = MIMEText(open('./screenshot.jpg','rb').read(),'base64','utf-8') att1["Content-Type"] = 'application/octet-stream' # 這裡的filename可以任意寫,寫什麼名字,郵件中顯示什麼名字 att1["Content-Disposition"] = 'attachment; filename="screenshot.jpg"' message.attach(att1) try: smtpObj = smtplib.SMTP_SSL(mail_host,465) # 啟用SSL發信,埠一般是465 smtpObj.login(mail_user,mail_pass) # 登入驗證 smtpObj.sendmail(sender,receivers,message.as_string()) # 傳送 print("mail has been send successfully.") except smtplib.SMTPException as e: print(e) if kind == 2: #第二種方式 返回dos命令結果 message = MIMEText(result,'utf-8') message['From'] = '<[email protected]>' message['To'] = '<[email protected]>' subject = 'Hacker Center reply' message['Subject'] = Header(subject,'utf-8') smtpObj = smtplib.SMTP_SSL(mail_host,465) smtpObj.login(mail_user,mail_pass) smtpObj.sendmail(sender,message.as_string()) print("mail has been send successfully.")
其中執行dos命令的函式如下:
def manage_cmd(cmd): print('The command is:%s' % cmd) kind = 0 result = 'Nothing happen.' if 'screenshot' in cmd: img = pyautogui.screenshot() img.save('./screenshot.jpg') kind = 1 if 'dos cmd' in cmd: dos_result = '' index = cmd.find(':') cmd = cmd[index+1:] if os.system(cmd): result = 'command err.' else: info = os.popen(cmd) for line in info: dos_result = dos_result + line kind = 3 if dos_result != '': result = dos_result return kind,result
傳入的cmd引數就是解析出的郵件內容,通過判斷郵件內容來進行郵件反饋。
0x03 實驗結果
傳送郵箱查詢本機ip地址
收到的反饋如下:
總結
到此這篇關於python 通過郵件控制電腦實現遠端控制電腦操作的文章就介紹到這了,更多相關python郵件遠端控制電腦內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!