Nuova API IDA 6.95
Forse perché hanno visto questa domanda, forse a causa delle richieste degli utenti, la versione 6.95 è stata rilasciata con due funzioni API IDAPython per la creazione di un menu e una barra degli strumenti : create_menu
e create_toolbar
così ora possono essere fatte banalmente.
Vecchio trucco - Prima di 6.95
Un trucco che ho usato è trovare manualmente la finestra principale dell'applicazione e quindi aggiungere una barra degli strumenti direttamente utilizzando QT. IDA ha solo una finestra principale.
L'aggiunta di una barra degli strumenti in questo modo la rende completamente riconoscibile da IDA per quanto ne so. Puoi attivarlo e disattivarlo, puoi agganciarlo e sbloccarlo, anche il passaggio alla modalità avanzata lo mostra automaticamente. Tuttavia, IDA non ti consente di aggiungere azioni in IDA 6.7 e versioni successive (come descritto su hexblog.com/?p=886)
Un codice di esempio può sembrare qualcosa in questo modo:
per widget in QtGui.qApp.topLevelWidgets (): if type (widget) == QtGui.QMainWindow: mainWindow = widget toolbar = mainWindow.addToolBar ("My toolbar") # e ora per aggiungere elementi alla nostra barra degli strumenti toolbar.addSeparator () toolbar.addWidget (...)
Dichiarazione di non responsabilità: ricorda di trovare la finestra principale in questo modo se rischioso, non documentato e potrebbe non funzionare sempre. A IDA potrebbe non piacere che tu stia cambiando le cose sotto. Lo uso e funziona, ma YMMV e UAYOR.
Due suggerimenti aggiuntivi per rendere funzionale questo hack:
- Poiché la finestra principale di IDA non è sempre visibile quando i plugin sono caricati, potresti voler impostare un QTimer per trovare la finestra principale.
- Poiché non è documentato, utilizzo più modi per trovare la finestra principale. L'uso di
qApp.activeWindow ()
e / o qApp.focusWidget ()
e l'iterazione sui loro .parent ()
sono buone scelte aggiuntive.
MODIFICA:
Ecco un esempio più completo di come hackerare una barra degli strumenti e un menu da un plug-in IDA, gestire diverse modalità di caricamento e ritentare nel caso in cui l'applicazione IDA non sia ancora completamente configurata:
def init (self): self.setup () return idaapi.PLUGIN_KEEP def setup (self): if not self.get_mainwindow (): self.delay_setup () return # Aggiungi una barra degli strumenti come richiesta da OP self.toolbar = self. get_mainwindow (). addToolBar ("La mia barra degli strumenti") self.toolbar.setIconSize (QtCore.QSize (16, 16)) # Bonus: aggiungi un menu self.menu = QtGui.QMenu ("Il mio menu") self.get_mainwindow () .menuWidget (). addMenu (self.menu) def delay_setup (self): QtCore.QTimer.singleShot (1000, self.setup) def get_mainwindow (self): if self.mainwindow: return self.mainwindow app = QtGui.qApp widgets = [app.focusWidget (), app.activeWindow ()] + app.topLevelWidgets () mainwidgets = filter (None, map (self.search_mainwindow, widgets)) if mainwidgets: self.mainwindow = mainwidgets [0] r eturn self.mainwindow def search_mainwindow (self, widget): while widget! = None: if isinstance (widget, QtGui.QMainWindow): return widget widget = widget.parent () return None