实验目的
简单理解ida如何识别静态链接程序中的库函数
实验环境
ida7.0
flair68
vs 2017
实验过程
比如我使用vs2017用MFC编写一段代码,点击按钮,弹窗的(因为直接MessageBox还想并不能生成静态编译的MessageBox)
添加按钮,之后双击按钮,假如代码即可(当然直接一个空工程也行,主要是看下ida使用了那些sig文件)
1 | void CMFCApplication1Dlg::OnBnClickedButton1() |
我们使用静态编译
项目属性—常规—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