python 通過(guò)郵件控制實(shí)現(xiàn)遠(yuǎn)程控制電腦操作
0x00 思路
之前在博客上看到了使用python通過(guò)微信的接口,與微信交互的方式來(lái)控制電腦的攝像頭、開(kāi)關(guān)機(jī)等。但是這種方式需要首先在python上登錄自己的微信才可以,同時(shí)微信端也會(huì)有已經(jīng)在網(wǎng)頁(yè)端登錄的字樣,很顯眼。因此想到了另外一種交互方式,通過(guò)郵件進(jìn)行交互。
通過(guò)郵件的方式不要求用戶實(shí)時(shí)在線,只需要程序隔一段時(shí)間掃描一下郵箱的新郵件即可。這種交互方式更為方便。其次,這種方式也更為隱蔽,不會(huì)干擾微信的使用。
0x01 需要用到的庫(kù)
主要是python的一些用于收發(fā)郵件的庫(kù)
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 具體實(shí)現(xiàn)
首先,實(shí)現(xiàn)郵件的讀取功能。讀取最新的一封郵件內(nèi)容,這條內(nèi)容中包含我們要做的事情,比如查詢ip地址、獲取屏幕截圖等。
在獲取內(nèi)容之前,先將郵箱的登錄等做好初始化
def email_init():
email = 'xxxxx@qq.com' #登錄的郵箱賬號(hào)
password = 'xxxxx' # 注意這里不是郵箱密碼 是要登錄的郵箱的授權(quán)碼
pop3_server = 'pop.qq.com'
# 連接到POP3服務(wù)器:
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
要注意密碼不是郵箱的密碼,是授權(quán)碼,具體獲取方式可以百度。
隨后就可以將進(jìn)行郵件的讀取了。
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參數(shù)傳入到讀取函數(shù)中,通過(guò)遞歸調(diào)用查詢郵件內(nèi)容并解碼。其中涉及到遞歸調(diào)用中的輸出問(wèn)題,我再上一篇文章中有提到:http://www.dhdzp.com/article/182761.htm
另外,涉及的解析函數(shù)decode_str()如下
def decode_str(s): value, charset = decode_header(s)[0] if charset: value = value.decode(charset) return value
在郵件中讀取相關(guān)命令后,就是對(duì)命令執(zhí)行,然后在通過(guò)郵件的形式反饋命令結(jié)果了。
這里以返回屏幕截圖以及執(zhí)行dos命令為例
def send_result(kind, result):
# 第三方 SMTP 服務(wù)
mail_host = "smtp.163.com"
mail_user = "@163.com" #發(fā)送信息的郵箱 這里我是用的163郵箱
mail_pass = "xxxxxxx" # 郵箱的授權(quán)碼
sender = 'xxxxxx@163.com' #發(fā)送方地址
receivers = ['xxxxx@qq.com'] #收件地址
if kind == 1: # 第一方式 反饋屏幕截圖
print('Sending screenshot.')
# 創(chuàng)建一個(gè)帶附件的實(shí)例
message = MIMEMultipart()
message['From'] = '<hacker_center@163.com>'
message['To'] = '<niu5512@qq.com>'
subject = 'Hacker Center reply'
message['Subject'] = Header(subject, 'utf-8')
# 郵件正文內(nèi)容
message.attach(MIMEText('Hacker Server replay', 'plain', 'utf-8'))
if os.path.exists("./screenshot.jpg"):
# 構(gòu)造附件1,傳送當(dāng)前目錄下的 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發(fā)信, 端口一般是465
smtpObj.login(mail_user, mail_pass) # 登錄驗(yàn)證
smtpObj.sendmail(sender, receivers, message.as_string()) # 發(fā)送
print("mail has been send successfully.")
except smtplib.SMTPException as e:
print(e)
if kind == 2: #第二種方式 返回dos命令結(jié)果
message = MIMEText(result, 'plain', 'utf-8')
message['From'] = '<hacker_center@163.com>'
message['To'] = '<niu5512@qq.com>'
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, receivers, message.as_string())
print("mail has been send successfully.")
其中執(zhí)行dos命令的函數(shù)如下:
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參數(shù)就是解析出的郵件內(nèi)容,通過(guò)判斷郵件內(nèi)容來(lái)進(jìn)行郵件反饋。
0x03 實(shí)驗(yàn)結(jié)果
發(fā)送郵箱查詢本機(jī)ip地址

收到的反饋如下:

總結(jié)
到此這篇關(guān)于python 通過(guò)郵件控制電腦實(shí)現(xiàn)遠(yuǎn)程控制電腦操作的文章就介紹到這了,更多相關(guān)python郵件遠(yuǎn)程控制電腦內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python導(dǎo)入坐標(biāo)點(diǎn)的具體操作
在本篇文章里小編給大家分享了關(guān)于python導(dǎo)入坐標(biāo)點(diǎn)的具體操作步驟和圖解,有需要的朋友們跟著學(xué)習(xí)下。2019-05-05
對(duì)Python中plt的畫(huà)圖函數(shù)詳解
今天小編就為大家分享一篇對(duì)Python中plt的畫(huà)圖函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
使用Python神器對(duì)付12306變態(tài)驗(yàn)證碼
這篇文章主要介紹了使用Python神器對(duì)付12306變態(tài)驗(yàn)證碼的相關(guān)資料,需要的朋友可以參考下2016-01-01
python編程冒泡排序法實(shí)現(xiàn)動(dòng)圖排序示例解析
這篇文章主要介紹了python編程中如何使用冒泡排序法實(shí)現(xiàn)動(dòng)圖排序的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
巧用Python裝飾器 免去調(diào)用父類構(gòu)造函數(shù)的麻煩
巧用Python裝飾器 免去調(diào)用父類構(gòu)造函數(shù)的麻煩,需要的朋友可以參考下2012-05-05
從局部變量和全局變量開(kāi)始全面解析Python中變量的作用域
無(wú)論是以類為基礎(chǔ)的面相對(duì)象編程,還是單純函數(shù)內(nèi)部變量的定義,變量的作用域始終是Python學(xué)習(xí)中一個(gè)必須理解掌握的環(huán)節(jié),下面我們從局部變量和全局變量開(kāi)始全面解析Python中變量的作用域,需要的朋友可以參考下2016-06-06

