Browse Source

first commit

bruceyong 2 years ago
commit
8dcf14964d
15 changed files with 734 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 5 0
      CommandMessage.py
  3. 33 0
      ComputerMonitor.py
  4. 46 0
      Controller.py
  5. 46 0
      Controller.pyw
  6. 31 0
      CyberSocket.py
  7. 78 0
      KeyboardListener.py
  8. 193 0
      KeyboardManager.py
  9. 117 0
      TcpServer.py
  10. 20 0
      Unlocker.py
  11. 0 0
      cybercontroller.bat
  12. 46 0
      out.py
  13. 90 0
      screen_shot.py
  14. 5 0
      service.py
  15. 23 0
      test.py

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+/__pycache__

+ 5 - 0
CommandMessage.py

@@ -0,0 +1,5 @@
+class CommandMessage:
+	def __init__(self,command,message):
+		self.command = command
+		self.message = message
+	

+ 33 - 0
ComputerMonitor.py

@@ -0,0 +1,33 @@
+import threading
+from ctypes import *
+import time
+import subprocess
+
+class ComputerMonitor:
+	def __init__(self, callback):
+		self.callback = callback
+		self.started = False
+
+	def monitor(self):
+		self.monit_windows_lock()
+
+	def monit_windows_lock(self):
+		while True:
+			process_name='LogonUI.exe'
+			callall='TASKLIST'
+			outputall=subprocess.check_output(callall)
+			outputstringall=str(outputall)
+			if process_name in outputstringall:
+				print("Locked.")
+				if self.callback:
+					self.callback()
+			else: 
+			   pass
+			   
+			time.sleep(1)
+
+	def start(self):
+		monitor_threading = threading.Thread(target=self.monitor, args=())
+		monitor_threading.start()
+		self.started = True
+		

+ 46 - 0
Controller.py

@@ -0,0 +1,46 @@
+import threading
+from TcpServer import TcpServer
+from KeyboardListener import KeyboardListener
+from service import *
+from ComputerMonitor import ComputerMonitor
+from CommandMessage import CommandMessage;
+import json
+import pyautogui
+from KeyboardManager import *
+import time
+
+
+def on_message_received(data):
+	command_message = json.loads(data)
+	script = command_message["script"]
+	params = command_message["params"]
+	exec(script)
+
+def on_screen_locked():
+	print("screen locked")
+	data = json.dumps({"command":2,"message":""})
+	print(data)
+	tcpServer.send_text(data)
+
+computerMonitor = ComputerMonitor(on_screen_locked)
+
+def on_tcp_connected():
+	if not computerMonitor.started:
+		computerMonitor.start()
+
+
+tcpServer = TcpServer()
+tcpServer.set_receive_listener(on_message_received)
+tcpServer.connected_listener = on_tcp_connected
+tcpServer.start()
+
+keyboardListener = KeyboardListener(tcpServer)
+
+def onTrans():
+	print("need trans")
+	content = getClipContent()
+	text = json.dumps({"command":1,"message":content})
+
+	tcpServer.send_text(text)
+
+keyboardListener.listen_keyboard(onTrans)

+ 46 - 0
Controller.pyw

@@ -0,0 +1,46 @@
+aAimport threading
+from TcpServer import TcpServer
+from KeyboardListener import KeyboardListener
+from service import *
+from ComputerMonitor import ComputerMonitor
+from CommandMessage import CommandMessage;
+import json
+import pyautogui
+from KeyboardManager import *
+import time
+
+
+def on_message_received(data):
+	command_message = json.loads(data)
+	script = command_message["script"]
+	params = command_message["params"]
+	exec(script)
+
+def on_screen_locked():
+	print("screen locked")
+	data = json.dumps({"command":2,"message":""})
+	print(data)
+	tcpServer.send_text(data)
+
+computerMonitor = ComputerMonitor(on_screen_locked)
+
+def on_tcp_connected():
+	if not computerMonitor.started:
+		computerMonitor.start()
+
+
+tcpServer = TcpServer()
+tcpServer.set_receive_listener(on_message_received)
+tcpServer.connected_listener = on_tcp_connected
+tcpServer.start()
+
+keyboardListener = KeyboardListener(tcpServer)
+
+def onTrans():
+	print("need trans")
+	content = getClipContent()
+	text = json.dumps({"command":1,"message":content})
+
+	tcpServer.send_text(text)
+
+keyboardListener.listen_keyboard(onTrans)

