如何强制更新 IDA 的 action_handler_t 对象的状态?

逆向工程 艾达 蟒蛇 idapro-sdk
2021-06-17 12:41:53

上下文关于 action_handler_t

IDA 提供了多种功能和 API 来扩展和增强其可用性,其中一项功能是action_handler_t通过idaapi.action_handler_t在 IDAPython 中继承创建用户定义的对象

该功能涉及多个 API,但其中一个要求是拥有一个继承所述idaapi.action_handler_t类并实现两个方法的类。其中一种方法是update(self, ctx)(另一种是activate(self, ctx))。

在 IDA 应用程序的生命周期中,该update方法将在某些事件(启动、加载新 IDB、焦点转移到另一种形式等)上多次调用。更新然后通过发出另一个调用来传达是否应启用或禁用操作以及何时再次查询update

这些事件之一是操作的activation调用返回。动机是作为激活动作的结果而执行的动作可能会改变相同动作或其他动作的状态。

实际问题

在使用 IDA 和某些 Qt 信号/插槽功能时,我创建了一个activation立即返回并将其大部分登录安排到其他插槽的方法,现在我失去了update使操作响应整体状态的“激活后”调用改变和改变自己的状态(从禁用到启用,反之亦然)。

我的问题是,如何强制updateIDA 的内核调用所有现有操作,以便当我延迟的代码完成时,它可以手动告诉 IDA 它应该调用update所有操作来查询它们的新状态?

1个回答

update通常在刷新相关的 GUI 组件(通常是各种 IDA 视图)时调用操作方法。为了使事情更快,IDA 避免刷新视图,直到需要这样的刷新。

在编写 IDA 脚本时,我们经常在不接触 GUI 的情况下进行更改,因此 IDA 无法判断更改何时完成并且应该刷新。为了解决这个问题,我们可以使用idaapi.request_refresh(mask)函数:

idaapi.request_refresh(0xFFFFFFFF)  # IWID_ALL

要刷新特定视图,请使用由以下常量组成的掩码(此处记录):

#define IWID_EXPORTS  (1u << BWN_EXPORTS) ///< exports           (0)
#define IWID_IMPORTS  (1u << BWN_IMPORTS) ///< imports           (1)
#define IWID_NAMES    (1u << BWN_NAMES  ) ///< names             (2)
#define IWID_FUNCS    (1u << BWN_FUNCS  ) ///< functions         (3)
#define IWID_STRINGS  (1u << BWN_STRINGS) ///< strings           (4)
#define IWID_SEGS     (1u << BWN_SEGS   ) ///< segments          (5)
#define IWID_SEGREGS  (1u << BWN_SEGREGS) ///< segment registers (6)
#define IWID_SELS     (1u << BWN_SELS   ) ///< selectors         (7)
#define IWID_SIGNS    (1u << BWN_SIGNS  ) ///< signatures        (8)
#define IWID_TILS     (1u << BWN_TILS   ) ///< type libraries    (9)
#define IWID_LOCTYPS  (1u << BWN_LOCTYPS) ///< local types       (10)
#define IWID_CALLS    (1u << BWN_CALLS  ) ///< function calls    (11)
#define IWID_PROBS    (1u << BWN_PROBS  ) ///< problems          (12)
#define IWID_BPTS     (1u << BWN_BPTS   ) ///< breakpoints       (13)
#define IWID_THREADS  (1u << BWN_THREADS) ///< threads           (14)
#define IWID_MODULES  (1u << BWN_MODULES) ///< modules           (15)
#define IWID_TRACE    (1u << BWN_TRACE  ) ///< trace view        (16)
#define IWID_STACK    (1u << BWN_STACK  ) ///< call stack        (17)
#define IWID_XREFS    (1u << BWN_XREFS  ) ///< xrefs             (18)
#define IWID_SEARCHS  (1u << BWN_SEARCH ) ///< search results    (19)
#define IWID_FRAME    (1u << BWN_FRAME  ) ///< function frame    (25)
#define IWID_NAVBAND  (1u << BWN_NAVBAND) ///< navigation band   (26)
#define IWID_ENUMS    (1u << BWN_ENUMS  ) ///< enumerations      (27)
#define IWID_STRUCTS  (1u << BWN_STRUCTS) ///< structures        (28)
#define IWID_DISASMS  (1u << BWN_DISASM ) ///< disassembly views (29)
#define IWID_DUMPS    (1u << BWN_DUMP   ) ///< hex dumps         (30)
#define IWID_NOTEPAD  (1u << BWN_NOTEPAD) ///< notepad           (31)
#define IWID_IDAMEMOS (IWID_DISASMS|IWID_DUMPS)