Question:
Ajout d'une barre d'outils à IDA à l'aide de PySide
James
2015-10-27 16:28:40 UTC
view on stackexchange narkive permalink

J'essaye donc d'ajouter une barre d'outils personnalisée à IDA 6.4 en utilisant leur téléchargement PySide et l'IDAAPI. J'ai essayé d'ajouter une barre d'outils en en créant simplement une, mais comme elle n'a pas de méthode exec_ (), je ne peux pas l'afficher à l'écran et il semble que je dois la charger dans une fenêtre avec quelque chose comme

  self.toolbar = self.addToolBar ('var')  

bien que dans ce cas le "self" est une fenêtre qui me fait penser que j'ai besoin d'une référence à la fenêtre principale de l'IDA. Quelqu'un sait comment je peux obtenir cette référence?

pas une solution, mais juste pour être complet: dans IDA 6.7 +, ils ont des améliorations significatives à ce sujet décrites ici: http://www.hexblog.com/?p=886
oui j'ai vu ça, mais ne m'aide pas pour la 6.4, merci quand même. J'ai obtenu la plupart des fonctionnalités dont j'ai besoin en créant simplement une vue que je peux ancrer, pas aussi belle qu'une barre d'outils mais fonctionnelle.
Un répondre:
NirIzr
2016-07-06 16:56:34 UTC
view on stackexchange narkive permalink

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:

  1. 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.
  2. 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  


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...