Написал функцию на С++, которая должна запустить процесс, остановить его, внедрить DLL с помощью CreateRemoteThread, и запустить. Вроде как написал я ее но, она не работает, и ошибок не выдает. Проблема в следующем: Поток отрабатывает корректно, и wait-функция нормаль ожидает завершения потока. Но при вызове ResumeThread для главного потока запущенного процесса, процесс не запускается, а так и остается остановленным. Я заметил, что если убрать wait-функцию, то приложения запустится. Мне очень нужно чтоб DLL выполнилась перед запуском основного приложения. Вот код всего приложения: Код (Text): #include <windows.h> #include <stdio.h> #pragma pack(push, 1) struct inj_code { BYTE PUSH_CMD; DWORD PUSH_ARG; WORD CALL_CMD; DWORD CALL_ARG; BYTE PUSH_CMD_EXIT; DWORD PUSH_ARG_EXIT; WORD CALL_CMD_EXIT; DWORD CALL_ARG_EXIT; PVOID _LoadLibraryA; PVOID _ExitThread; CHAR LibraryName[MAX_PATH]; }; #pragma pack(pop) bool WINAPI SetDebugPrivileges() { LUID LID; HANDLE hToken; TOKEN_PRIVILEGES prv; try { if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) == 0) throw NULL; if (LookupPrivilegeValueA(NULL, "SeDebugPrivilege", &LID) == 0) throw NULL; prv.PrivilegeCount = 1; prv.Privileges[0].Luid = LID; prv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (AdjustTokenPrivileges(hToken, FALSE, &prv, sizeof(TOKEN_PRIVILEGES), NULL, NULL) == 0) throw NULL; } catch (...) { CloseHandle(hToken); return false; } return true; } bool WINAPI InjectDll(char * process_name, char * module_name) { PROCESS_INFORMATION process; STARTUPINFOA sti; memset(&sti, 0, sizeof(STARTUPINFOA)); sti.cb = sizeof(STARTUPINFOA); HANDLE hOpenProcess; inj_code rcd; LPVOID memory; DWORD memaddr; HMODULE hKernel32; HANDLE hThread; try { if (!CreateProcessA(process_name, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED | NORMAL_PRIORITY_CLASS, NULL, NULL, &sti, &process)) throw 0; hOpenProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_CREATE_THREAD, FALSE, process.dwProcessId); if (hOpenProcess == NULL) throw 0; memory = VirtualAllocEx(hOpenProcess, NULL, sizeof(inj_code), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (memory == NULL) throw 0; memaddr = (DWORD)memory; rcd.PUSH_CMD = 0x068; rcd.PUSH_ARG = memaddr + 0x01E; rcd.CALL_CMD = 0x015FF; rcd.CALL_ARG = memaddr + 0x016; rcd.PUSH_CMD_EXIT = 0x068; rcd.PUSH_ARG_EXIT = 0; rcd.CALL_CMD_EXIT = 0x015FF; rcd.CALL_ARG_EXIT = memaddr + 0x01A; hKernel32 = GetModuleHandleA("kernel32.dll"); rcd._LoadLibraryA = GetProcAddress(hKernel32, "LoadLibraryA"); rcd._ExitThread = GetProcAddress(hKernel32, "ExitThread"); strcpy_s(rcd.LibraryName, MAX_PATH, module_name); if (!WriteProcessMemory(hOpenProcess, memory, &rcd, sizeof(inj_code), NULL)) throw 0; hThread = CreateRemoteThread(hOpenProcess, NULL, 0, (DWORD (WINAPI *)(LPVOID)) memory, NULL, 0, NULL); if (hThread == NULL) throw 0; WaitForSingleObject(hThread, INFINITE); if (!VirtualFreeEx(hOpenProcess, memory, 0, MEM_RELEASE)) throw 0; ResumeThread(process.hThread); CloseHandle(hThread); CloseHandle(hOpenProcess); CloseHandle(process.hThread); CloseHandle(process.hProcess); } catch(...) { TerminateProcess(process.hProcess, 0); CloseHandle(hThread); CloseHandle(hOpenProcess); CloseHandle(process.hThread); CloseHandle(process.hProcess); return false; } return true; } void main() { if (!SetDebugPrivileges()) return; if (!InjectDll("D:\\calc.exe", "D:\\mod.dll")) return; printf("success\n"); }