#include <windows.h> #include <stdio.h> #define BUFSIZE 512 BOOL InjectDLL(DWORD procID, const wchar_t* dllPath) { HANDLE hHandle = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, FALSE, procID); if (!hHandle) { wprintf(L"OpenProcess failed with error %d\n", GetLastError()); return FALSE; } wchar_t fullDllPath[BUFSIZE]; if (!GetFullPathName(dllPath, BUFSIZE, fullDllPath, NULL)) { wprintf(L"GetFullPathName failed with error %d\n", GetLastError()); CloseHandle(hHandle); return FALSE; } void* dllPathAddr = VirtualAllocEx(hHandle, 0, (wcslen(fullDllPath) + 1) * sizeof(wchar_t), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (!dllPathAddr) { wprintf(L"VirtualAllocEx failed with error %d\n", GetLastError()); CloseHandle(hHandle); return FALSE; } if (!WriteProcessMemory(hHandle, dllPathAddr, fullDllPath, (wcslen(fullDllPath) + 1) * sizeof(wchar_t), NULL)) { wprintf(L"WriteProcessMemory failed with error %d\n", GetLastError()); VirtualFreeEx(hHandle, dllPathAddr, 0, MEM_RELEASE); CloseHandle(hHandle); return FALSE; } HMODULE hKernel32 = GetModuleHandle(L"kernel32.dll"); if (!hKernel32) { wprintf(L"GetModuleHandle failed with error %d\n", GetLastError()); VirtualFreeEx(hHandle, dllPathAddr, 0, MEM_RELEASE); CloseHandle(hHandle); return FALSE; } FARPROC loadLibAddr = GetProcAddress(hKernel32, "LoadLibraryW"); if (!loadLibAddr) { wprintf(L"GetProcAddress failed with error %d\n", GetLastError()); VirtualFreeEx(hHandle, dllPathAddr, 0, MEM_RELEASE); CloseHandle(hHandle); return FALSE; } HANDLE rThread = CreateRemoteThread(hHandle, NULL, 0, (LPTHREAD_START_ROUTINE)loadLibAddr, dllPathAddr, 0, NULL); if (!rThread) { wprintf(L"CreateRemoteThread failed with error %d\n", GetLastError()); VirtualFreeEx(hHandle, dllPathAddr, 0, MEM_RELEASE); CloseHandle(hHandle); return FALSE; } WaitForSingleObject(rThread, INFINITE); VirtualFreeEx(hHandle, dllPathAddr, 0, MEM_RELEASE); CloseHandle(rThread); CloseHandle(hHandle); return TRUE; } int main() { DWORD procID = 1412; const wchar_t* dllPath = L"C:\\Users\\tmqrx\\source\\repos\\Dll1\\x64\\Debug\\Dll1.dll"; if (InjectDLL(procID, dllPath)) { wprintf(L"DLL injection successful.\n"); } else { wprintf(L"DLL injection failed.\n"); } return 0; }