-
-
[IDA使用技巧]#170: 结构体的实例化
-
2024-2-12 08:57
2654
-
翻译:梦幻的彼岸
原文地址:https://hex-rays.com/blog/igors-tip-of-the-week-170-instantiating-structures/
MFC 消息映射
举例来说,我们来看看一个使用消息映射的 MFC 程序。这些映射存在于程序的常量数据区中,最初由 IDA 表示为数字和偏移量的混合体:
![](upload/attach/202402/767964_CRHVVHK3AHGJRUY.webp)
要理解它,我们可以参考 afxwin.h 中定义的 AFX_MSGMAP_ENTRY 结构:
struct AFX_MSGMAP_ENTRY
{
UINT nMessage; // windows message
UINT nCode; // control code or WM_NOTIFY code
UINT nID; // control ID (or 0 for windows messages)
UINT nLastID; // used for entries specifying a range of control id's
UINT_PTR nSig; // signature type (action) or pointer to message #
AFX_PMSG pfn; // routine to call (or special value)
};
为了快速将结构添加到数据库中,我们可以使用Local Types[本地类型]窗口,将 MFC 特有的 AFX_PMGS 类型替换为 void 指针:
![](upload/attach/202402/767964_6W493ZPXXCAF7HC.webp)
对数据进行结构化处理
结构一旦同步到 IDB,就可以在反汇编列表中使用。在候选区域未定义且可用结构列表较小的情况下,可以使用上下文菜单:
![](upload/attach/202402/767964_W926RTWSVQFR2ZS.webp)
如果候选数据太多,或者数据已经定义(例如通过自动分析转换为数组),可以直接使用Edit > Struct var…菜单项或快捷键 Alt-Q。
![](upload/attach/202402/767964_TH89YMK3HSZ58X9.webp)
无论是哪种情况,IDA 都会使用结构布局将数据显示为相应字段:
![](upload/attach/202402/767964_68D6WMHJD5DZ4D9.webp)
请注意,位置的dummy name[虚拟名称]会发生变化,以反映这是一个结构体实例。
一旦定义了结构实例,就可以
- 创建结构数组(例如使用 * 快捷键):
![](upload/attach/202402/767964_67AJUZFCDZRQ3AC.webp)
- 在简洁和完整结构表示法之间切换:
![](upload/attach/202402/767964_EY9HHE3X3JX6BHP.webp)
通过重新键入来应用结构
除了 "Struct var...[结构变量]"操作或上下文菜单外,您还可以在 "Set type...[设置类型]"功能(Y 快捷键)中指定数据的名称,从而快速对数据应用结构。
![](upload/attach/202402/767964_C5DVJHF2K8MXFGW.webp)
这种方法也适用于尚未导入 IDB 或仅存在于已加载类型库中的结构。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2024-2-12 08:58
被梦幻的彼岸编辑
,原因: