python远程监视(无控制权区别于键盘鼠标)

监视端代码

pyinstaller -F -i logoico.ico RemoteAdmin.pyw
import tkinter
import tkinter.messagebox
import struct
import socket
import numpy as np
from PIL import Image, ImageTk
import threading
import re
from cv2 import cv2
import base64
import os

root = tkinter.Tk()
tmp = open("logoico.ico", "wb+")
tmp.write(base64.b64decode('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QwAAALwAAAAbAFVVNgAAAHsAAACWACkoKwAkJCQAOzo6AE9PTwA4NywAMDAtAGRkZgCSkpEAVVVHAAAASAABAQsAIB8fAG9ubgDk5OQA+vr7AO7u8wDj4+EAjYyNAFRUVAAAAAUAAgICAAwMCwBmZWUA+fn4AP7+/wD8/PYAq6uYAGppaQArKzAAVVVVAAAAAQAXFxcAh4aGALS0tQDy8uwAVFRsABgYpQAAAM0ADQ0wABEREQDT09YAiYl3AAoKJQCRkZEAEBAQAAEBAQCenZ8APj0zAAICRQACAuEAAABNAEdHPwCoqKgAJSQkAAAACwBaWk0APT09AG9vagBRUVEACwsLAISEhABkZGQAi4uLAAICXQAAAP8AAAD4AAAA/QAAAPkAAAD/AAUFeQAAAAAAZGRnAP///wD///8A////AP///wD///8A////AP///wD///8A////AJeXlwAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwBMSkoABQQEAAAAAACHh4cA////APj4+QAzMywAAAAXAAUF+wACAv8AAQH9AAAA9wAAAPoABASEAAAAAABoaGwA////AP///wD///8A////AP///wD///8A////AP///wD///8AlpaWAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAFVUVADHxsYAKCgnADEwMAD6+fkA////ANra3AAlJB8AAAAvAAAAwgAAAP0AAAD/AAEB/wAFBYIAAAAAAGhobAD///8A////AP///wD///8A////AP///wD///8A////AP///wCXl5cAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAMC/vwD9/PwAoaGhAObm5gD+/v4A////AO3s7gCJiX8APj0/ABYWTQAHB3MAAADBAAcHgwABAQEAZ2drAP///wD///8A////AP///wD///8A////AP///wD///8A////AJeXlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhkZAO7u7gD///8A/v7+AP7+/gD8/PwA////APX19wDs7OoA09LGAJSTgAA+PTYAAAABAAAAAABpaWkA////AP///wD///8AAAAAAAAAAHJzAAAAAAAAAAAAAAAAAG9icHEAAAAAAAAAAAAAAG0AYgAAbgAAAAAAAAAAaWoAAAAAAGtsAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxsbG6AICAf8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/AwMD/xkZGf/g39////////v7+//+/v7//v7+//7+/v/+/f3//v7+/+no6P+np6f/kpGR/5aWlv+DgoP/W1tc/zg4Ov82NTj/ERAL/wAAAP8AAAD8HBwc/+Li4roAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxsbG6AICAv8AAAD9AQEe/wEBOP8AAAD/AAAB/wAAAP8AAAD/Hhwc/yYlJf8AAAD/AAAA/wAAAP8YFxf/09LS//39/f/8/f3//v7+//7+/v/+/v7//v7+///////19fX/xcXE/46Njf9jY2L/XV1d/4KCgv+9vLz/09PU/7Oysv9BQED7EBAQ/uXl5bcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxsbG6AICA/8AAAD9AgIk/wICu/8AABn/AAAB/wAAAf8BAQH/GBcX/4aEhP/BwMD/n56e/3Z0df9hYF//l5aW//7+/v/9/v7//f39/////////////v7+//7+/v/////////////////////////////////////////////////m5eX8Pj4+/9jY2NIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxsbG6AICAv8AAAD9AQEh/wEBv/8AABv/AAAB/wAAAP8AAAD/AAAA/wAAAP9VVFT/29ra//////////////////v7+//7+/v//Pz8//39/f/9/f3//f39//z8/P/7+/v/+fn5//f39//39/f/+Pj4//j4+P/5+fn/+vr6//n4+P+7u7v9IiEh/a2trfsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxsbG6AICA/8AAAD9AgIX/wIC/P8AAFz/AAAA/wAAA/8AAAD/AAAA/wEBAf8AAAD/AAAA/09OTv+ysbH/8/Pz////////////////////////////////////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'))
# tmp.write(base64.b64decode('粘贴icon2.py字符串内容'))
tmp.close()
root.title('监控 - 闽狼传说')
#root.iconbitmap('logoico.ico')
root.iconbitmap(default = r'logoico.ico')
# 放缩大小
scale = 1

# 原传输画面尺寸
fixw, fixh = 0, 0

# 放缩标志
wscale = False

# 屏幕显示画布
showcan = None

# socket缓冲区大小
bufsize = 10240

# 线程
th = None

# socket
soc = None

# socks5

socks5 = None

# 初始化socket
def SetSocket():
    global soc, host_en
    def byipv4(ip, port):
            return struct.pack(">BBBBBBBBH", 5, 1, 0, 1, ip[0], ip[1], ip[2], ip[3], port)
    def byhost(host, port):
        d = struct.pack(">BBBB", 5, 1, 0, 3)
        blen = len(host)
        d+=struct.pack(">B", blen)
        d+=host.encode()
        d+=struct.pack(">H", port)
        return d
    host = host_en.get()
    if host is None:
        tkinter.messagebox.showinfo('提示', 'Host设置错误!')
        return
    hs = host.split(":")
    if len(hs) != 2:
        tkinter.messagebox.showinfo('提示', 'Host设置错误!')
        return
    if socks5 is not None:
        ss = socks5.split(":")
        if len(ss) != 2:
            tkinter.messagebox.showinfo('提示', '代理设置错误!')
            return
        soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        soc.connect((ss[0], int(ss[1])))
        soc.sendall(struct.pack(">BB", 5, 0))
        recv = soc.recv(2)
        if recv[1] != 0:
            tkinter.messagebox.showinfo('提示', '代理回应错误!')
            return
        if re.match(r'^\d+?\.\d+?\.\d+?\.\d+?:\d+

, host) is None:
            # host 域名访问
            hand = byhost(hs[0], int(hs[1]))
            soc.sendall(hand)
        else:
            # host ip访问
            ip = [int(i) for i in hs[0].split(".")]
            port = int(hs[1])
            hand = byipv4(ip, port)
            soc.sendall(hand)
        # 代理回应
        rcv = b''
        while len(rcv)!=10:
            rcv += soc.recv(10-len(rcv))
        if rcv[1] != 0:
            tkinter.messagebox.showinfo('提示', '代理回应错误!')
            return
    else:
        soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        soc.connect((hs[0], int(hs[1])))


def SetScale(x):
    global scale, wscale
    scale = float(x) / 100
    wscale = True

def ShowProxy():
    # 显示代理设置
    global root
    def set_s5_addr():
        global socks5
        socks5 = s5_en.get()
        if socks5 == "":
            socks5 = None
        pr.destroy()
    pr = tkinter.Toplevel(root)
    s5v = tkinter.StringVar()
    s5_lab = tkinter.Label(pr, text="Socks5 主机:")
    s5_en = tkinter.Entry(pr, show=None, font=('Arial', 14), textvariable=s5v)
    s5_btn = tkinter.Button(pr, text="确定", command=set_s5_addr)
    s5_lab.grid(row=0, column=0, padx=10, pady=10, ipadx=0, ipady=0)
    s5_en.grid(row=0, column=1, padx=10, pady=10, ipadx=40, ipady=0)
    s5_btn.grid(row=1, column=0, padx=10, pady=10, ipadx=30, ipady=0)
    s5v.set("127.0.0.1:1000")


def ShowScreen():
    global showcan, root, soc, th, wscale
    if showcan is None:
        wscale = True
        showcan = tkinter.Toplevel(root)
        th = threading.Thread(target=run)
        th.start()
    else:
        soc.close()
        showcan.destroy()


val = tkinter.StringVar()
host_lab = tkinter.Label(root, text="主机:")
host_en = tkinter.Entry(root, show=None, font=('Arial', 14), textvariable=val)
sca_lab = tkinter.Label(root, text="比例:")
sca = tkinter.Scale(root, from_=10, to=100, orient=tkinter.HORIZONTAL, length=100,
                    showvalue=100, resolution=0.1, tickinterval=50, command=SetScale)
