从ida的flair工具去理解它是怎么识别出静态链接程序中的库函数的

实验目的

简单理解ida如何识别静态链接程序中的库函数

实验环境

ida7.0
flair68
vs 2017

实验过程

比如我使用vs2017用MFC编写一段代码,点击按钮,弹窗的(因为直接MessageBox还想并不能生成静态编译的MessageBox)

添加按钮,之后双击按钮,假如代码即可(当然直接一个空工程也行,主要是看下ida使用了那些sig文件)

1
2
3
4
5
void CMFCApplication1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
MessageBox(TEXT("giantbranch"), TEXT("giantbranch"), 0);
}

我们使用静态编译

项目属性—常规—MFC的使用—在静态库中使用MFC

我们用ida打开,可以看到很多函数都识别出来了,我们可以通过shift+f5看看ida使用了那些签名文件,我们可以看到mfc的vc32mfc.sig

也就是ida的sig/pc目录下vc32mfc.sig

那么这个sig函数是如何生成的呢

比如我们以nafxcwd.lib这个文件为例(这是也是mfc程序需要链接的一个文件,假如你装了vs,可以通过everything搜索这个文件),执行下面的命令,即可生成nafxcwd.pat

1
pcf.exe nafxcwd.lib

我们打开pat文件,可以看到其实就是一些机器码序列,不确定的就用.来说明

我们用ida打开nafxcwd.lib中的第一个obj,发现并没有什么代码,但是也可以发现一点东西

可以看到了吧,两个.代表一个字节,说明是不确定的

再看一个例子

最后通过sigmake nafxcwd.pat nafxcw.sig即可生成sig文件但是需要在nafxcw.exc解决冲突再执行,因为有些函数特征一样的。。。)

懒得解决冲突了,要在前面添加加号或者减号什么的。。。

ctf的静态链接

我们可以尝试file ->load sig文件尝试去识别

这有个repo

https://github.com/push0ebp/sig-database

reference

https://lichao890427.github.io/2015/01/15/about-ida-flirt/

打赏专区