之前,我们讨论了使用IDA附带的类型库,但当处理不常见或自定义的API或SDK时,该怎么办呢?
在这种情况下,可以使用我们为IDA Pro用户提供的下载中心中的tilib
工具。
创建类型库
tilib
是一个强大的命令行工具,完整的选项列表可能看起来有些吓人。
类型信息库工具 v1.227 版权所有 (c) 2000-2021 Hex-Rays
用法:tilib [-sw] til-file
-c 创建til-file -t... 设置til-file标题
-h... 解析.h文件 -P C++模式(尚未准备好)
-D... 定义符号 -I... 包含目录列表
-M... 创建宏定义文件 -x 外部显示类型
-i 内部显示类型 -z 调试.h文件解析(使用它!)
-B... 转储坏的宏定义 -q 内部检查:解压类型
-C... 编译器信息(-C?帮助) -G... 名字修饰格式(n=org.name)
-m... 解析宏定义文件 -S 去除宏表
-dt... 删除类型定义 -rtX:Y 将类型X重命名为Y
-ds... 删除符号定义 -rsX:Y 将符号X重命名为Y
-b... 使用基础til -o... 包含til文件的目录
-l[1csxf] 显示til-file内容;1-带装饰名称,c-作为C代码
s-转储结构布局,x-测试udt序列化,f-转储函数参数位置
-v 详细信息 -e 忽略错误
-R 允许重新声明 -n 忽略til宏表
-u+ 解压til-file -u- 压缩til-file
-U 设置“通用til”位 -em 抑制宏创建错误
-# 启用序数类型 -#- 禁用序数类型
-p... 从PDB加载类型(Win32) -TL 降低现有类型
-TAL 假定低级类型 -TH 保留高级类型
-g[nb]X:Y 将宏X(正则表达式)移动到组Y;n-名称,b-主体
@... 带开关的响应文件
示例:tilib -c -Cc1 -hstdio.h stdio.til
然而,如底部所述,基本用法可以相当简单:
tilib -c -Cc1 -hstdio.h stdio.til
这将通过解析头文件stdio.h
作为Visual C++编译器来创建类型库stdio.til
。
高级选项
示例命令行在简单情况下可能有效(例如,单个自包含的头文件),但在实际SDK中,您可能会很快遇到问题。为了解决这些问题,可能需要额外的选项:
-
从 #include
指令中包含头文件的目录:-I<directory>
(可以多次指定); -
预处理器定义: -Dname=value
;
您也可以创建一个新的头文件,使用#define
语句并从中包含其他头文件,而不是在命令行上使用-D
。
响应文件
为了避免一次又一次地指定相同的选项,您可以使用响应文件。这些文件每行包含一个命令行选项,可以通过@
选项传递给tilib
:
tilib @vc32.cfg -c -hinput.h output.til
tilib
包中附带了Visual C++(32位和64位)、GCC和Borland C++的示例响应文件。
检查类型库
您可以使用-l
开关转储.til
文件的内容:
tilib -l mylib.til
在IDA中使用创建的类型库
要使自定义类型库在IDA中可用,请将其复制到IDA的til/<processor>
子目录中。例如,x86/x64文件的库应放在til/pc
下。之后,新的库应出现在调用“加载类型库”命令时显示的列表中。
高级示例
我们的一个用户撰写了一篇关于为Apache模块生成类型库的非常好的文章。请在此查看:https://github.com/trou/apache-module-ida-til。
另请参见tilib
包中的readme.txt
,了解创建枚举的高级用法,例如从预处理器宏定义组中创建枚举。
更多文章
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):IDA 技巧(62)创建自定义类型库
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论