+ 31 - 0
CyberSocket.py

@@ -0,0 +1,31 @@
+import socketserver
+import socket
+
+class CyberSocketServer(socketserver.BaseRequestHandler):	
+	def handle(self):
+		print("connection from",self.client_address)
+		while True:
+			data = self.request.recv(2048)
+			if not data:
+				break
+			print('recv:', data)
+
+class CyberSocket:
+	def __init__(self):
+		pass
+
+	def start(self):
+		hostname= socket.gethostname()#获取本地主机名
+		sysinfo = socket.gethostbyname_ex(hostname)
+		hostip=sysinfo[2][2]
+		self.server = socketserver.ThreadingTCPServer((hostip, 2233), CyberSocketServer)
+		print("server created")
+		self.server.serve_forever()
+	def send_data(self,data):
+		request, client_address = self.server.get_request()
+		data = data+"\n"
+		print(data)
+		request.sendall(data.encode())
+
+
+

+ 78 - 0
KeyboardListener.py

@@ -0,0 +1,78 @@
+import keyboard
+import time
+from screen_shot import ScreenCapture
+import io
+
+class KeyboardListener:
+	def __init__(self, tcpServer):
+		self.tcpServer = tcpServer
+		self.t = 0
+		self.c = 0
+		self.key_state_map={}
+		self.screen_capture = None
+		
+	def listen_keyboard(self,callback):
+		self.callback = callback
+		keyboard.hook(self.onKeyEvent)
+		keyboard.wait()
+
+	def onImgCapture(self,pic):	
+		imgByteArr = io.BytesIO()
+		pic.save(imgByteArr, format='JPEG')
+		bytes_data = imgByteArr.getvalue()
+		self.tcpServer.send_img(bytes_data)
+
+	def isCtrlHolding(self):
+		return ('ctrl' in self.key_state_map and self.key_state_map['ctrl']=='down')\
+			or ('left ctrl' in self.key_state_map and self.key_state_map['left ctrl']=='down')\
+			or ('right ctrl' in self.key_state_map and self.key_state_map['right ctrl']=='down')
+
+	def isAltHolding(self):
+		return ('alt' in self.key_state_map and self.key_state_map['alt']=='down')\
+			or ('left alt' in self.key_state_map and self.key_state_map['left alt']=='down')\
+			or ('right alt' in self.key_state_map and self.key_state_map['right alt']=='down')
+
+	def isKeyHolding(self,key):
+		return (key in self.key_state_map and self.key_state_map[key]=='down')
+
+
+	def onKeyEvent(self,key):
+		#update key_state_map
+		self.key_state_map[key.name.lower()]=key.event_type
+
+		#is screenshoot?
+
+		if  self.isKeyHolding("caps lock")\
+			and key.event_type=="down"\
+			and key.name.lower()=="a":
+			self.screen_capture = ScreenCapture()
+			self.screen_capture.are_capture(self.onImgCapture)
+
+		print(self.key_state_map)
+		#is triple c?
+		if  key.event_type=="down" \
+			and key.name.lower()=="c" \
+			and self.isCtrlHolding():
+
+			if self.t == 0:
+				self.t=time.time()
+				self.c += 1
+				print("wait for nex c",self.c)
+				return
+
+			if (time.time()-self.t<0.5):
+				self.t=time.time()
+				self.c += 1
+				print("wait for nex c:",self.c)
+
+			else:
+				self.c = 0
+				self.t=0
+				print("wait for nex c",self.c)
+
+			if self.c>=2:
+				self.c=0
+				print("need trans")
+				if self.callback:
+					self.callback()
+

+ 193 - 0
KeyboardManager.py

