Dll注入-LoadLibraryA失败

问题描述 投票:0回答:1

我正在尝试将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;
}
c++ dll code-injection
1个回答
0
投票

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

const char* DllName = "InjectMe.dll";

需要更改为这样的内容

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

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

© www.soinside.com 2019 - 2024. All rights reserved.