proxy_btn = tkinter.Button(root, text="代理", command=ShowProxy)
show_btn = tkinter.Button(root, text="显示", command=ShowScreen)

host_lab.grid(row=0, column=0, padx=10, pady=10, ipadx=0, ipady=0)
host_en.grid(row=0, column=1, padx=0, pady=0, ipadx=40, ipady=0)
sca_lab.grid(row=1, column=0, padx=10, pady=10, ipadx=0, ipady=0)
sca.grid(row=1, column=1, padx=0, pady=0, ipadx=100, ipady=0)
proxy_btn.grid(row=2, column=0, padx=0, pady=10, ipadx=30, ipady=0)
show_btn.grid(row=2, column=1, padx=0, pady=10, ipadx=30, ipady=0)
sca.set(100)
val.set('127.0.0.1:1000')


def BindEvents(canvas):
    global soc, scale
    '''
    处理事件
    '''
    def EventDo(data):
        soc.sendall(data)
    # 鼠标左键

    def LeftDown(e):
        return EventDo(struct.pack('>BBHH', 1, 100, int(e.x/scale), int(e.y/scale)))

    def LeftUp(e):
        return EventDo(struct.pack('>BBHH', 1, 117, int(e.x/scale), int(e.y/scale)))
    canvas.bind(sequence="<1>", func=LeftDown)
    canvas.bind(sequence="<ButtonRelease-1>", func=LeftUp)

    # 鼠标右键
    def RightDown(e):
        return EventDo(struct.pack('>BBHH', 3, 100, int(e.x/scale), int(e.y/scale)))

    def RightUp(e):
        return EventDo(struct.pack('>BBHH', 3, 117, int(e.x/scale), int(e.y/scale)))
    canvas.bind(sequence="<3>", func=RightDown)
    canvas.bind(sequence="<ButtonRelease-3>", func=RightUp)

    # 鼠标滚轮
    def Wheel(e):
        if e.delta < 0:
            return EventDo(struct.pack('>BBHH', 2, 0, int(e.x/scale), int(e.y/scale)))
        else:
            return EventDo(struct.pack('>BBHH', 2, 1, int(e.x/scale), int(e.y/scale)))
    canvas.bind(sequence="<MouseWheel>", func=Wheel)

    # 键盘
    def KeyDown(e):
        return EventDo(struct.pack('>BBHH', e.keycode, 100, int(e.x/scale), int(e.y/scale)))
    def KeyUp(e):
        return EventDo(struct.pack('>BBHH', e.keycode, 117, int(e.x/scale), int(e.y/scale)))
    canvas.bind(sequence="<KeyPress>", func=KeyDown)
    canvas.bind(sequence="<KeyRelease>", func=KeyUp)



def run():
    global wscale, fixh, fixw, soc, showcan
    SetSocket()
    lenb = soc.recv(5)
    imtype, le = struct.unpack(">BI", lenb)
    imb = b''
    while le > bufsize:
        t = soc.recv(bufsize)
        imb += t
        le -= len(t)
    while le > 0:
        t = soc.recv(le)
        imb += t
        le -= len(t)
    data = np.frombuffer(imb, dtype=np.uint8)
    img = cv2.imdecode(data, cv2.IMREAD_COLOR)
    h, w, _ = img.shape
    fixh, fixw = h, w
    imsh = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)
    imi = Image.fromarray(imsh)
    imgTK = ImageTk.PhotoImage(image=imi)
    cv = tkinter.Canvas(showcan, width=w, height=h, bg="white")
    cv.focus_set()
    BindEvents(cv)
    cv.pack()
    cv.create_image(0, 0, anchor=tkinter.NW, image=imgTK)
    h = int(h * scale)
    w = int(w * scale)
    while True:
        if wscale:
            h = int(fixh * scale)
            w = int(fixw * scale)
            cv.config(width=w, height=h)
            wscale = False
        try:
            lenb = soc.recv(5)
            imtype, le = struct.unpack(">BI", lenb)
            imb = b''
            while le > bufsize:
                t = soc.recv(bufsize)
                imb += t
                le -= len(t)
            while le > 0:
                t = soc.recv(le)
                imb += t
                le -= len(t)
            data = np.frombuffer(imb, dtype=np.uint8)
            ims = cv2.imdecode(data, cv2.IMREAD_COLOR)
            if imtype == 1:
                # 全传
                img = ims
            else:
                # 差异传
                img = img + ims
            imt = cv2.resize(img, (w, h))
            imsh = cv2.cvtColor(imt, cv2.COLOR_RGB2RGBA)
            imi = Image.fromarray(imsh)
            imgTK.paste(imi)
        except:
            showcan = None
            ShowScreen()
            return

