修改:
我想要的是在编译文件(例如PE文件)中区分静态链接库函数和用户自编函数 。
如何实现? (我在考虑数据库比较,但我不知道任何数据库。)
顺便说一句,(我早在我问这个问题之前就已经知道了)动态链接的库函数,它们只是导入表(PE)中的一个条目。
通过库函数,我的意思是在库中定义的那些,例如STL(我知道这是一个坏名字)。
通过用户定义的函数,我指的是由个别程序员编写的函数。
是否有任何程序化的方法来实现这一目标?
现在我正在考虑将二进制文件与数据库进行比较,但到目前为止我还不知道任何数据库。
请推荐数据库或其他方式作为答案。谢谢。
答案 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文件...
然而,这是一个棘手的解决方案,我不确定这对每个程序都有用。