Я пытаюсь создать инжектор 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.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++. Мой вопрос: почему связь не работает, и как я могу добиться успеха связи?
kernel32.dll и вам нужно связать с kernel32.lib.
Также обратите внимание, что опция -L предназначена для добавления каталог к пути поиска библиотеки. Параметр -l (нижний регистр L) предназначен для ссылки на определенную библиотеку.





Изменять
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 в Windows или префикс имени lib и суффикс имени .a в linux)
Документ от Компиляция с помощью g++
Попробуйте связать с
kernel32.lib, так как документация msdn также указывает это