os.remove("logoico.ico") #删除icon文件
root.mainloop()

无鼠标键盘

import struct
import socket
from PIL import ImageGrab
from cv2 import cv2
import numpy as np
import threading

bufsize = 1024
host = ('0.0.0.0', 1000)
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.bind(host)
soc.listen(1)
# 压缩比 1-100 数值越小,压缩比越高,图片质量损失越严重
IMQUALITY = 80

lock = threading.Lock()

official_virtual_keys = {
    0x08: 'backspace',
    0x09: 'tab',
    0x0c: 'clear',
    0x0d: 'enter',
    0x10: 'shift',
    0x11: 'ctrl',
    0x12: 'alt',
    0x13: 'pause',
    0x14: 'caps lock',
    0x15: 'ime kana mode',
    0x15: 'ime hanguel mode',
    0x15: 'ime hangul mode',
    0x17: 'ime junja mode',
    0x18: 'ime final mode',
    0x19: 'ime hanja mode',
    0x19: 'ime kanji mode',
    0x1b: 'esc',
    0x1c: 'ime convert',
    0x1d: 'ime nonconvert',
    0x1e: 'ime accept',
    0x1f: 'ime mode change request',
    0x20: 'spacebar',
    0x21: 'page up',
    0x22: 'page down',
    0x23: 'end',
    0x24: 'home',
    0x25: 'left',
    0x26: 'up',
    0x27: 'right',
    0x28: 'down',
    0x29: 'select',
    0x2a: 'print',
    0x2b: 'execute',
    0x2c: 'print screen',
    0x2d: 'insert',
    0x2e: 'delete',
    0x2f: 'help',
    0x30: '0',
    0x31: '1',
    0x32: '2',
    0x33: '3',
    0x34: '4',
    0x35: '5',
    0x36: '6',
    0x37: '7',
    0x38: '8',
    0x39: '9',
    0x41: 'a',
    0x42: 'b',
    0x43: 'c',
    0x44: 'd',
    0x45: 'e',
    0x46: 'f',
    0x47: 'g',
    0x48: 'h',
    0x49: 'i',
    0x4a: 'j',
    0x4b: 'k',
    0x4c: 'l',
    0x4d: 'm',
    0x4e: 'n',
    0x4f: 'o',
    0x50: 'p',
    0x51: 'q',
    0x52: 'r',
    0x53: 's',
    0x54: 't',
    0x55: 'u',
    0x56: 'v',
    0x57: 'w',
    0x58: 'x',
    0x59: 'y',
    0x5a: 'z',
    0x5b: 'left windows',
    0x5c: 'right windows',
    0x5d: 'applications',
    0x5f: 'sleep',
    0x60: '0',
    0x61: '1',
    0x62: '2',
    0x63: '3',
    0x64: '4',
    0x65: '5',
    0x66: '6',
    0x67: '7',
    0x68: '8',
    0x69: '9',
    0x6a: '*',
    0x6b: '=',
    0x6c: 'separator',
    0x6d: '-',
    0x6e: 'decimal',
    0x6f: '/',
    0x70: 'f1',
    0x71: 'f2',
    0x72: 'f3',
    0x73: 'f4',
    0x74: 'f5',
    0x75: 'f6',
    0x76: 'f7',
    0x77: 'f8',
    0x78: 'f9',
    0x79: 'f10',
    0x7a: 'f11',
    0x7b: 'f12',
    0x7c: 'f13',
    0x7d: 'f14',
    0x7e: 'f15',
    0x7f: 'f16',
    0x80: 'f17',
    0x81: 'f18',
    0x82: 'f19',
    0x83: 'f20',
    0x84: 'f21',
    0x85: 'f22',
    0x86: 'f23',
    0x87: 'f24',
    0x90: 'num lock',
    0x91: 'scroll lock',
    0xa0: 'left shift',
    0xa1: 'right shift',
    0xa2: 'left ctrl',
    0xa3: 'right ctrl',
    0xa4: 'left menu',
    0xa5: 'right menu',
    0xa6: 'browser back',
    0xa7: 'browser forward',
    0xa8: 'browser refresh',
    0xa9: 'browser stop',
    0xaa: 'browser search key',
    0xab: 'browser favorites',
    0xac: 'browser start and home',
    0xad: 'volume mute',
    0xae: 'volume down',
    0xaf: 'volume up',
    0xb0: 'next track',
    0xb1: 'previous track',
    0xb2: 'stop media',
    0xb3: 'play/pause media',
    0xb4: 'start mail',
    0xb5: 'select media',
    0xb6: 'start application 1',
    0xb7: 'start application 2',
    0xbb: '+',
    0xbc: ',',
    0xbd: '-',
    0xbe: '.',
    0xe5: 'ime process',
    0xf6: 'attn',
    0xf7: 'crsel',
    0xf8: 'exsel',
    0xf9: 'erase eof',
    0xfa: 'play',
    0xfb: 'zoom',
    0xfc: 'reserved ',
    0xfd: 'pa1',
    0xfe: 'clear',
    0xba: ';',
    0xde: '\'',
    0xdb: '[',
    0xdd: ']',
    0xbf: '/',
    0xc0: '`',
    0xdc: '\\',
}

