【问题标题】:Calling functions from DLL in C从 C 中的 DLL 调用函数
【发布时间】:2020-11-06 19:14:49
【问题描述】:

我阅读了 MSDN 文档,查看了其他示例,也向其他人寻求帮助。到目前为止还没有人找到解决办法,所以 StackOverflow 是我最后的希望。

目前我的目标是从 DLL 调用函数。下面给出的示例使用位于user32.dll 中的简单窗口MessageBox() 函数。这已经在之前完成了,但是当我尝试在 C 中执行此操作时,它会在调用 GetProcAddress() 时崩溃。

HMODULE hLib;
func_msgBox msgBox;
hLib = LoadLibrary("C:\\WINDOWS\\system32\\user32.dll");
if (hLib != NULL) {
    printf("[+] - Loaded our library");
    msgBox = (func_msgBox)GetProcAddress(hLib, "MessageBox");
    if (msgBox != NULL) {
        printf("[+] -  Recieved our process address");
        (func_msgBox)(NULL, "test", "test", 0);
        printf("[+] - Called our function");
    }
}
printf("Error: %s", GetLastError());
FreeLibrary(hLib);

【问题讨论】:

  • 已经有了这是针对 C 而不是针对 C++ 但是我已经将代码重新调整为针对 C 但是它只是崩溃了,这就是我寻求帮助的原因。
  • 您是如何确定崩溃的确切位置的?那些printf 电话甚至没有换行符,所以你不能依赖它们。您是否附加了调试器并单步执行?这是最合适的行动。您还没有展示如何声明 func_msgBox,或者您使用的是窄字符集还是宽字符集,或者您的应用程序是编译为 64 位还是 32 位(很重要,因为您正在加载 64 位 DLL除非您在 32 位操作系统上运行它)。此外,您的电话 (func_msgBox)(NULL, "test", "test", 0); 是错误的,不应编译。你的意思是(msgBox)(...)
  • @brainlet 您阅读那里的答案了吗?无论使用何种语言,您的 GetProcAddress 调用都将返回 NULL
  • 请注意,MessageBox 不是函数。看起来你想要MessageBoxA

标签: c winapi dll process


【解决方案1】:

作为cmets:

  1. 您需要明确指定MessageBox的版本:MessageBoxAMessageBoxW

  2. func_msgBox是一种函数指针,你需要使用实例msgBox来调用这个函数:

    msgBox(NULL, "test", "test", 0);

  3. 您需要将其编译为 64 位,因为您正在加载 64 位 DLL。

我可以重现崩溃,崩溃发生在printf,如果你指定名称"MessageBox"GetProcAddress失败并且GetLastError返回127(ERROR_PROC_NOT_FOUND),返回类型是DWORD,但是你指定的格式是%s,通常需要一个字符串地址。

以下示例适用于我:

#include <windows.h>
#include <stdio.h>

typedef int (WINAPI* func_msgBox)(
    HWND    hWnd,
    LPCSTR lpText,
    LPCSTR lpCaption,
    UINT    uType
);
void main(void)
{
    HMODULE hLib;
    func_msgBox msgBox;
    hLib = LoadLibraryA("C:\\WINDOWS\\system32\\user32.dll");
    if (hLib != NULL) {
        printf("[+] - Loaded our library");
        msgBox = (func_msgBox)GetProcAddress(hLib, "MessageBoxA");
        if (msgBox != NULL) {
            printf("[+] -  Recieved our process address");
            msgBox(NULL, "test", "test", 0);
            printf("[+] - Called our function");
        }
    }
    printf("Error: %d", GetLastError());
    FreeLibrary(hLib);
    return;
};

【讨论】:

  • 嗨,@brainlet,这能回答你的问题吗?如果您有任何问题,请随时告诉我,如果有帮助也请接受。
猜你喜欢
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2012-06-23
相关资源
最近更新 更多