如何动态加载每个所需的功能

时间:2018-09-12 17:12:49

标签: c windows dll loadlibrary getprocaddress

我正在尝试找到一种方法来动态加载我需要使用的每个Windows API函数。例如,要使用printf函数,我需要执行以下操作:

#include <windows.h>

typedef int (*printfPtr)(const char *str, ...);
int main(){
    HMODULE handle = LoadLibraryA("crtdll.dll");
    if(handle == NULL) return;
    printfPtr printfAdr = (printfPtr)GetProcAddress(handle, "printf");
    (*printfAdr)("This is a test\n");
}

这是一个快速编码的工作片段。这样做很容易,因为我遵循了一个指南,该指南告诉我可以从printf加载crtdll.dll。但是,现在我想加载CreateFileA函数,但是我不知道如何找到要加载的正确dll。

我已经尝试过搜索Google并在MSDN上进行搜索,但没有找到任何东西。通常,给定一个功能(常见的功能,例如windows.hstdio.hstdlib.h中的一个功能),如何找到要加载的dll?

我知道有些人可能认为这种加载功能没有用。但是,这不是真正的程序。在实际的情况下,手动找到了地址LoadLibraryAGetProcAddress,我可以编写代码,然后从PE导出段。

1 个答案:

答案 0 :(得分:1)

您的示例(printf)中的函数不是Windows API函数,而是C标准中定义的函数。因此,它应该更容易获得。但是,这再次证明了以下事实:如果您没有任何可用的标准或Windows API函数,则会使很多dll都需要了解。我不知道在一个源文件中都定义它们的单个位置,但是您可以使用www.pinvoke.net之类的资源(视情况而定)加载函数,该资源可让您键入函数名称并检索要加载的dll的名称(以及C#方法签名,但您不需要它,您已经知道C签名)。