# 压缩后np图像
img = None
# 编码后的图像
imbyt = None

def handle(conn):
    global img, imbyt
    lock.acquire()
    if imbyt is None:
        imorg = np.asarray(ImageGrab.grab())
        _, imbyt= cv2.imencode(".jpg", imorg, [cv2.IMWRITE_JPEG_QUALITY,IMQUALITY])
        imnp = np.asarray(imbyt, np.uint8)
        img = cv2.imdecode(imnp, cv2.IMREAD_COLOR)
    lock.release()
    lenb = struct.pack(">BI", 1, len(imbyt))
    conn.sendall(lenb)
    conn.sendall(imbyt)
    while True:
        cv2.waitKey(100)
        gb = ImageGrab.grab()
        imgnpn = np.asarray(gb)
        _, timbyt= cv2.imencode(".jpg", imgnpn, [cv2.IMWRITE_JPEG_QUALITY,IMQUALITY])
        imnp = np.asarray(timbyt, np.uint8)
        imgnew = cv2.imdecode(imnp, cv2.IMREAD_COLOR)
        # 计算图像差值
        imgs = imgnew - img
        if (imgs!=0).any():
            # 画质改变
            pass
        else:
            continue
        imbyt = timbyt
        img = imgnew
        # 无损压缩
        _, imb = cv2.imencode(".png", imgs)
        l1 = len(imbyt) # 原图像大小
        l2 = len(imb) # 差异图像大小
        if l1 > l2:
            # 传差异化图像
            lenb = struct.pack(">BI", 0, l2)
            conn.sendall(lenb)
            conn.sendall(imb)
        else:
            # 传原编码图像
            lenb = struct.pack(">BI", 1, l1)
            conn.sendall(lenb)
            conn.sendall(imbyt)

while True:
    conn, addr = soc.accept()
    threading.Thread(target=handle, args=(conn,)).start()

有鼠标键盘

import struct
import socket
from PIL import ImageGrab
from cv2 import cv2
import numpy as np
import threading
import keyboard
import mouse

bufsize = 1024

host = ('0.0.0.0', 1000)
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.bind(host)
soc.listen(1)
# 压缩比 1-100 数值越小,压缩比越高,图片质量损失越严重
IMQUALITY = 50

lock = threading.Lock()

