【问题标题】:How to dynamically load every needed function如何动态加载每个需要的功能
【发布时间】:2019-02-17 09:38:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您在 MSDN 上的搜索不是很彻底,因为the official CreateFileA page 底部的“要求”表显示(除了最低 Windows 版本、头文件和导入库之外)“DLL: kernel32.dll"
  • 是的,我后来找到了,反正问题没有改变,我需要一种方法来找到我需要的所有功能的 dll,他们给了我
  • 仅供参考,crtdll.dll 是旧版 DLL,仅包含在 SysWOW64 中用于 32 位程序。它不适用于 64 位程序。我在 Windows 10 中的版本是 1995 年 12 月 9 日,基于 PE 标头中的时间戳。

标签: c windows dll loadlibrary getprocaddress


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 2016-01-27
    • 2021-05-11
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多