文章目录
- 最后
前言
_..._ .-'''-. .-'''-.
.-'_..._''. ' _ \ ' _ \ .---.
.----. .----. __.....__ .' .' '.\/ /` '. \ _..._ / /` '. \ | |
\ \ / /.-'' '. .-. .- / .' . | \ ' .' '. . | \ ' | |
' '. /' // .-''"'-. `. .-,.--.\ \ / / . ' | ' | '. .-. . .| .-,.--. | ' | '| |
| |' // /________\ \| .-. |\ \ / / | | \ \ / / | ' ' | .' |_ | .-. |\ \ / / | |
| || || || | | | \ \ / / | | `. ` ..' / | | | | .' || | | | `. ` ..' / | |
'. `' .'\ .-------------'| | | | \ \ / / . ' '-...-'` | | | |'--. .-'| | | | '-...-'` | |
\ / \ '-.____...---.| | '- \ ` / \ '. . | | | | | | | | '- | |
\ / `. .' | | \ / '. `._____.-'/ | | | | | | | | | |
'----' `''-...... -' | | / / `-.______ / | | | | | '.'| | '---'
|_| |`-' / ` | | | | | / |_|
'..' '--' '--' `'-'
VeryControl 软件的 Logo
我最近多少有点儿闲得慌,前两天出去玩儿了一圈,路上就一直盘算着这事儿,前两天做了个雏形,今天完善好了,分享给大家一起看着玩儿。
这个程序感觉还凑合,制作了一个网页端。虽然设计不咋样吧(我是初学者),但是至少能在手机、电脑等各种设备上成功访问并进行远程命令执行。
用到的语言是 和 ,使用了
软件截图:
软件下载
建议阅读里面的注意事项,很重要。
可能CSDN资源还没有通过审核,可以使用下面的仓库看程序。
有一个开源的地址:https://pandaoxi.coding.net/public/pandaoxi/Projects/git/files/master/Very_Control
代码展示
让我们一起来看看这个小项目的源代码叭~
H T M L HTML HTML
部分主要是客户端的一些东西,直接在网页上访问,并传回相应的内容给后端
1.客户端主页
最基本的内容,可以直接在主页填写命令的表单,然后 给后端的 /run
。
<!--设置标题-->
<title>Very Control</title>
<!--CSS样式-->
<style>/*给页面添加背景图片,还是随机的(这是一个风景壁纸API)*/
.bg{
background-image: url(https://api.ixiaowai.cn/gqapi/gqapi.php);
}
/*这是给输入框设置透明度的,这样设置正好能看清文字也能欣赏背景*/
input,textarea{
filter:alpha(Opacity=30);
-moz-opacity:0.4;
opacity:0.6;
}</style>
<!--设置的div,显示背景和文字-->
<div class="bg">
<!--表单-->
<form id="run" action="/run" method="post" enctype="multipart/form-data">
<h1>Very Control 多对一远程控制平台</h1>
<p>输入命令: <input type="text" name="command" placeholder="输入 Windows 命令 "/></p>
<p>带有回显的命令:<input type="text" name="echo" placeholder="输入命令,并返回输出内容 "/>
<p>提交批处理文件的源代码:</p>
<p><textarea name="code" rows="10" cols="75" placeholder="输入你的 Windows Batch 代码"></textarea></p>
<p>或者使用<b><a href="https://pandaoxi2020.lanzouy.com/iCMJm07i76ti" target="_blank">应用程序提交工具</a></b></p>
<input type="submit" value="运行"/>
</form>
<br><br>
<p>当前软件信息:</p>
<p>版本: 1.3.0.0 [2022-7-22 Update]</p>
<p>开发者:<b><font face="Consolas"><a href="https://pandaoxi.github.io/" target="_blank">PanDaoxi</a></font></b></p>
<p>开源地址:<a href="https://pandaoxi.coding.net/public/pandaoxi/Projects/git/files/master/Very_Control">点击这里去访问</a>!</p>
<p>开发者邮箱(欢迎意见反馈和技术支持):<a target="_blank" href="http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=5paHiIKHiZ6P1NbU1KaXl8iFiYs" style="text-decoration:none;"><img src="http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_02.png"/></a></p>
</div>
<hr>
<!--其他功能的超链接-->
<center><p>其他功能:<a href="ss">截取屏幕</a> <a href="inf">查看被控制者信息</a> <a href="cam">捕获摄像头</a> <a href="sendm">发送消息</a> <a href="rn">阅读官方通知</a></p></center>
2.拍照、截图
这两个功能的页面基本相同。
<title>摄像头捕获</title>
<center>
<!--此处正常的话,如果有摄像头应该显示默认摄像头的画面。为了保护隐私,我用开发者模式放了一张图片替换了摄像头图像。-->
<img src="https://pandaoxis.coding.net/p/pdxres/d/pdxres/git/raw/master/RESOURCE/20220729_picture.png" alt="摄像头捕获" height="450" width="800"/>
<br><br>
<p>该功能可能会比较卡顿;如果不能正常显示出摄像头图像,可能是因为被控制设备的摄像头无法访问。</p>
<br><hr>
<a href="jump">回到主页</a> <a href="cam">重新拍照</a>
</center>
<title>Screen Shot</title>
<center>
<!--使用图片的base64显示,因为太长我就不写了-->
<img src="data:image/png;base64, ..." alt="截图" height="576" width="1024"/>
<br><br><hr>
<a href="jump">回到主页</a> <a href="ss">重新截图</a>
</center>
P y t h o n Python Python
目录树:
D:.
│ db.sqlite3
│ main.py
│ manage.py
│
└─VeryControl
asgi.py
settings.py
urls.py
wsgi.py
__init__.py
我特意给它做了一个应用程序版的,内置 第 的服务器版本 它会自己更新,不用管它。
1. / m a i n . p y /main.py /main.py
这个程序的主要功能是:
- 绘制
- 生成服务器,使得前端可以访问。😊
- 检查是否有更新,如果没有直接运行服务器;如果有,就强制更新。😑
第三条性质感觉有那么一种
# Copyright 2022 by PanDaoxi. All rights reserved.
from socket import socket, AF_INET, SOCK_DGRAM
from os import system, name
from time import strftime, sleep
from colorama import init, Fore, Back
from requests import get
# 版本信息
version = "1.3.0.0 [2022-7-22 Update]"
# 更新文件的名称和网络地址
updateFiles = {
"./manage.py": "https://pandaoxi.coding.net/p/pandaoxi/d/Projects/git/raw/master/Very_Control/manage.py",
__file__: "https://pandaoxi.coding.net/p/pandaoxi/d/Projects/git/raw/master/Very_Control/main.py",
"./VeryControl/asgi.py": "https://pandaoxi.coding.net/p/pandaoxi/d/Projects/git/raw/master/Very_Control/VeryControl/asgi.py",
"./VeryControl/settings.py": "https://pandaoxi.coding.net/p/pandaoxi/d/Projects/git/raw/master/Very_Control/VeryControl/settings.py",
"./VeryControl/urls.py": "https://pandaoxi.coding.net/p/pandaoxi/d/Projects/git/raw/master/Very_Control/VeryControl/urls.py",
"./VeryControl/wsgi.py": "https://pandaoxi.coding.net/p/pandaoxi/d/Projects/git/raw/master/Very_Control/VeryControl/wsgi.py",
}
# 用户代理
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44",
}
# 获取IP地址
def getIP():
try:
sock = socket(AF_INET, SOCK_DGRAM)
sock.connect(("8.8.8.8", 80))
ip = sock.getsockname()[0]
finally:
sock.close()
return ip
# 如果发现更新就一个一个地给文件更新为最新版本
def update():
for i in updateFiles.keys():
with open(i, "wb") as f:
f.write(get(updateFiles[i], headers=headers).content)
sleep(0.3)
if __name__ == "__main__" and name == "nt":
# 获取最新版本号
temp = get('https://pandaoxi.coding.net/p/pandaoxi/d/Projects/git/raw/master/Very_Control/VeryControl/VERSION',headers=headers)
temp.encoding = 'utf-8'
latest = temp.text
# 如果不一样就更新
if latest != version:
print('Please wait a moment, we are updating the software for you ...')
update() # 你挡都挡不住!
system('cls')
# 画一只 楼狗(logo)
print(
""" _..._ .-\'\'\'-. .-\'\'\'-.
.-'_..._''. ' _ \ ' _ \ .---.
.----. .----. __.....__ .' .' '.\/ /` '. \ _..._ / /` '. \ | |
\ \ / /.-'' '. .-. .- / .' . | \ ' .' '. . | \ ' | |
' '. /' // .-''"'-. `. .-,.--.\ \ / / . ' | ' | '. .-. . .| .-,.--. | ' | '| |
| |' // /________\ \| .-. |\ \ / / | | \ \ / / | ' ' | .' |_ | .-. |\ \ / / | |
| || || || | | | \ \ / / | | `. ` ..' / | | | | .' || | | | `. ` ..' / | |
'. `' .'\ .-------------'| | | | \ \ / / . ' '-...-'` | | | |'--. .-'| | | | '-...-'` | |
\ / \ '-.____...---.| | '- \ ` / \ '. . | | | | | | | | '- | |
\ / `. .' | | \ / '. `._____.-'/ | | | | | | | | | |
'----' `''-...... -' | | / / `-.______ / | | | | | '.'| | '---'
|_| |`-' / ` | | | | | / |_|
'..' '--' '--' `'-' \n\n"""
)
# 配置 colorama
init(autoreset=True)
# 欢迎信息及服务器地址(高亮标红)
print(
"Welcome to Very_Control (Version %s) !\nControlled end:" % version,
Fore.RED + "http://%s:%s/\n" % (getIP(), strftime("%Y")),
)
# 运行服务器
system("python manage.py runserver %s:%s" % (getIP(), strftime("%Y")))
# 如果服务器运行期间出现BUG,这样就不会退出了。
input()
2. / V e r y C o n t r o l / u r l s . p y /VeryControl/urls.py /VeryControl/urls.py
这是服务器的核心,我们靠它进行一系列的控制。
from django.urls import path as site
from django.shortcuts import HttpResponse
from os import system, remove, environ
from base64 import a85decode, b64encode
from sys import path
from requests import get
from pyautogui import screenshot
from tkinter import Tk
from time import strftime, sleep
from cv2 import VideoCapture, imwrite
def getVersion():
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44",
}
temp = get(
"https://pandaoxi.coding.net/p/pandaoxi/d/Projects/git/raw/master/Very_Control/VeryControl/VERSION",
headers=headers,
)
temp.encoding = "utf-8"
return temp.text
# 求最大公因数
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
# 适配图片比例
def change(a, b):
x = gcd(a, b)
a /= x
b /= x
while a < 500 or b < 500:
a *= 2
b *= 2
return (a, b)
# 拍照
def get_photo():
cap = VideoCapture(0)
f, frame = cap.read()
imwrite("./photo.png", frame)
with open("./photo.png", "rb") as f:
temp = b64encode(f.read()).decode()
remove("./photo.png")
cap.release()
return "data:image/png;base64,%s" % temp
# 主页
def main(request):
return HttpResponse(
"""<title>Very Control</title>
<style>
.bg{
background-image: url(https://api.ixiaowai.cn/gqapi/gqapi.php);
}
input,textarea{
filter:alpha(Opacity=30);
-moz-opacity:0.4;
opacity:0.6;
}
</style>
<div class="bg">
<form id="run" action="/run" method="post" enctype="multipart/form-data">
<h1>Very Control 多对一远程控制平台</h1>
<p>输入命令: <input type="text" name="command" placeholder="输入 Windows 命令 "/></p>
<p>带有回显的命令:<input type="text" name="echo" placeholder="输入命令,并返回输出内容 "/>
<p>提交批处理文件的源代码:</p>
<p><textarea name="code" rows="10" cols="75" placeholder="输入你的 Windows Batch 代码"></textarea></p>
<p>或者使用<b><a href="https://pandaoxi2020.lanzouy.com/iCMJm07i76ti" target="_blank">应用程序提交工具</a></b></p>
<input type="submit" value="运行"/>
</form>
<br><br>
<p>当前软件信息:</p>
<p>版本: %s</p>
<p>开发者:<b><font face="Consolas"><a href="https://pandaoxi.github.io/" target="_blank">PanDaoxi</a></font></b></p>
<p>开源地址:<a href="https://pandaoxi.coding.net/public/pandaoxi/Projects/git/files/master/Very_Control">点击这里去访问</a>!</p>
<p>开发者邮箱(欢迎意见反馈和技术支持):<a target="_blank" href="http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=5paHiIKHiZ6P1NbU1KaXl8iFiYs" style="text-decoration:none;"><img src="http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_02.png"/></a></p>
</div>
<hr>
<center><p>其他功能:<a href="ss">截取屏幕</a>\t\t<a href="inf">查看被控制者信息</a>\t\t<a href="cam">捕获摄像头</a>\t\t<a href="sendm">发送消息</a>\t\t<a href="rn">阅读官方通知</a></p></center>
"""
% getVersion()
)
# 阅读通知
def readNotice(request):
return HttpResponse(
"""<title>阅读官方通知</title>
<h1>官方通知</h1>
<hr><br>
<iframe src="https://pandaoxis.github.io/verycontrol/" width="800" height="450"></iframe>
<p>页面加载较慢是正常现象,请耐心等候。</p>
<br><hr>
<center><a href="jump">回到主页</a></center>
"""
)
# 运行
def run(request):
system("chcp 65001 >nul")
text = request.POST.get("command")
code = request.POST.get("code")
runf = request.POST.get("runf")
echo = request.POST.get("echo")
if code: # 优先级最高的 执行批处理脚本
with open("temp.bat", "w", encoding="utf-8") as f:
f.write(code + "\nexit")
system("start %s\\temp.bat" % path[0])
if runf: # 次之的应用程序
with open("temp.exe", "wb") as f:
f.write(a85decode(runf.encode()))
system("start %s\\temp.exe" % path[0])
if text: # 最后是直接执行命令
system(text)
if echo: # 带回显的执行命令
try:
remove("temp.txt")
except:
pass
system("%s >> temp.txt" % echo)
with open("temp.txt", "r", encoding="utf-8") as f:
ret = f.read().splitlines()
s = ""
for i in ret:
s += "<p>%s</p>\n" % i
return HttpResponse(
"""<title>程序运行结果</title>
%s
<br><hr><br>
<center><a href="jump">回到主页</a></center>"""
% s
)
return HttpResponse('<meta http-equiv="refresh" content="0;url=jump"/>')
# 截图
def ss(request):
window = Tk()
window.withdraw()
width = window.winfo_screenwidth()
height = window.winfo_screenheight()
image = screenshot(region=(0, 0, width, height))
image.save("./screenshot.png")
with open("./screenshot.png", "rb") as f:
content = b64encode(f.read()).decode()
remove("./screenshot.png")
w, h = change(width, height)
return HttpResponse(
"""<title>Screen Shot</title>
<center>
<img src="data:image/png;base64,%s" alt="截图" height="%d" width="%d">
<br><br><hr>
<a href="jump">回到主页</a>\t\t<a href="ss">重新截图</a>
</center>
"""
% (content, h, w)
)
window.mainloop()
# 环境信息
def inf(request):
system("chcp 65001 >nul")
s1 = ""
for i in environ.keys():
s1 += "<p>%s\t%s</p>\n" % (i, environ[i])
try:
remove("temp.txt")
except:
pass
system("tasklist>>temp.txt")
with open("temp.txt", "r", encoding="utf-8") as f:
s2 = f.read().splitlines()
remove("temp.txt")
s3 = ""
for i in s2:
s3 += "<p>%s</p>\n" % i
return HttpResponse(
"""<title>Os_Environ</title>
<h1>系统环境变量 </h1>
%s
<br><br><hr>
<h1>运行的进程(如需对齐可以看此网页的源代码) </h1>
%s
<br><br><hr>
<center><a href="jump">返回主页</a></center>
"""
% (s1, s3)
)
# 拍照
def camera(request):
return HttpResponse(
"""<title>摄像头捕获</title>
<center>
<img src="%s" alt="摄像头捕获" height="450" width="800">
<br><br>
<p>该功能可能会比较卡顿;如果不能正常显示出摄像头图像,可能是因为被控制设备的摄像头无法访问。</p>
<br><hr>
<a href="jump">回到主页</a>\t\t<a href="cam">重新拍照</a>
</center>
"""
% get_photo()
)
# 发送消息文本
def sendMessage(request):
return HttpResponse(
"""<title>发送消息文本</title>
<style>
.bg{
background-image: url(https://api.ixiaowai.cn/gqapi/gqapi.php);
}
input,textarea{
filter:alpha(Opacity=30);
-moz-opacity:0.4;
opacity:0.6;
}
</style>
<div class="bg">
<form id="show" action="/showm" method="post" enctype="multipart/form-data">
<h1>Very Control - 消息发送器</h1>
<p>输入发送给被控制端的消息,消息将会以<b>警示框</b>的形式表现:</p>
<p><textarea name="msg" rows="25" cols="100" placeholder="输入你的 消息文本"></textarea></p>
<input type="submit" value="发送"/>
</div>
<br><br><hr>
<center><a href="jump">回到主页</a></center> """
)
# 显示信息
def showMessage(request):
msg = request.POST.get("msg")
with open("temp.py", "w+", encoding="utf-8") as f:
f.write("from easygui import msgbox\nmsgbox('''%s''',\"Very Control\")" % msg)
system("start /min cmd /c temp.py")
return HttpResponse("""<meta http-equiv="refresh" content="0;url=sendm"/>""")
urlpatterns = [
site("", main),
site("jump", main),
site("run", run),
site("ss", ss),
site("inf", inf),
site("cam", camera),
site("sendm", sendMessage),
site("showm", showMessage),
site("rn", readNotice),
]
最后
有些时候,有些BUG,总也改不掉。还是需要专业的力量的😅。
对此感谢博客园和菜鸟教程的帮助!
完美结束。