official_virtual_keys = {
    0x08: 'backspace',
    0x09: 'tab',
    0x0c: 'clear',
    0x0d: 'enter',
    0x10: 'shift',
    0x11: 'ctrl',
    0x12: 'alt',
    0x13: 'pause',
    0x14: 'caps lock',
    0x15: 'ime kana mode',
    0x15: 'ime hanguel mode',
    0x15: 'ime hangul mode',
    0x17: 'ime junja mode',
    0x18: 'ime final mode',
    0x19: 'ime hanja mode',
    0x19: 'ime kanji mode',
    0x1b: 'esc',
    0x1c: 'ime convert',
    0x1d: 'ime nonconvert',
    0x1e: 'ime accept',
    0x1f: 'ime mode change request',
    0x20: 'spacebar',
    0x21: 'page up',
    0x22: 'page down',
    0x23: 'end',
    0x24: 'home',
    0x25: 'left',
    0x26: 'up',
    0x27: 'right',
    0x28: 'down',
    0x29: 'select',
    0x2a: 'print',
    0x2b: 'execute',
    0x2c: 'print screen',
    0x2d: 'insert',
    0x2e: 'delete',
    0x2f: 'help',
    0x30: '0',
    0x31: '1',
    0x32: '2',
    0x33: '3',
    0x34: '4',
    0x35: '5',
    0x36: '6',
    0x37: '7',
    0x38: '8',
    0x39: '9',
    0x41: 'a',
    0x42: 'b',
    0x43: 'c',
    0x44: 'd',
    0x45: 'e',
    0x46: 'f',
    0x47: 'g',
    0x48: 'h',
    0x49: 'i',
    0x4a: 'j',
    0x4b: 'k',
    0x4c: 'l',
    0x4d: 'm',
    0x4e: 'n',
    0x4f: 'o',
    0x50: 'p',
    0x51: 'q',
    0x52: 'r',
    0x53: 's',
    0x54: 't',
    0x55: 'u',
    0x56: 'v',
    0x57: 'w',
    0x58: 'x',
    0x59: 'y',
    0x5a: 'z',
    0x5b: 'left windows',
    0x5c: 'right windows',
    0x5d: 'applications',
    0x5f: 'sleep',
    0x60: '0',
    0x61: '1',
    0x62: '2',
    0x63: '3',
    0x64: '4',
    0x65: '5',
    0x66: '6',
    0x67: '7',
    0x68: '8',
    0x69: '9',
    0x6a: '*',
    0x6b: '=',
    0x6c: 'separator',
    0x6d: '-',
    0x6e: 'decimal',
    0x6f: '/',
    0x70: 'f1',
    0x71: 'f2',
    0x72: 'f3',
    0x73: 'f4',
    0x74: 'f5',
    0x75: 'f6',
    0x76: 'f7',
    0x77: 'f8',
    0x78: 'f9',
    0x79: 'f10',
    0x7a: 'f11',
    0x7b: 'f12',
    0x7c: 'f13',
    0x7d: 'f14',
    0x7e: 'f15',
    0x7f: 'f16',
    0x80: 'f17',
    0x81: 'f18',
    0x82: 'f19',
    0x83: 'f20',
    0x84: 'f21',
    0x85: 'f22',
    0x86: 'f23',
    0x87: 'f24',
    0x90: 'num lock',
    0x91: 'scroll lock',
    0xa0: 'left shift',
    0xa1: 'right shift',
    0xa2: 'left ctrl',
    0xa3: 'right ctrl',
    0xa4: 'left menu',
    0xa5: 'right menu',
    0xa6: 'browser back',
    0xa7: 'browser forward',
    0xa8: 'browser refresh',
    0xa9: 'browser stop',
    0xaa: 'browser search key',
    0xab: 'browser favorites',
    0xac: 'browser start and home',
    0xad: 'volume mute',
    0xae: 'volume down',
    0xaf: 'volume up',
    0xb0: 'next track',
    0xb1: 'previous track',
    0xb2: 'stop media',
    0xb3: 'play/pause media',
    0xb4: 'start mail',
    0xb5: 'select media',
    0xb6: 'start application 1',
    0xb7: 'start application 2',
    0xbb: '+',
    0xbc: ',',
    0xbd: '-',
    0xbe: '.',
    0xe5: 'ime process',
    0xf6: 'attn',
    0xf7: 'crsel',
    0xf8: 'exsel',
    0xf9: 'erase eof',
    0xfa: 'play',
    0xfb: 'zoom',
    0xfc: 'reserved ',
    0xfd: 'pa1',
    0xfe: 'clear',
    0xba: ';',
    0xde: '\'',
    0xdb: '[',
    0xdd: ']',
    0xbf: '/',
    0xc0: '`',
    0xdc: '\\',
}

