Сбой GetModuleInformation при связывании в Windows 10

#c #windows #winapi #g #psapi

#c #Windows #winapi #g #psapi

Вопрос:

Я пытаюсь создать инжектор DLL, который будет напрямую выполнять функции внутри DLL в целевом процессе. Я пытаюсь получить точку входа в библиотеку DLL, которую я ввел, чтобы получить смещение функции. Я читал в документах Microsoft для использования GetModuleInfo() . Я использовал заголовок psapi.h и обнаружил, что компиляция сработала, но при привязке произошел сбой, выдающий следующую ошибку:

g dll_injector.cpp -о dll_injector.exe

 C:UsersDELKAR~1AppDataLocalTempccOeKdhW.o:dll_injector.cpp:(.text 0x187): undefined reference to `GetModuleInformation@16'
C:UsersDELKAR~1AppDataLocalTempccOeKdhW.o:dll_injector.cpp:(.text 0x1ae): undefined reference to `GetModuleInformation@16'
collect2.exe: error: ld returned 1 exit status
  

Я уже пытался поместить Psapi.lib в тот же каталог dll_injector.cpp , что и, а затем скомпилировать с

g dll_injector.cpp -о 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, amp;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, amp;info_current, sizeof(info_current));
    BOOL success2 = GetModuleInformation(hProcess, lib, amp;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 . Мой вопрос: почему сбой связи и как я могу добиться успеха в связывании?

Комментарии:

1. Попробуйте связать с kernel32.lib , поскольку в документации msdn это также указано

2. В документации говорится, что функция находится в kernel32.dll и с ней нужно связать kernel32.lib .

3. Также обратите внимание, что -L можно добавить каталог в путь поиска библиотеки. Опция -l (нижний регистр L) заключается в связывании с определенной библиотекой.

Ответ №1:

Изменить

g dll_injector.cpp -о dll_injector.exe -Xlinker -L Psapi.lib

Для

g dll_injector.cpp -о dll_injector.exe -L. -lPsapi

-L(путь к библиотеке) — укажите каталог библиотеки. . укажите текущий путь.

-l(библиотека) — ссылка с библиотекой. Psapi укажите имя библиотеки.(Опустите имя суффикса .lib в Windows или имя префикса lib и имя суффикса .a в linux)

Документ от компиляции с помощью g