SIG文件在IDA的作用中相当于符号文件。如果是自己写的PE文件,在编译过程中会产生OBJ文件,可以通过工具为它生成SIG文件。先把SIG文件拷贝到IDA目录的sig文件夹中,加载PE文件后依次点击view-"Open subview"-Signatures(快捷键shift+F5)打开已应用的签名窗口:

IDA中应用SIG文件_符号文件

IDA中应用SIG文件_机器码_02

在"List of applied library modules"右键添加sig文件,IDA反汇编窗口中的函数名会变为原本的函数名,以便于查看。下面两张图是应用SIG文件前后IDA对release版程序的函数名的解析,可以看到一部分函数名已经被正确解析:

IDA中应用SIG文件_机器码_03

IDA中应用SIG文件_符号文件_04

    那么,怎么才能生成SIG文件呢?分2种情况:

1.通过obj生成sig:

pcf filename.obj //生成pat文件
sigmake filename.pat filename.sig //生成sig文件

2.为lib生成sig:

步骤略微复杂,所以我参考网上现有的bat文件

md %1_objs
cd %1_objs
for /f %%i in ('link -lib /list %1.lib') do link -lib /extract:%%i %1.lib
for %%i in (*.obj) do pcf %%i
sigmake -n"%1.lib" *.pat %1.sig
if exist %1.exc for %%i in (%1.exc) do find /v ";" %%i > abc.exc
if exist %1.exc for %%i in (%1.exc) do > abc.exc more +2 "%%i"
copy abc.exc %1.exc
del abc.exc
sigmake -n"%1.lib" *.pat %1.sig
copy %1.sig ..\%1.sig
cd ..
del %1_objs /s /q
rd %1_objs

SIG帮助IDA解析函数名的原理:

先提出一个大家都熟悉的词语:特征码。来看个例子,system函数的特征:

IDA中应用SIG文件_符号文件_05

特征就是固定的二进制代码,是固定的二进制代码,打死都不会变的。比如上面的push ebp的机器代码,是55但是注意,偏移不是,比如最后的一个红框后面的偏移,因为这个受很多因素干扰。而pcf则是用来提取特征码的工具。它提取的特征码有如下的形式:

IDA中应用SIG文件_机器码_06

前边都是机器码,后面的2E 2E 2E 2E...代表的是偏移,用来做补充。比如机器码55 68 FF 25 00 00 40 00那么写到文件中就是55 68 FF 2E 2E 2E 2E 2E 2E 2E 2E 其中两个2E代表一个"."

 

参考资料:

​​逆向知识第一讲,IDA的熟悉使用​​ 作者:iBinary