如何区分用户定义/库函数和编译文件?

时间:2011-07-06 14:18:30

标签: user-defined-functions

修改

我想要的是在编译文件(例如PE文件)中区分静态链接库函数和用户自编函数

如何实现? (我在考虑数据库比较,但我不知道任何数据库。)

顺便说一句,(我早在我问这个问题之前就已经知道了)动态链接的库函数,它们只是导入表(PE)中的一个条目。


通过库函数,我的意思是在库中定义的那些,例如STL(我知道这是一个坏名字)。

通过用户定义的函数,我指的是由个别程序员编写的函数。

是否有任何程序化的方法来实现这一目标?

现在我正在考虑将二进制文件与数据库进行比较,但到目前为止我还不知道任何数据库。

请推荐数据库或其他方式作为答案。谢谢。

2 个答案:

答案 0 :(得分:1)

这个答案假设您要分析与其他导入库动态链接的标准Windows可执行文件(.lib和非静态链接的.dll文件),如果是这种情况,您希望插入PE(可移植可执行文件)文件结构。

这是一个good article,可以帮助您入门,并在转储PE标头时提供示例代码。

您需要关注外部库调用的Import表(.idata部分),以及可执行文件中定义的并标记为可导出的调用的Export表(.edata部分)(通常这只存在于.dll文件中) )。

对于静态库,它们的格式称为COFF,并且Visual Studio附带了DUMPBIN实用程序,您可以使用该实用程序快速查找lib文件,甚至可以根据需要转储代码的反汇编

  

DUMPBIN实用程序,提供32位版本的   Microsoft Visual C ++,结合了LINK,LIB和的功能   EXEHDR实用程序。这些工具的组合具有这种能力   提供有关格式和符号的信息   可执行文件,库和DLL文件。

有关COFF文件结构的信息,请参阅此article

确定一个函数调用是否来自lib会很棘手,但从我记忆中,代码中的大多数静态lib调用实际上是thunk调用(对从lib复制的实际目标代码的简单jmp调用)并且尺寸很小(通常大约5个字节),而“用户定义的”不是thunk,而且是基于bp的框架调用。

答案 1 :(得分:1)

当您的程序链接时,静态函数和用户定义函数是 按文件包含文件。

因此,如果您转储PE文件的标头,并查看符号 table(使用objdump -x,如果你使用mingw32运行,或其他任何东西) 你会看到一个文件的名称,然后从这一个导入所有函数, 在另一个文件名及其功能之后...
或者,如果您有调试信息,可能会更容易。

因此,在将函数与文件链接后,您可以通过分析文件名来对函数进行排序。寻找扩展名(.c / .lib / .a)或签入文件列表,你有somwhere。 小心消除crt0文件...

然而,这是一个棘手的解决方案,我不确定这对每个程序都有用。