GetModuleInformation在Windows 10中链接失败

mftmpeh8  于 2023-06-30  发布在  Windows
关注(0)|答案(2)|浏览(139)

我试图创建一个DLL注入器,它将直接在目标进程中执行DLL中的函数。我试图得到我注入的DLL的入口点,这样我就可以得到函数的偏移量。我在Microsoft Docs上读到使用GetModuleInfo()。我使用了头文件psapi.h,发现编译工作正常,但链接失败,出现以下错误:
g++ dll_injector.cpp -o dll_injector.exe

C:\Users\DELKAR~1\AppData\Local\Temp\ccOeKdhW.o:dll_injector.cpp:(.text+0x187): undefined reference to `GetModuleInformation@16'
C:\Users\DELKAR~1\AppData\Local\Temp\ccOeKdhW.o:dll_injector.cpp:(.text+0x1ae): undefined reference to `GetModuleInformation@16'
collect2.exe: error: ld returned 1 exit status

我已经尝试过将Psapi.libdll_injector.cpp放在同一个目录中,然后使用
g++ dll_injector.cpp -o dll_injector.exe -Xlinker -L Psapi.lib
但它还是抛出了同样的错误。
下面是dll_injector.cpp代码:

#include <windows.h>
#include <iostream>
#include <psapi.h>
using namespace std;

int main() {
    DWORD pid;
    const char* dll_path = "C:\\Users\\Delkarix\\Desktop\\target_dll.dll";
    HWND hwnd = FindWindow(NULL, "C:\\Users\\Delkarix\\Desktop\\target_process.exe");
    GetWindowThreadProcessId(hwnd, &pid);
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

    LPVOID addr = VirtualAllocEx(hProcess, NULL, strlen(dll_path) + 1, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(hProcess, addr, dll_path, strlen(dll_path) + 1, NULL);
    CreateRemoteThread(hProcess, NULL, 0, LPTHREAD_START_ROUTINE(GetProcAddress(LoadLibrary("kernel32"), "LoadLibraryA")), addr, 0, NULL);

    HMODULE lib = LoadLibrary("target_dll.dll");
    FARPROC proc_addr = GetProcAddress(lib, "test_function");

    MODULEINFO info;
    MODULEINFO info_current;
    BOOL success1 = GetModuleInformation(GetCurrentProcess(), lib, &info_current, sizeof(info_current));
    BOOL success2 = GetModuleInformation(hProcess, lib, &info, sizeof(info));
    cout << success1 << endl; // Test if it works
    cout << success2 << endl; // Test if it works
}

下面是target_dll.cpp代码:

#include <iostream>
using namespace std;

extern "C" __declspec(dllexport) void test_function() {
    cout << "Hello World" << endl;
}

我希望dll_injector.exe打印出表示函数是否成功的值。稍后我将更改代码,以便能够获取入口点值。现在,我只希望函数能够成功,而不必创建Visual Studio C++控制台项目。我的问题是:为什么链接失败了,我如何才能让链接成功?

chy5wohz

chy5wohz1#

改变
g++ dll_injector.cpp -o dll_injector.exe -Xlinker -L Psapi.lib

g++ dll_injector.cpp -o dll_injector.exe -L。- IPsapi

-L(库路径)-指定lib目录。.指定当前路径。
-l(library)-与library链接。Psapi指定库的名称。(在windows中省略后缀名.lib或在linux中省略前缀名lib和后缀名.a

单据来自Compiling with g++

vuktfyat

vuktfyat2#

如前所述,您应该将-L替换为-l,但是,前面的答案包含错误或不再适用于mingw-w 64的现代安装。我自己测试了以下内容。
正确的命令行参数(链接选项)应该完全小写,如下所示:

-lpsapi

相关问题