import sys from kde import * from packet import * class FilterDlg(QDialog): def __init__(self, parent, name): QDialog.__init__(self, parent, name, 1) self.setGeometry(self.x() + (self.width()-365)/2, self.y() + (self.height()-95)/2, 365, 95) self.ok = QPushButton("OK", self) self.ok.setGeometry(90, 60, 75, 30) self.connect(self.ok, SIGNAL("clicked()"), self.accept) self.cancel = QPushButton("Cancel", self) self.cancel.setGeometry(175, 60, 75, 30) self.connect(self.cancel, SIGNAL("clicked()"), self.reject) self.proto = QComboBox(0, self) self.proto.insertItem("ANY") self.proto.insertItem("TCP") self.proto.insertItem("UDP") self.proto.setGeometry(10, 25, 55, 30) self.w_ip = QComboBox(0, self) self.w_ip.insertItem("ANY") self.w_ip.insertItem("SRC") self.w_ip.insertItem("DST") self.w_ip.setGeometry(75, 25, 55, 30) self.w_port = QComboBox(0, self) self.w_port.insertItem("ANY") self.w_port.insertItem("SRC") self.w_port.insertItem("DST") self.w_port.setGeometry(245, 25, 55, 30) self.ip = QLineEdit(self) self.ip.setMaxLength(15) self.ip.setGeometry(135, 25, 100, 30) self.port = QLineEdit(self) self.port.setMaxLength(5) self.port.setGeometry(305, 25, 50, 30) self.iplabel = QLabel(self.ip, "IP Address", self) self.iplabel.setGeometry(75, 5, 100, 20) self.portlabel = QLabel(self.port, "Port", self) self.portlabel.setGeometry(245, 5, 50, 20) class KSniff(KTMainWindow): ID_FILE_OPEN = 1 ID_FILE_READ = 2 ID_FILE_PREF = 3 ID_FILE_QUIT = 4 ID_FILTER_DEFINE = 5 ID_FILTER_ACTIVE = 6 items = [] def __init__(self,*args): apply(KTMainWindow.__init__,(self,) + args) self.setGeometry(self.x(), self.y(), 800, 400) # self.topLayout = QVBoxLayout(self, 10) self.fileMenu = QPopupMenu() self.fileMenu.insertItem(i18n("&Open File..."), self.ID_FILE_OPEN) self.fileMenu.insertItem(i18n("&Read next 100"), self.ID_FILE_READ) self.fileMenu.insertItem(i18n("&Preferences"), self.ID_FILE_PREF) self.fileMenu.insertSeparator() self.fileMenu.insertItem(i18n("Quit"), kapp.quit, CTRL+Key_Q) self.filterMenu = QPopupMenu() self.filterMenu.setCheckable(1) self.filterMenu.insertItem(i18n("&Define Filter..."), self.ID_FILTER_DEFINE) self.filterMenu.insertItem(i18n("&Active"), self.ID_FILTER_ACTIVE) self.filterMenu.setItemChecked(self.ID_FILTER_ACTIVE, 0) self.menuBar().insertItem(i18n("&File"), self.fileMenu) self.menuBar().insertItem(i18n("Fi<er"), self.filterMenu) # self.menuBar().setGeometry(0, self.y(), self.width() - 3, # self.menuBar().height()) self.connect(self.menuBar(), SIGNAL("activated(int)"), self.slotMenuCallback) # self.enableStatusBar() self.hPanner = KNewPanner(self, "horiz panner", KNewPanner.Orientation.Horizontal, KNewPanner.Units.Percent, 60) self.vPanner = KNewPanner(self.hPanner, "vert panner", KNewPanner.Orientation.Vertical, KNewPanner.Units.Percent, 45) self.vPos, self.hPos = self.vPanner.separatorPos(), self.hPanner.separatorPos() # print "vPos = ", self.vPos, ", hPos = ", self.hPos # self.tabBox = QListView(self.vPanner) self.tabBox.addColumn("Num", -1) self.tabBox.addColumn("Prot", -1) self.tabBox.addColumn("Source IP", -1) self.tabBox.addColumn("SPort", -1) self.tabBox.addColumn("Destination IP", -1) self.tabBox.addColumn("DPort", -1) self.tabBox.setGeometry(5, self.menuBar().y() + self.menuBar().height() + 5, self.width() * self.vPos / 100 - 10, self.height() * self.hPos / 100 - self.menuBar().height() - 10) self.tabBox.setAllColumnsShowFocus(1) # self.tabBox.setFont(QFont("fixed", 10)) self.info = QMultiLineEdit(self.vPanner, "InfoBox") self.info.setFont(QFont("fixed", 10)) # self.info.setReadOnly(1) self.info.setGeometry(self.width()*self.vPos/100+5, self.menuBar().y()+self.menuBar().height()+5, self.width()*(100-self.vPos)/100-10, self.height()*self.hPos/100-self.menuBar().height()-10) self.multi = QMultiLineEdit(self.hPanner, "MultiBox") self.multi.setFont(QFont("fixed", 10)) # self.multi.setReadOnly(1) self.multi.setGeometry(5, self.height()*self.hPos/100+5, self.width()-10, self.height()*(100-self.hPos)/100-10) self.vPanner.activate(self.tabBox, self.info) self.hPanner.activate(self.vPanner, self.multi) self.setView(self.hPanner) self.IPs = [] self.filter = Filter() self.filter.active = 0 self.filter.port = 53 self.filter.which_port = Filter.FILTER_ANY self.loadFile('net.raw') self.readXPackets(100, 0) def slotMenuCallback(self, item): if item == KSniff.ID_FILE_OPEN: print "File -> Open" elif item == KSniff.ID_FILE_READ: self.readXPackets(100, 0) # print "File -> Read = " elif item == KSniff.ID_FILE_PREF: print "File -> Preferences" elif item == self.ID_FILTER_DEFINE: print "Filter -> Define" self.filter_dialog() elif item == self.ID_FILTER_ACTIVE: if (self.filter.active): self.filter.active = 0 else: self.filter.active = 1 self.filterMenu.setItemChecked(self.ID_FILTER_ACTIVE, self.filter.active) self.readXPackets(100, 1) # print "Filter -> Active" def loadFile(self, name): self.file = open(name, "r") self.filename = name self.filepos = 0 def readNextPacket(self, xxx): buf = [] if (xxx): self.p_num = 0 self.IPs = [] i, j, done, mode = 0, 0, 0, 0 packet_num, tmp2 = 0, 0 while done == 0: tmp = self.file.readline() if (len(tmp) == 0): done = done + 1 else: if ((tmp[0] == '#') and (mode == 0)): i, mode = 1, 1 while ((i < len(tmp)) and (tmp[i] != ':')): packet_num = packet_num * 10 + ord(tmp[i]) - ord('0') i = i + 1 continue if ((tmp[0] == '\n') and (mode == 1)): done = done + 1 mode = 2 continue if (mode == 1): i, brk = 0, 0 while ((i < len(tmp)) and (tmp[i] != '\n') and (brk < 2)): if (tmp[i] == ' '): if (tmp[i+1] == ' '): brk = brk + 1 i = i + 3 buf = buf + [tmp2] tmp2 = 0 j = j + 1 else: if ((tmp[i] >= 'A') and (tmp[i] <= 'F')): tmp2 = tmp2 * 16 + ord(tmp[i]) - ord('A') + 10 else: tmp2 = tmp2 * 16 + ord(tmp[i]) - ord('0') i = i + 1 if (len(buf) > 1): del buf[len(buf)-1] if (packet_num < 1): return -1 ip = IP_Packet(buf, packet_num) if self.filter.passesFilter(ip): self.IPs.append(ip) self.p_num = self.p_num + 1 return self.p_num - 1 else: return self.readNextPacket(xxx) def readXPackets(self, num, reset): if (reset): self.file.seek(self.filepos) else: self.filepos = self.file.tell() self.tabBox.clear() self.items = [] for t in range(num): if (t == 0): IPsCount = self.readNextPacket(1) else: IPsCount = self.readNextPacket(0) if (IPsCount >= 0): ip = self.IPs[IPsCount] s1 = ip.source_addr_str() s2 = ip.dest_addr_str() if (ip.protocol() == IP_Packet.TCP): tcp = TCP_Packet(ip.raw, ip.number) self.items.append(QListViewItem(self.tabBox, "%04d" % ip.number, "TCP", s1, "%d" % tcp.source_port(), s2, "%d" % tcp.dest_port())) elif (ip.protocol() == IP_Packet.UDP): udp = UDP_Packet(ip.raw, ip.number) self.items.append(QListViewItem(self.tabBox, "%04d" % ip.number, "UDP", s1, "%d" % udp.source_port(), s2, "%d" % udp.destination_port())) elif (ip.protocol() == IP_Packet.ICMP): self.items.append(QListViewItem(self.tabBox, "%04d" % ip.number, "ICMP", s1, "", s2, "")) else: self.items.append(QListViewItem(self.tabBox, "%04d" % ip.number, "n/a", s1, "", s2, "")) return t def filter_dialog(self): dlg = FilterDlg(self, "name") # dlg.setInfo(self.filter) if (dlg.exec_loop()): print "OK" else: print "Cancel" app = KApplication(sys.argv, "ksniff") widget = KSniff() app.setMainWidget(widget) app.setTopWidget(widget) widget.show() app.exec_loop()