解决ida无法识别printf的缺陷
现象
最近发现ida
居然无法识别vs2019 printf,作为有轻微强迫症的我无法容忍,如下图所示
test.cpp:
#include <stdio.h>
int main(int argc, char* argv[]) {
printf("hello world!");
return 0;
}
使用vs2019编译,生成x86、release版
注意:这里cl是32位的
结果ida
并没有把printf识别出来而是把它当作一个未知函数sub_401020处理
原因
经过一番探究发现printf是静态链接到test.exe中,所以ida把它做用户自定义函数处理了,下图是在test.exe中printf的内部实现
解决办法
首先生成obj文件,源码文件只要使用了printf即可,由于test.exe 是32位release版,所以生成的obj文件也必须为32位release版
cl -c /O2 test.cpp
注意:这里cl是32位的
使用pcf.exe 生成pat文件 ida签名制作工具
pcf test.obj
使用sigmake.exe生成sig文件
sigmake -n"32位release版vs2019的printf符号签名" test.pat printf.sig
将生成的printf.sig文件放入ida按照目录的sig/pc文件夹下,然后用ida打开test.exe,按shift+F5打开签名窗口,加载刚才放入的签名
注:这里的printf.sig是通用的,只要是vs2019编译的32位release版可执行文件,使用此符号文件都能将printf识别出来(原因是因为符号文件的原理是将函数的部分字节记住,通过这些字节去识别函数,所以只要编译出来的可执行文件的函数二进制一样就都能识别)
在用ida查看main函数,结果如下
分析一个程序先查看它是32位还是64位,debug还是release,然后制作对应的obj文件(源文件使用了printf即可),然后生成对应的sig文件。这样很多静态链接的函数就可以看到符号的,大大提升了逆向效率