說起來寫這個的初衷有點尷尬,前幾天有人用‘永恆之藍’攻擊公司的系統,剛好我和我老大晚上沒關電腦跑東西,還沒開啓自動更新(win7,你說這時候要是win10多好),然後就喜聞樂見的中招了,還好及時在第二天查殺掉了,然後PM表示以後開始你們2個就每人一個月輪着來檢查其他人的電腦防毒軟件(公司指定)/系統自動更新是不是開啓了,查到沒開的就拉入夥一起負責檢查_ (:3」∠*)_。
本着爲老大排(懶)憂(的)解(跑)難(動)的初衷,爲啥不寫個遠程監控,自動記錄日誌的軟件呢。剛好也正在研究Python,就直接動手吧。
目標:
1.一個簡單的日誌記錄服務器,負責將客戶端發送過來的檢測結果記錄到日誌文件中。
2.客戶端,負責檢測用戶電腦的MAC,IP地址,系統型號,CPU型號。是否開啓自動更新,是否打開了XXX防毒軟件。
工具準備:
首先因爲公司電腦有32位的,爲了之後打包成exe後沒有兼容問題,所以這裏就選用python 3.6.3 32位
Windows x86 executable installer這個
https://www.python.org/downloads/release/python-363/
WMI:更新時間感人= = WMI-1.4.9.win32.exe (md5)
https://pypi.python.org/pypi/WMI/
WMI依賴pywin32(win32.com)
選最新的文件夾點進去,選擇適合自己版本的,我這裏因爲python是32位的,所以選擇pywin32-221.win32-py3.6.exe;上面amd64的就是64位的(對應python 64位,和電腦系統無關)
https://sourceforge.net/projects/pywin32/files/pywin32/
安裝WMI和pywin32,一般來說就是直接next…會自動查詢安裝的電腦上是否存在對應版本的python填入安裝參數,如果報找不到python類的錯,那就是版本不兼容的問題了
上面都完成後就可以開始碼代碼了,直接上代碼
服務器端
因爲我這裏是將自己電腦作爲了服務器端,所以如果想部署到linux服務器上的話還需要點小改動
服務端主要就是TCP連接端+多線程,多線程這裏直接用threading.Thread,這裏之後可以添加一個ctrl+C退出功能。
#coding:utf-8
import socket
import threading
import time
import sys
import signal
def saveInfo(info):
# try:
fileAll='d:\\1\\tcp\\data.txt'
with open(fileAll,'a',encoding='utf-8') as file_write:
file_write.write(info+'\n')
# except:
# print('error:something faile')
#def quit(signum, frame):
# print('')
# print('stop fusion')
# sys.exit()
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome!')
buffer = []#
while True:
data = sock.recv(1024)
if data:
buffer.append(data)
else :
break
#sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
dataStr = b''.join(buffer)
if mutex.acquire(True):
saveInfo(str(dataStr,'utf-8'))
print(dataStr)
mutex.release()
#signal.signal(signal.SIGINT, quit)
#signal.signal(signal.SIGTERM, quit)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('服務器地址', 9999))
s.listen(5)
threads = []
mutex = threading.Lock()
print('Waiting for connection...')
while True:
sock, addr = s.accept()
t = threading.Thread(target=tcplink, args=(sock, addr))
threads.append(t)
t.start()
客戶端
直接使用WMI封裝好的方法來獲取各項系統信息,各個功能模塊基本都用註釋標明瞭,組裝後發給服務器
#client
#coding:utf-8
import socket
import wmi
#獲取本機進程列表
def getWinProList():
ProList = []
c = wmi.WMI()
for process in c.Win32_Process():
ProList.append(str(process.Name))
return ProList
#獲取本機服務列表
def getWinSerList():
SerList = []
c = wmi.WMI()
for service in c.Win32_Service():
SerList.append(str(service.Name))
return SerList
#獲取本機系統,CPU,內存信息
def getSystemInfo():
c = wmi.WMI()
systemInfo=''
for sys in c.Win32_OperatingSystem():
systemInfo+='Version:'+sys.Caption+' Vernum:'+sys.BuildNumber
systemInfo+=' '+sys.OSArchitecture
for processor in c.Win32_Processor():
systemInfo+=" Process Name:"+processor.Name.strip()
for Memory in c.Win32_PhysicalMemory():
systemInfo+=" Memory Capacity:"+str(int(Memory.Capacity)/1024/1024/1024)+' GB'
return systemInfo
#獲取本機Mac,IP地址
def getIp():
c = wmi.WMI()
ipInfo=''
for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled= True):
ipInfo+="MAC:"+interface.MACAddress
for ip_address in interface.IPAddress:
ipInfo+=" ip:"+ip_address
return ipInfo
#掃描本機
def scanSystem():
resultInfo=''
resultInfo+=getIp()+' '+getSystemInfo()
systemCheck1=systemCheck2=systemCheck3='N'
ProList=getWinProList()
for pro in ProList:
if pro == 'PccNTMon.exe':#XXX防毒軟件的進程
systemCheck1='Y'
SerList=getWinSerList()
for ser in SerList:
if ser == 'TMBMServer':#XXX防毒軟件的服務
systemCheck2='Y'
if ser == 'wuauserv':#windows update服務
systemCheck3='Y'
if systemCheck1 == 'Y':
resultInfo+=' XXX軟件進程已開啓'
else:
resultInfo+=' XXX軟件進程未開啓'
if systemCheck2 == 'Y':
resultInfo+=' XXX服務已開啓'
else:
resultInfo+=' XXX服務未開啓'
if systemCheck3 == 'Y':
resultInfo+=' 系統已開啓自動更新'
else:
resultInfo+=' 系統未開啓自動更新'
return resultInfo
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('服務器地址', 9999))
print(s.recv(1024).decode('utf-8'))
s.send(bytes(scanSystem(),encoding='utf-8'))
s.close()
最後的總體思路是,使用windows系統自帶的計劃任務,讓每臺電腦都在特定的時間執行打包完成的客戶端.exe文件(PS:這一步正在找可已免配置自動執行的方法),然後將服務器端放在一臺測試用的服務器上即可(畢竟組裏自己用的東西,放生產環境就太那啥了_ (:3」∠*)_)。
講下python 3.6打包成exe文件的流程吧。
1.因爲是Python 3.6,所以直接進入 python安裝目錄\Scripts 文件夾,在文件夾內運行cmd命令行:pip install pyinstaller 安裝pyinstaller
2.安裝完畢後到https://github.com/pyinstaller/pyinstaller下載壓縮包,解壓後複製裏面的PyInstaller文件夾,黏貼到 python安裝目錄\Lib\site-packages下,因爲現在還不支持Python 3.6的打包。
3.將需要打包的py文件放在 python安裝目錄\Scripts 目錄下 ,cmd執行pyinstaller -F 需打包.py。然後生成的exe可執行文件就在同目錄下的dist文件夾內。替換文件圖片等操作可以查詢pyinstaller相關參數。
10.27更新,添加多線程互斥鎖同步文件寫入操作