在IDA Pro里看程序,真正省时间的不是一上来就手工改名,而是先把能直接导进库里的调试信息和类型信息吃进去。Hex-Rays官方文档写得很清楚,IDA可以手工加载PDB、DBG、TDS这类调试信息文件,也能加载IDS符号文件;如果是调试态分析,还可以在调试器选项里开启自动加载PDB。与此同时,IDA的类型系统本身也允许你继续从type library和Local Types里补结构体、枚举和函数原型。也就是说,符号缺失时,并不是只剩下纯手工硬改这一条路。
一、IDA Pro怎么加载调试符号
先把现成符号装进数据库,再谈后面的交叉引用和反编译,会顺很多。就官方菜单来说,入口都在【File】相关加载命令里,不同文件类型分别对应不同命令。
1、Windows程序优先看PDB
如果目标程序有配套PDB,直接用【File】里的【PDB file...】加载。官方说明里提到,这个命令就是把PDB里的信息导入当前数据库,默认由IDA自己的解析器处理;如果遇到旧版v2.0 PDB,才需要考虑按配置回退到Microsoft DLL。
2、老项目或特殊环境再看DBG和TDS
如果手头是DBG文件,就走【DBG file...】;如果是TDS,就走【TDS file...】。官方文档明确说明,这两类命令都是把对应调试信息载入数据库,其中TDS需要和输入文件放在同一目录。
3、只缺常见库名时可以补IDS
如果不是完整调试信息缺失,而是常见API名称和部分参数信息不完整,可以加载【IDS/IDT file...】。官方说明里写得很清楚,IDS文件主要提供已知函数名、序号、注释和栈参数信息,而且支持在主文件加载后再手工补载。
4、调试态分析时把自动加载PDB打开
如果你是在动态调试模块,而不是只做静态分析,调试器选项里有【Autoload PDB files】。官方说明就是,启用后,IDA会在进程加载新模块时尝试自动调用PDB插件去加载符号。
二、IDA Pro调试符号缺失时怎么补信息
符号没了以后,最怕的是什么都想一次补完。更稳的顺序通常是先补能批量导入的类型,再补函数原型,最后才做局部手工修正。Hex-Rays官方文档已经把这几层入口分开了。
1、非Windows目标优先看DWARF
如果样本本身或伴随文件里带DWARF调试信息,就优先用DWARF插件。官方文档说明,DWARF插件会提取类型信息、函数名、函数原型、局部变量以及全局变量名和类型,还支持源码级调试。
2、先补type library
IDA自带很多type libraries,官方说明里写明可以在【Type Libraries】窗口里右键【Load type library...】继续加载。类型库一旦载入,对应定义就能在整个数据库里使用,后面补结构体和函数类型都会轻松很多。
3、再用Local Types补自定义类型
如果现成库不够,就去【Local Types】窗口补自己的结构体、联合体、枚举和自定义声明。官方文档说明,这里就是项目级类型的集中管理入口,而且支持新增、修改和导入类型。
4、函数原型和调用点分开修
当反编译里函数参数、返回值或调用约定明显不对时,用【Set type】去修函数原型。官方文档说明,这个命令可以修改当前函数的参数、返回类型和调用约定。这样做比只改函数名更有价值,因为后面的伪代码会一起变清楚。
三、IDA Pro里哪些地方要先查
真到排查时,不要先满工程找异常名字,更实用的做法是先看你缺的是哪一类信息。是完整调试符号没进来,还是只有类型缺,还是只有库函数名字没识别,这三种情况入口并不一样。
1、先看有没有现成调试文件
PDB、DBG、TDS、DWARF伴随文件如果本来就有,优先把它们吃进数据库,不要先手工修。官方已经把这些文件列成正式加载入口。
2、再看是不是只缺库函数识别
如果主体代码还行,但运行库和系统API名称不完整,那更适合补IDS或FLIRT,而不是先重做类型系统。官方文档把IDS和FLIRT都列成补充识别入口。
3、然后看类型系统是不是空的
如果反编译里全是裸指针、匿名结构和不明参数,就去看Type Libraries和Local Types。类型一旦补起来,很多函数签名和数据结构会一起变清楚。
4、最后才做局部手工修正
当前面几层都补过了,剩下的函数原型、局部结构和调用点再手工修,效率才最高。直接从最细的地方开始改,通常最慢。这个顺序是顺着官方各类入口的职责自然排下来的。
总结
IDA Pro怎么加载调试符号,关键是先按文件类型走对入口,PDB、DBG、TDS、DWARF、IDS各有各的加载位置。IDA Pro调试符号缺失时怎么补信息,重点也不是只靠手工改名,而是先补调试信息,再补type library和Local Types,最后才修函数原型和局部细节。把这几层拆开处理,库里的信息通常会比一开始清楚很多。