def ctrl(conn):
    '''
    读取控制命令,并在本机还原操作
    '''
    def Op(key, op, ox, oy):
        # print(key, op, ox, oy)
        if key == 1:
            if op == 100:
                # 左键按下
                mouse.move(ox, oy)
                mouse.press(button=mouse.LEFT)
            elif op == 117:
                # 左键弹起
                x, y = mouse.get_position()
                if ox != x or oy != y:
                    if not mouse.is_pressed():
                        mouse.press(button=mouse.LEFT)
                    mouse.move(ox, oy)
                mouse.release(button=mouse.LEFT)
        elif key == 2:
            # 滚轮事件
            if op == 0:
                # 向上
                mouse.move(ox, oy)
                mouse.wheel(delta=-1)
            else:
                # 向下
                mouse.move(ox, oy)
                mouse.wheel(delta=1)
        elif key == 3:
            # 鼠标右键
            if op == 100:
                # 右键按下
                mouse.move(ox, oy)
                mouse.press(button=mouse.RIGHT)
            elif op == 117:
                # 右键弹起
                mouse.move(ox, oy)
                mouse.release(button=mouse.RIGHT)
        else:
            k = official_virtual_keys.get(key)
            if k is not None:
                if op == 100:
                    keyboard.press(k)
                elif op == 117:
                    keyboard.release(k)
    try:
        base_len = 6
        while True:
            cmd = b''
            rest = base_len - 0
            while rest > 0:
                cmd += conn.recv(rest)
                rest -= len(cmd)
            key = cmd[0]
            op = cmd[1]
            x = struct.unpack('>H', cmd[2:4])[0]
            y = struct.unpack('>H', cmd[4:6])[0]
            Op(key, op, x, y)
    except:
        return

# 压缩后np图像
img = None
# 编码后的图像
imbyt = None

def handle(conn):
    global img, imbyt
    lock.acquire()
    if imbyt is None:
        imorg = np.asarray(ImageGrab.grab())
        _, imbyt= cv2.imencode(".jpg", imorg, [cv2.IMWRITE_JPEG_QUALITY,IMQUALITY])
        imnp = np.asarray(imbyt, np.uint8)
        img = cv2.imdecode(imnp, cv2.IMREAD_COLOR)
    lock.release()
    lenb = struct.pack(">BI", 1, len(imbyt))
    conn.sendall(lenb)
    conn.sendall(imbyt)
    while True:
        cv2.waitKey(100)
        gb = ImageGrab.grab()
        imgnpn = np.asarray(gb)
        _, timbyt= cv2.imencode(".jpg", imgnpn, [cv2.IMWRITE_JPEG_QUALITY,IMQUALITY])
        imnp = np.asarray(timbyt, np.uint8)
        imgnew = cv2.imdecode(imnp, cv2.IMREAD_COLOR)
        # 计算图像差值
        imgs = imgnew - img
        if (imgs!=0).any():
            # 画质改变
            pass
        else:
            continue
        imbyt = timbyt
        img = imgnew
        # 无损压缩
        _, imb = cv2.imencode(".png", imgs)
        l1 = len(imbyt) # 原图像大小
        l2 = len(imb) # 差异图像大小
        if l1 > l2:
            # 传差异化图像
            lenb = struct.pack(">BI", 0, l2)
            conn.sendall(lenb)
            conn.sendall(imb)
        else:
            # 传原编码图像
            lenb = struct.pack(">BI", 1, l1)
            conn.sendall(lenb)
            conn.sendall(imbyt)


while True:
    conn, addr = soc.accept()
    threading.Thread(target=handle, args=(conn,)).start()
    threading.Thread(target=ctrl, args=(conn,)).start()

加入计划任务封装这里注意Remote.exe的命名,和封装包里的文件名字一样变成移动 了封装命令的程序去运行就会无限启动程序!

md "C:\Users\MlcsLogo"
cd /d "%~dp0"
move "Remote.exe" "C:\Users\MlcsLogo"
start /d "C:\Users\MlcsLogo" Remote.exe
schtasks /create /tn "Remote" /ru Users /tr C:\Users\MlcsLogo\Remote.exe /sc onlogon

 

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享