#include <windows.h>
#include <iostream>
extern "C" __declspec(dllexport) bool lowinject(DWORD pid, const wchar_t* dllPath);
bool lowinject(DWORD pid, const wchar_t* dllPath) {
HANDLE hProcess = OpenProcess(
PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION |
PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,
FALSE, pid);
if (hProcess == NULL) {
std::cerr << "OpenProcess failed: " << GetLastError() << "\n";
return false;
}
size_t size = (wcslen(dllPath) + 1) * sizeof(wchar_t);
LPVOID remoteMem = VirtualAllocEx(hProcess, NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (remoteMem == NULL) {
std::cerr << "VirtualAllocEx failed: " << GetLastError() << "\n";
CloseHandle(hProcess);
return false;
}
if (!WriteProcessMemory(hProcess, remoteMem, dllPath, size, NULL)) {
std::cerr << "WriteProcessMemory failed: " << GetLastError() << "\n";
VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
HMODULE hKernel32 = GetModuleHandleW(L"kernel32.dll");
if (!hKernel32) {
std::cerr << "GetModuleHandleW failed: " << GetLastError() << "\n";
VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
FARPROC loadLibraryAddr = GetProcAddress(hKernel32, "LoadLibraryW");
if (!loadLibraryAddr) {
std::cerr << "GetProcAddress failed: " << GetLastError() << "\n";
VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE)loadLibraryAddr, remoteMem, 0, NULL);
if (hThread == NULL) {
std::cerr << "CreateRemoteThread failed: " << GetLastError() << "\n";
VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
WaitForSingleObject(hThread, INFINITE);
DWORD exitCode = 0;
if (!GetExitCodeThread(hThread, &exitCode)) {
std::cerr << "GetExitCodeThread failed: " << GetLastError() << "\n";
} else {
std::cout << "Remote thread exit code: " << exitCode << "\n";
}
VirtualFreeEx(hProcess, remoteMem, 0, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess);
return true;
}