@@ -0,0 +1,193 @@
+import win32api
+import win32con
+import time
+import pyautogui
+import pyperclip
+key_map={
+    'backspace':0x08,
+    'tab':0x09,
+    'clear':0x0C,
+    'enter':0x0D,
+    'shift':0x10,
+    'ctrl':0x11,
+    'alt':0x12,
+    'pause':0x13,
+    'caps_lock':0x14,
+    'esc':0x1B,
+    'spacebar':0x20,
+    'page_up':0x21,
+    'page_down':0x22,
+    'end':0x23,
+    'home':0x24,
+    'left_arrow':0x25,
+    'up_arrow':0x26,
+    'right_arrow':0x27,
+    'down_arrow':0x28,
+    'select':0x29,
+    'print':0x2A,
+    'execute':0x2B,
+    'print_screen':0x2C,
+    'ins':0x2D,
+    'del':0x2E,
+    'help':0x2F,
+    '0':0x30,
+    '1':0x31,
+    '2':0x32,
+    '3':0x33,
+    '4':0x34,
+    '5':0x35,
+    '6':0x36,
+    '7':0x37,
+    '8':0x38,
+    '9':0x39,
+    'a':0x41,
+    'b':0x42,
+    'c':0x43,
+    'd':0x44,
+    'e':0x45,
+    'f':0x46,
+    'g':0x47,
+    'h':0x48,
+    'i':0x49,
+    'j':0x4A,
+    'k':0x4B,
+    'l':0x4C,
+    'm':0x4D,
+    'n':0x4E,
+    'o':0x4F,
+    'p':0x50,
+    'q':0x51,
+    'r':0x52,
+    's':0x53,
+    't':0x54,
+    'u':0x55,
+    'v':0x56,
+    'w':0x57,
+    'x':0x58,
+    'y':0x59,
+    'z':0x5A,
+    'win':0x5B,
+    'numpad_0':0x60,
+    'numpad_1':0x61,
+    'numpad_2':0x62,
+    'numpad_3':0x63,
+    'numpad_4':0x64,
+    'numpad_5':0x65,
+    'numpad_6':0x66,
+    'numpad_7':0x67,
+    'numpad_8':0x68,
+    'numpad_9':0x69,
+    'multiply_key':0x6A,
+    'add_key':0x6B,
+    'separator_key':0x6C,
+    'subtract_key':0x6D,
+    'decimal_key':0x6E,
+    'divide_key':0x6F,
+    'F1':0x70,
+    'F2':0x71,
+    'F3':0x72,
+    'F4':0x73,
+    'F5':0x74,
+    'F6':0x75,
+    'F7':0x76,
+    'F8':0x77,
+    'F9':0x78,
+    'F10':0x79,
+    'F11':0x7A,
+    'F12':0x7B,
+    'F13':0x7C,
+    'F14':0x7D,
+    'F15':0x7E,
+    'F16':0x7F,
+    'F17':0x80,
+    'F18':0x81,
+    'F19':0x82,
+    'F20':0x83,
+    'F21':0x84,
+    'F22':0x85,
+    'F23':0x86,
+    'F24':0x87,
+    'num_lock':0x90,
+    'scroll_lock':0x91,
+    'left_shift':0xA0,
+    'right_shift ':0xA1,
+    'left_control':0xA2,
+    'right_control':0xA3,
+    'left_menu':0xA4,
+    'right_menu':0xA5,
+    'browser_back':0xA6,
+    'browser_forward':0xA7,
+    'browser_refresh':0xA8,
+    'browser_stop':0xA9,
+    'browser_search':0xAA,
+    'browser_favorites':0xAB,
+    'browser_start_and_home':0xAC,
+    'volume_mute':0xAD,
+    'volume_Down':0xAE,
+    'volume_up':0xAF,
+    'next_track':0xB0,
+    'previous_track':0xB1,
+    'stop_media':0xB2,
+    'play/pause_media':0xB3,
+    'start_mail':0xB4,
+    'select_media':0xB5,
+    'start_application_1':0xB6,
+    'start_application_2':0xB7,
+    'attn_key':0xF6,
+    'crsel_key':0xF7,
+    'exsel_key':0xF8,
+    'play_key':0xFA,
+    'zoom_key':0xFB,
+    'clear_key':0xFE,
+    '+':0xBB,
+    ',':0xBC,
+    '-':0xBD,
+    '.':0xBE,
+    '/':0xBF,
+    '`':0xC0,
+    ';':0xBA,
+    '[':0xDB,
+    '\\':0xDC,
+    ']':0xDD,
+    "'":0xDE,
+    '`':0xC0
+ }
+
+def key_down(key):
+    vk_code = key_map[key]
+    win32api.keybd_event(vk_code, win32api.MapVirtualKey(vk_code, 0), 0, 0)
+
+
+def key_up(key):
+    vk_code = key_map[key]
+    win32api.keybd_event(vk_code, win32api.MapVirtualKey(vk_code, 0), win32con.KEYEVENTF_KEYUP, 0)
+
+
+def key_press(key, sleep_time=0.02):
+    key_down(key)
+    time.sleep(sleep_time)
+    key_up(key)
+
+# time.sleep(3)
+# key_down("alt")
+# key_down("h")
+# key_press("f")
+# key_press("c")
+# key_up("alt")
+# key_up("h")
+# key_press("down_arrow",sleep_time=0)
+# key_press("down_arrow",sleep_time=0)
+# key_press("down_arrow",sleep_time=0)
+# key_press("down_arrow",sleep_time=0)
+# key_press("down_arrow",sleep_time=0)
+# key_press("down_arrow",sleep_time=0)
+# key_press("right_arrow",sleep_time=0)
+
+# key_press("enter")
+
+# # 输入 a
+# #key_press("a")
+
+# key_press('enter')
+# key_press('a')
+

+ 117 - 0
TcpServer.py

@@ -0,0 +1,117 @@
+import socket
+import threading
+import json
+
+class TcpServer:
+    def __init__(self):
+        self.port=2233#设置端口
+        self.HEAD_LEN=8
+        self.tcpServerSocket=socket.socket()#创建socket对象
+        hostname= socket.gethostname()#获取本地主机名
+        sysinfo = socket.gethostbyname_ex(hostname)
+        hostip=sysinfo[2][2]
+        self.tcpServerSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#让端口可以复用
+        self.tcpServerSocket.bind((hostip,self.port))#将地址与套接字绑定,且套接字要求是从未被绑定过的
+        self.tcpServerSocket.listen(5)#代办事件中排队等待connect的最大数目
+
+    def set_receive_listener(self,receive_listener):
+        self.receive_listener = receive_listener
+    def server(self):
+        while True:
+            print("等待连接")
+            self.clientSocket, addr = self.tcpServerSocket.accept()  
+            print ('连接地址:', addr)
+            if self.connected_listener:
+                self.connected_listener()
+            while True:
+                try:
+                    head_data=self.clientSocket.recv(self.HEAD_LEN)
+                    if not len(head_data)==8:
+                        print("bad package!head_data len:",head_data)
+                        self.restart()
+                        return
+                    body_len = self.get_length_from_head_data(head_data)
+                    body_data = self.clientSocket.recv(body_len)
+                    if not body_len==len(body_data):
+                        print("bad package!body_len:",body_len)
+                        self.restart()
+                        return
+                    data_type = self.get_type_from_head_data(head_data)
+
+                    if data_type == 1:#test/json data
+                        text = body_data.decode()
+                        print(text)
+                        if not text:
+                            break
+                        if self.receive_listener:
+                            self.receive_listener(text)
+                    elif data_type == 2:#image data
+                        pass
+
+                except ConnectionResetError:
+                    print("ConnectionResetError!")
+                    self.restart()
+                    return
+                
+               
+            self.clientSocket.close() # 关闭连接
+        self.tcpServerSocket.close()
+
+    def get_length_from_head_data(self,head_data):
+        if(not len(head_data)==8):
+            return
+        ch1 = head_data[4] & 0x00FF;
+        ch2 = head_data[5] & 0x00FF;
+        ch3 = head_data[6] & 0x00FF;
+        ch4 = head_data[7] & 0x00FF;
+        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
+
+    def get_type_from_head_data(self,head_data):
+        if(not len(head_data)==8):
+            return
+        ch1 = head_data[0] & 0x00FF;
+        ch2 = head_data[1] & 0x00FF;
+        ch3 = head_data[2] & 0x00FF;
+        ch4 = head_data[3] & 0x00FF;
+        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
+
+
+    def start(self): 
+        self.server_threading = threading.Thread(target=self.server, args=())
+        self.server_threading.start()
+
+    def restart(self):
+        self.start()
+
+    def send_data(self, data):
+        try:
+            self.clientSocket.send(data)
+        except ConnectionResetError:
+            print("ConnectionResetError!")
+            self.restart()
+    def send_img(self, bytes_data):
+        data = self.wrapper_data(2,bytes_data)
+        self.send_data(data)
+  
+    def send_text(self, text):
+        data = self.wrapper_data(1,text.encode())
+        self.send_data(data)
+    
+    def wrapper_data(self,data_type,body_data):
+
+        print("data_type:",data_type)
+        print("body_data len:",len(body_data))
+
+
+        type_bytes=data_type.to_bytes(4,'big')
+        print("type_bytes:",type_bytes)
+        body_len = len(body_data)
+
+        body_len_bytes = body_len.to_bytes(4,'big')
+        print("body_len_bytes:",body_len_bytes)
+
+        head_data = type_bytes + body_len_bytes
+        print("head_data:",head_data)
+
+        data = head_data+body_data
+        return data

