在运行时获取可用的库函数

Get available library functions at runtime

本文关键字:库函数 运行时 获取      更新时间:2023-10-16

我正在使用windows上的动态链接库(.dll)或Linux上的共享对象(.so)。

我的目标是编写一些代码,这些代码可以给出库在磁盘上的绝对路径,返回该库的所有导出函数(导出表)的列表,并最终能够调用这些函数。这应该适用于windows(wit dll)和Linux(有so)。

我正在编写一种包装器,delgates函数将其调用到相应的库。因此,我收到一个路径、一个函数名和一个参数列表,然后我想转发这些参数。问题是:在尝试调用之前,我想知道给定的函数是否存在

从这里,我找到了一种独立于平台的方法来打开和关闭库,并获得指向具有给定名称的函数的指针
所以剩下的就是首先获取可用函数的名称。

在这个主题上,我发现这个问题处理的问题与它要求特定于Linux的解决方案的问题相同。在给定的答案中,它被称为

没有libc函数可以做到这一点。但是,您可以自己编写代码(或者从readelf这样的工具复制/粘贴代码)。

这清楚地表明有工具可以做我正在寻找的事情。唯一的问题是,有没有一个可以在windows和Linux上工作?如果没有,我该如何独自完成这件事?


这里有一个C#实现(实际上这是我想移植到C++的代码),它正在做我想做的事情(尽管只是windows)。对我来说,这看起来就像是手动处理库结构。如果是这样的话,我在哪里可以找到关于图书馆结构的必要信息?

因此,在unixoids上(Linux和WinNT都有posix子系统),dlopen函数可以用于加载动态库,并根据符号名称获取指向已知符号的函数指针。

据我所知,获取符号列表从来都不是POSIX费心指定的一个方面,长话短说,在Linux上可以为您实现这一点的函数是特定于那里使用的libc(主要是GNU libc),在Windows上则是特定于在那里使用的libc。可移植代码意味着为两个不同的libc使用不同的代码库!

如果你不想依赖libc,你必须有一个二进制对象解析器(适用于Linux上的ELF共享库,Windows上的PE)来从文件中读取符号名。实际上有很多这样的链接器——很明显,WINE有一个可移植的PE链接器(尤其适用于Linux),Linux下的每个链接器(包括glibc的运行时链接器)都可以解析ELF文件。

就我个人而言,radare2是一个很好的反向工程框架,具有大量的语言绑定,实际上是为了分析二进制文件,并为您提供导出的符号(以及能够提取未导出的函数、构建调用图等)。它确实有调试器,也就是说,也有跳转到函数的功能。

所以,现在知道

我正在编写一种包装器,delgates函数将其调用到相应的库。因此,我收到一个路径、一个函数名和一个参数列表,然后我想转发这些参数。问题是:在尝试调用之前,我想知道给定的函数是否存在

事情变得容易多了:实际上不需要获得导出列表。简单的尝试更容易,也同样快速。

因此,在任何POSIX系统(包括Windows的POSIX子系统和Linux)上,dlopen将打开库并加载符号表,dlsym将从该表中查找符号。如果该符号不在表中,它只返回NULL。所以,你已经拥有了你认为需要的所有桌子;只是不明确,但可查询。