Nouvelle API IDA 6.95
Peut-être parce qu'ils ont vu cette question, peut-être à cause des demandes des utilisateurs, la version 6.95 a été publiée avec deux fonctions API IDAPython pour créer un menu et une barre d'outils : create_menu
et create_toolbar
pour que maintenant cela puisse être fait de manière triviale.
Ancien truc - Avant 6.95
Un hack que j'ai utilisé consiste à trouver manuellement la fenêtre principale de l'application, puis à ajouter une barre d'outils directement à l'aide de QT. IDA n'a qu'une seule fenêtre principale.
L'ajout d'une barre d'outils de cette façon rend complètement reconnaissable par IDA pour autant que je sache. Vous pouvez l'activer et le désactiver, vous pouvez l'ancrer et le désancrer, le passage en mode avancé l'affiche également automatiquement. Cependant, IDA ne vous permettra pas d'y ajouter des actions dans IDA 6.7 et versions ultérieures (comme décrit sur hexblog.com/?p=886)
Un exemple de code peut sembler quelque chose comme ça:
pour le widget dans QtGui.qApp.topLevelWidgets (): if type (widget) == QtGui.QMainWindow: mainWindow = widget toolbar = mainWindow.addToolBar ("Ma barre d'outils") # et maintenant pour ajouter des éléments à notre barre d'outils toolbar.addSeparator () toolbar.addWidget (...)
Clause de non-responsabilité: Gardez à l'esprit de trouver la fenêtre principale de cette façon si risqué, sans papiers et pourrait ne pas toujours fonctionner. L'IDA n'aime peut-être pas que vous changiez des choses en dessous. Je l'utilise et ça marche, mais YMMV et UAYOR.
Deux conseils supplémentaires pour rendre ce hack fonctionnel:
- Puisque la fenêtre principale d'IDA n'est pas toujours visible lorsque les plugins sont chargés, vous voudrez peut-être définir un QTimer pour trouver la fenêtre principale.
- Comme il n'est pas documenté, j'utilise plus de moyens pour trouver la fenêtre principale. Utiliser
qApp.activeWindow ()
et / ou qApp.focusWidget ()
et itérer sur leurs .parent ()
sont de bons choix supplémentaires.
MODIFIER:
Voici un exemple plus complet de la façon de pirater une barre d'outils et un menu à partir d'un plugin IDA, gérer différents modes de chargement et réessayer au cas où l'application IDA n'est pas encore entièrement configurée:
def init (self): self.setup () return idaapi.PLUGIN_KEEP def setup (self): sinon self.get_mainwindow (): self.delay_setup () return # Ajouter une barre d'outils comme OP demandé self.toolbar = self. get_mainwindow (). addToolBar ("Ma barre d'outils") self.toolbar.setIconSize (QtCore.QSize (16, 16)) # Bonus: ajoutez un menu self.menu = QtGui.QMenu ("Mon 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: retourne self.mainwindow app = widgets QtGui.qApp = [app.focusWidget (), app.activeWindow ()] + app.topLevelWidgets () mainwidgets = filter (None, map (self.search_mainwindow, widgets)) si 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