-1

我正在尝试找到一种方法来动态加载我需要使用的每个 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");
}

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

我已经尝试用 Google 搜索一些东西并在 MSDN 上进行搜索,但我没有找到任何东西。一般来说,给定一个函数(一个常见的函数,例如 in 或 中的一个windows.hstdio.hstdlib.h我如何找到要加载的 dll?

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

4

1 回答 1

1

您的示例 ( printf) 中的函数不是 Windows API 函数,而是 C 标准中定义的函数。因此,它应该更容易获得。然而,这再次强调了如果您没有任何标准或 Windows API 函数可用,这会使很多 dll 知道。我不知道有一个地方可以在一个源文件中定义它们,但是您可以使用诸如www.pinvoke.net 之类的资源逐个加载您的函数,该资源可让您输入函数名称并检索要加载的 dll 的名称(以及 C# 方法签名,但您不需要,您已经知道 C 签名)。

于 2018-09-12T17:29:16.167 回答