【问题标题】:Dll injection - LoadLibraryA failsDll 注入 - LoadLibraryA 失败
【发布时间】:2019-09-13 09:32:14
【问题描述】:

我正在尝试将 dll 注入进程。 dll 除了返回 TRUE 之外什么都不做。

我将调试器附加到要注入的进程中,并确认 LoadLibraryA 被正确调用但返回 NULL。 现在我认为这可能与我的 dll 的依赖关系有关。所以我检查了它们,发现它需要vcruntime140.dll。 我想将我的 dll 注入的进程不会加载该 dll。

#include "pch.h"

extern "C" int __stdcall APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}
#include "Source.h"

const char* DllName = "InjectMe.dll";

int main()
{
    DWORD processID = 0;
    printf("Process ID: ");
    scanf_s("%i", &processID);

    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
    if (handle == nullptr) {
        printf("Process could not be opened.");
        return -1;
    }
    LPVOID memDllName = VirtualAllocEx(handle, nullptr, strlen(DllName) + 1, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    assert(memDllName != nullptr);
    assert(WriteProcessMemory(handle, memDllName, DllName, strlen(DllName) + 1, nullptr));

    LPVOID loadLibraryAddr = GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
    assert(loadLibraryAddr != nullptr);

    HANDLE thread = CreateRemoteThreadEx(handle, nullptr, 0, (LPTHREAD_START_ROUTINE)loadLibraryAddr, memDllName, CREATE_SUSPENDED, nullptr, nullptr);
    assert(thread != nullptr);
    ResumeThread(thread);
    DWORD returnCode = WaitForSingleObject(thread, 5000);
    CloseHandle(thread);
    if (returnCode == WAIT_TIMEOUT) {
        printf("DLL was not loaded. Thread timed out.");
        return -1;
    }
    else if (returnCode == WAIT_OBJECT_0) {
        printf("DLL was successfully injected into the process.");
    }
    CloseHandle(handle);
    std::cin.get();
    return 0;
}

【问题讨论】:

  • 为“@err”添加一个监视,以便您可以看到 winapi 错误代码。错误 126 是文件未找到错误,这是 LoadLibrary 最常见的故障模式。几乎保证在您使用“InjectMe.dll”时会发生,请指定文件的完整路径,这样您就不会依赖注入进程的搜索规则。
  • 还要检查 32 位和 64 位,因为您不能将两者混合使用。
  • @HansPassant 你的答案是正确的。我以为我在某处读到过,只要 dll 位于注入进程的 exe 中,传递相对路径就可以了。现在假设我似乎有点愚蠢,而且总是简单地通过绝对路径更不容易出错。
  • 我的回答是否需要任何澄清或改进才能回答您的问题?如果有,请回复,我会尽力改进。接受答案向更广泛的社区表明您找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。

标签: c++ dll code-injection


【解决方案1】:

调用 LoadLibrary() 时必须使用完整文件路径而不是相对文件路径

const char* DllName = "InjectMe.dll";

需要改成这样的

const char* DllName = "c:\\Users\User\\Desktop\\InjectMe.dll";

如果 OpenProcess 失败或者有时您还需要使用 SeDebugPrivelage,请确保以管理员身份运行

【讨论】:

    【解决方案2】:

    为了测试是否是路径问题,请尝试以下操作。保留

    const char* DllName = "InjectMe.dll";
    

    然后把 InjectMe.dll 和你的 .exe 放在同一个目录下,然后尝试运行你的 exe。如果dll加载成功,则为路径问题。

    要解决这个问题,您可以像 GuidedHacking 所说的那样指定完整路径,或者您可以将 InjectMe.dll 与 .vcxproj 和 .cpp 文件放在同一目录中(而不是 .sln 文件所在的位置)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 2013-11-28
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多