Domanda:
Aggiunta di una barra degli strumenti a IDA utilizzando PySide
James
2015-10-27 16:28:40 UTC
view on stackexchange narkive permalink

Quindi sto cercando di aggiungere una barra degli strumenti personalizzata a IDA 6.4 usando il loro download PySide e IDAAPI. Ho provato ad aggiungere una barra degli strumenti semplicemente creandone una ma poiché non ha un metodo exec_ () non riesco a visualizzarla sullo schermo e sembra che debba caricarla in una finestra con qualcosa come

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

anche se in questo caso "self" è una finestra che mi fa pensare di aver bisogno di un riferimento nella finestra principale di IDA. Qualcuno sa come posso ottenere quel riferimento?

non una soluzione, ma solo per completezza: in IDA 6.7 + hanno miglioramenti significativi su questo descritto qui: http://www.hexblog.com/?p=886
sì l'ho visto, ma non mi aiuta per 6.4, grazie però. Ho ottenuto la maggior parte delle funzionalità di cui ho bisogno semplicemente creando una vista che posso ancorare, non bella come una barra degli strumenti ma funzionale.
Una risposta:
NirIzr
2016-07-06 16:56:34 UTC
view on stackexchange narkive permalink

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:

  1. Poiché la finestra principale di IDA non è sempre visibile quando i plugin sono caricati, potresti voler impostare un QTimer per trovare la finestra principale.
  2. 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  


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...