类型库是为特定平台和编译器收集的高层次类型信息的集合体,可供IDA和反编译器使用。
类型库可能包含:
-
函数原型,例如:
void *__cdecl memcpy(void *, const void *Src, size_t Size);
BOOL __stdcall EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam); -
类型定义,例如:
typedef unsigned long DWORD;
BOOL (__stdcall *WNDENUMPROC)(HWND, LPARAM); -
标准结构和枚举定义,例如:
struct tagPOINT {
LONG x;
LONG y;
};
enum tagSCRIPTGCTYPE {
SCRIPTGCTYPE_NORMAL = 0x0,
SCRIPTGCTYPE_EXHAUSTIVE = 0x1,
}; -
从预处理器定义(宏)组创建的合成枚举:
enum MACRO_WM {
WM_NULL = 0x0,
WM_CREATE = 0x1,
WM_DESTROY = 0x2,
WM_MOVE = 0x3,
WM_SIZEWAIT = 0x4,
WM_SIZE = 0x5,
WM_ACTIVATE = 0x6,
WM_SETFOCUS = 0x7,
WM_KILLFOCUS = 0x8,
WM_SETVISIBLE = 0x9,
[...]
};
操作类型库
当前加载的类型库列表可以在类型库视图中查看(视图 > 打开子视图 > 类型库,或按 Shift
-F11
)。
可以使用“加载类型库...”上下文菜单项或 Ins
热键加载其他库。
加载后,可以在IDA和反编译器中使用类型库中的定义:可以在函数原型和全局变量的类型中使用这些定义(Y
热键),以及在本地类型中添加新定义时使用。
将类型导入到IDB
虽然反编译器可以在不额外操作的情况下使用加载的类型库中的类型,但在反汇编中使用它们可能需要一些额外的操作。例如,要使用标准结构或枚举,必须先将其添加到相应视图的列表中:
-
打开结构( Shift
-F9
)或枚举(Shift
-F10
)窗口; -
从上下文菜单中选择“添加结构类型...”或“添加枚举”,或使用热键( Ins
); -
如果知道结构/枚举名称,请在名称字段中输入并点击确定;
-
如果不知道或记不住确切名称,请点击“添加标准结构”(“添加标准枚举”),并从加载的类型库中所有相应类型的列表中选择结构或枚举。与所有选择器一样,您可以使用增量搜索或过滤( Ctrl
-F
)。
导入后,可以在反汇编视图中使用该结构或枚举。
函数原型
当加载类型库时,名称与库中存在的原型匹配的函数将应用其原型到数据库中。
更多文章
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):IDA 技巧(60) IDA 的类型库
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论