+ 20 - 0
Unlocker.py

@@ -0,0 +1,20 @@
+from ctypes import *
+import time
+# while True:
+#     u = windll.LoadLibrary('user32.dll')
+#     result = u.GetForegroundWindow()
+#     print(result) # 0则表示锁屏
+#     time.sleep(2)
+
+
+import pyautogui
+pyautogui.FAILSAFE=False
+time.sleep(5)
+pyautogui.press('enter') # enter to login.
+
+#pyautogui.click(1025,513, 2) # click to show the password box
+time.sleep(1)
+pyautogui.typewrite("Asdfghjkl;'",2) # Type the password
+pyautogui.press('enter') # enter to login.
+time.sleep(2)
+

+ 0 - 0
cybercontroller.bat


+ 46 - 0
out.py

@@ -0,0 +1,46 @@
+import socket
+import threading
+import json
+
+class TcpServer:
+    def __init__(self):
+        self.port=2233#设置端口
+        self.HEAD_LEN=8
+        self.tcpServerSocket=socket.socket()#创建socket对象
+        hostname= socket.gethostname()#获取本地主机名
+        sysinfo = socket.gethostbyname_ex(hostname)
+        hostip=sysinfo[2][2]
+        self.tcpServerSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#让端口可以复用
+        self.tcpServerSocket.bind((hostip,self.port))#将地址与套接字绑定,且套接字要求是从未被绑定过的
+        self.tcpServerSocket.listen(5)#代办事件中排队等待connect的最大数目
+
+    def set_receive_listener(self,receive_listener):
+        self.receive_listener = receive_listener
+    def server(self):
+        while True:
+            print("等待连接")
+            self.clientSocket, addr = self.tcpServerSocket.accept()  
+            print ('连接地址:', addr)
+            if self.connected_listener:
+                self.connected_listener()
+            while True:
+                try:
+                    head_data=self.clientSocket.recv(self.HEAD_LEN)
+                    if not len(head_data)==8:
+                        print("bad package!head_data len:",head_data)
+                        self.restart()
+                        return
+                    body_len = self.get_length_from_head_data(head_data)
+                    body_data = self.clientSocket.recv(body_len)
+                    if not body_len==len(body_data):
+                        print("bad package!body_len:",body_len)
+                        self.restart()
+                        return
+                    data_type = self.get_type_from_head_data(head_data)
+
+                    if data_type == 1:#test/json data
+                        text = body_data.decode()
+                        print(text)
+                        if not text:
+                            break
+                        if self.receive_listene

