我正在尝试找到一种方法来动态加载我需要使用的每个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加载。
我已经尝试了谷歌的东西,并在MSDN上搜索,但我没有找到任何东西。一般来说,给定一个函数(一个常见的函数,例如windows.h
,stdio.h
或stdlib.h
中的一个函数),我如何找到要加载的dll?
注:我知道有些人可能认为加载功能这种方式没有用。但是,这不是真正的计划。在真实的地址中,手动找到地址LoadLibraryA
和GetProcAddress
,我可以编写代码,然后从PE导出段。
示例中的函数(printf
)不是Windows API函数,而是C标准中定义的函数。因此它应该更容易获得。然而,这再次强调了如果你没有任何标准或Windows API函数可以让很多dll知道的话。我不知道有一个地方在一个源文件中定义它们,但您可以使用像www.pinvoke.net这样的资源逐个加载函数,它允许您键入函数名称并检索dll的名称加载(以及C#方法签名,但你不需要它,你已经知道C签名)。