예제 #1
0
파일: gui.py 프로젝트: bitw1ze/Pyxie
    def __init__(self, width=800, height=600):

        QWidget.__init__(self)

        self.proxy = Proxy(config=config, listener=self)
        self.stream_history = []
        self.modifiers = config['modifiers']

        self.init_window(width, height)
        self.init_widgets()
        self.init_signals()
        self.init_data()
예제 #2
0
파일: gui.py 프로젝트: Zaidos/Pyxie
class PyxieGui(QWidget):


    def __init__(self, width=800, height=600):

        QWidget.__init__(self)

        self.listener = PyxieListener(self)
        self.proxy = Proxy(config=config, listener=self.listener)
        self.stream_history = []
        self.modifiers = config['modifiers']

        self.init_window(width, height)
        self.init_widgets()
        self.init_signals()
        self.init_data()

    def init_window(self, width, height):

        self.setWindowTitle('Pyxie')
        self.resize(width, height)
        qr = self.frameGeometry()
        qr.moveCenter(QDesktopWidget().availableGeometry().center())
        self.move(qr.topLeft())
        #self.showMaximized()
        self.show()

    def init_signals(self):

        QObject.connect(self.listener, 
                        SIGNAL('onTrafficReceive'), 
                        self.put_traffic_history)
        QObject.connect(self.listener, 
                        SIGNAL('onConnectionEstablished'),
                        self.put_stream)

    def init_widgets(self):

        tabs = QTabWidget(self)
        tab1 = QWidget(self)
        tab2 = QWidget(self)

        menu_bar = QMenuBar(self)
        file_menu = menu_bar.addMenu('&File')

        open = QAction("Exit", self) 
        save = QAction("Save", self) 
        exit = QAction("Quit", self) 

        file_menu.addAction(open)
        file_menu.addAction(save)
        file_menu.addAction(exit)

        stream_labels = ['client ip', 'client port', 
                         'server ip', 'server port',
                         'protocol', 'created']

        # set up the stream tab
        self.streammodel = QStandardItemModel()
        self.streammodel.setHorizontalHeaderLabels(stream_labels)
        
        self.streamtable = StreamTableView(self)
        self.streamtable.setModel(self.streammodel)
        self.streamtable.setSelectionBehavior(QAbstractItemView.SelectRows)
        
        # create textedit area where traffic goes
        self.stream_dump = QTextEdit(self)

        # create buttons
        self.proxy_btn = QPushButton('Proxy Stopped')
        self.proxy_btn.setCheckable(True)
        self.proxy_btn.clicked[bool].connect(self.toggle_proxy)
        
        # add widgets to stream tab
        stream_tab = QVBoxLayout(tab1)
        stream_tab.addWidget(self.proxy_btn)
        stream_tab.addWidget(self.streamtable)
        stream_tab.addWidget(self.stream_dump)

        # create buttons and add them to hbox widget
        intercept_btn = QPushButton('Intercept', self)
        intercept_btn.setCheckable(True)
        intercept_btn.clicked[bool].connect(self.toggle_intercept)

        forward_btn = QPushButton('Forward', self)
        forward_btn.clicked[bool].connect(self.forward_traffic)

        drop_btn = QPushButton('Drop', self)
        drop_btn.clicked[bool].connect(self.drop_traffic)

        intercept_buttons = QHBoxLayout()
        intercept_buttons.addWidget(intercept_btn)
        intercept_buttons.addWidget(forward_btn)
        intercept_buttons.addWidget(drop_btn)

        # create textedit area where traffic goes
        self.intercept_dump = QTextEdit(self)

        # add widgets to stream tab
        intercept_tab = QVBoxLayout(tab2)
        intercept_tab.addLayout(intercept_buttons)
        intercept_tab.addWidget(self.intercept_dump)

        # add tabs to the tabs widget
        tabs.addTab(tab1, "Streams")
        tabs.addTab(tab2, "Intercept")

        main_layout = QVBoxLayout(self)
        main_layout.addWidget(menu_bar)
        main_layout.addWidget(tabs)

        self.setLayout(main_layout)

    def init_data(self):

        self.interception_on = False
        self.intercept_lock = Lock()
        self.latest_traffic = None
                
    def show_traffic_history(self, stream_id):

        conversation = [h.payload for h in self.stream_history[stream_id]]
        dump = str(b''.join(conversation), 'utf8', 'ignore')
        self.stream_dump.setText(utils.printable_ascii(dump))

    def put_stream(self, stream):

        self.stream_history.append([])

        client_ip, client_port = stream.client.getpeername()
        server_ip, server_port = stream.server.getpeername()
        proto = stream.proto_name
        ts = datetime.fromtimestamp(time()).strftime('%Y-%m-%d %H:%M:%S')

        vals = [client_ip, client_port, server_ip, server_port, proto, ts]
        items = []

        for val in vals:
            item = QStandardItem(str(val))
            item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
            items.append(item)

        self.streammodel.appendRow(items)
        self.streamtable.resizeColumnsToContents()

    def put_traffic_history(self, traffic):

        self.stream_history[traffic.stream.stream_id].append(traffic)
        # TODO: call modifiers with entire record instead of just payload
        payload = self.call_modifiers(traffic.payload)

        if self.interception_on:
            self.intercept_lock.acquire()
            self.latest_traffic = traffic
            self.intercept_dump.setText(str(payload, 'utf8', 'ignore'))
        else:
            traffic.stream.unpause(payload)

    def toggle_proxy(self, active):

        if active:
            self.proxy_btn.setText("Starting Proxy")

            try:
                self.proxy.start()
            except:
                self.proxy_btn.setText("Proxy Failed")
                self.proxy_btn.setChecked(False)
                return

            while not self.proxy.running:
                pass

            self.proxy_btn.setText("Proxy Running")

        else:
            self.proxy.stop()
            self.proxy_btn.setText("Proxy Stopped")

    def toggle_intercept(self, active):

        if self.interception_on:
            self.forward_traffic()

        self.interception_on = not self.interception_on

    def forward_traffic(self):

        if self.interception_on and self.latest_traffic:
            payload = self.intercept_dump.toPlainText()
            self.intercept_dump.setText("")
            self.intercept_lock.release()
            stream = self.latest_traffic.stream
            self.latest_traffic = None
            stream.unpause(payload)

    def drop_traffic(self):

        pass

    def call_modifiers(self, data):

        modified = data
        for m in self.modifiers:
            modified = m.modify(modified)
        return modified