Сбой GetModuleInformation на Linkage в Windows 10 - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь создать DLL Injector, который будет непосредственно выполнять функции внутри 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.lib в тот же каталог, что и dll_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 ++.Мой вопрос: почему сбой связи и как я могу добиться успеха связи?

1 Ответ

1 голос
/ 12 апреля 2019

Изменение

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

до

g ++ dll_injector.cpp -o dll_injector.exe -L. -lPsapi

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

-l (библиотека) - связь с библиотекой. Psapi укажите имя библиотеки (пропустите имя суффикса .lib в окнах или имя префикса lib и имя суффикса .a в linux)

Док От Компиляция с g ++

...