解决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的内部实现

解决办法

制作ida签名

首先生成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文件。这样很多静态链接的函数就可以看到符号的,大大提升了逆向效率

posted @ 2022-01-17 00:15  乘舟凉  阅读(657)  评论(2编辑  收藏  举报