+ 90 - 0
screen_shot.py

@@ -0,0 +1,90 @@
+# -*- coding:utf-8 -*-  
+import tkinter
+import tkinter.filedialog
+import os
+from PIL import ImageGrab
+from time import sleep
+from tkinter import StringVar, IntVar
+
+class ScreenCapture:
+
+    def __init__(self):
+        pass
+    def start(self):
+        self.root = tkinter.Tk()
+        self.root.geometry('0x0+0+0')
+        self.root.resizable(False, False)
+        self.X = tkinter.IntVar(value=0)
+        self.Y = tkinter.IntVar(value=0)
+        
+        self.selectPosition=None
+        screenWidth = self.root.winfo_screenwidth()
+        screenHeight = self.root.winfo_screenheight()
+        self.top = tkinter.Toplevel(self.root, width=screenWidth, height=screenHeight)
+        self.top.overrideredirect(True)
+        self.canvas = tkinter.Canvas(self.top,bg='white', width=screenWidth, height=screenHeight)
+        self.p_w_picpath = tkinter.PhotoImage(file=self.filename)
+        self.canvas.create_image(screenWidth//2, screenHeight//2, image=self.p_w_picpath)
+        def onLeftButtonDown(event):
+            self.X.set(event.x)
+            self.Y.set(event.y)
+            #开始截图
+            self.sel = True
+        self.canvas.bind('<Button-1>', onLeftButtonDown)
+
+        def onLeftButtonMove(event):
+            if not self.sel:
+                return
+            global lastDraw
+            try:
+                self.canvas.delete(lastDraw)
+            except Exception as e:
+                pass
+            lastDraw = self.canvas.create_rectangle(self.X.get(), self.Y.get(), event.x, event.y, outline='red',width=8)
+        self.canvas.bind('<B1-Motion>', onLeftButtonMove)
+
+        def onLeftButtonUp(event):
+            self.sel = False
+            try:
+                self.canvas.delete(lastDraw)
+            except Exception as e:
+                pass
+            #sleep(0.1)
+            myleft, myright = sorted([self.X.get(), event.x])
+            mytop, mybottom = sorted([self.Y.get(), event.y])
+            self.selectPosition=(myleft,myright,mytop,mybottom)
+            pic = ImageGrab.grab((myleft+1, mytop+1, myright, mybottom))
+            self.destroy()
+            if self.callback:
+                self.callback(pic)
+            
+        self.canvas.bind('<ButtonRelease-1>', onLeftButtonUp)
+        self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)
+
+    def destroy(self):
+        self.top.destroy()
+        self.root.destroy()
+
+    def are_capture(self,callback):
+        self.callback = callback
+        self.filename = 'temp.png'
+        im = ImageGrab.grab()
+        im.save(self.filename)
+        im.close()
+        self.start()
+        self.root.state('icon')
+        os.remove(self.filename)
+        self.root.mainloop()
+
+
+# def are_capture(callback):
+#     filename = 'temp.png'
+#     im = ImageGrab.grab()
+#     im.save(filename)
+#     im.close()
+#     capture = MyCapture(filename)
+#     capture.callback = callback
+#     capture.root.state('icon')
+#     sleep(0.2)
+#     os.remove(filename)
+#     capture.root.mainloop()

+ 5 - 0
service.py

@@ -0,0 +1,5 @@
+import pyperclip
+
+def getClipContent():
+	content = pyperclip.paste()
+	return content

+ 23 - 0
test.py

@@ -0,0 +1,23 @@
+import pyautogui
+import time
+from KeyboardManager import key_press
+time.sleep(2)
+with open('./TcpServer.py', encoding='UTF-8') as f:
+	while True:
+		line = f.readline()
+		if not line:
+			break
+		print(line)
+		#pyautogui.typewrite(line)
+		#key_press("home")
+		for c in line:
+			out = open('out.py','a')
+			out.write(c)
+			out.close()
+			time.sleep(0.001)
+
+	# for line in content:
+	# 	print(line)
+	
+	# print('\n')
+	# pyautogui.typewrite('\n')