Возможно ли такое? А то недавно только заметил что CreateToolhelp32Snapshot + TH32CS_SNAPMODULE завершается с Access Denied так как пытается сделать NtOpenProcess для чтения памяти процесса. Для NtQueryInformationProcess + ProcessImageFileName тоже без NtOpenProcess не обойтись. NtQuerySystemInformation + SystemProcessInformation дает только имя исполняемого файла процесса. Получение SeDebugPrivilege требует прав админа, и это очень не удобно делать только ради такой мелочи.
Как вариант, именно для службы да. Но интересно было бы иметь универсальную функцию нахождения полного пути любого запущенного процесса. Но наверно такое возможно только для драйверов.
Вот блин, век живи, век учись... )) f13nd, а на win7x64 такую же картинку как у вас можно получить через какую-нибудь команду по-быстрому?
Vicshann, можно попробовать как РН: OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION ) и дальше NtQueryInformationProcess (ProcessCommandLineInformation ). Вот не помню, нужны ли там админ права, я это для другого тестил (получить путь к системным процессам, которые с другими правами , кроме как query, не открыть никак даже под админом).
Картинка с dbeaver'а снята. Его можно установить по-быстрому и создать там подключение к WMI. Ну или простенький .vbs скрипт сделать, примеров в интернете как грязи.
Работает из под пользователя, но с integrity не ниже medium. За иключением нескольких защищенных процессов (но у них все равно путь стандартный).
Для low integrity: https://gist.github.com/tyranid/ea89038089f8c5f7c614bdcee07c78cb https://github.com/diversenok/Things-AppContainer-Knows Все что выше можно штатными средствами, если не ошибаюсь, нужно смотреть на натив апи.
Интересно. А того же, но не обернутого в собственные библиотеки на непойми чем, случайно нет? (так, для порядку спрашиваю )
Вот это еще лучше: Код (C++): SYSTEM_PROCESS_ID_INFORMATION SysInfo; SysInfo.ProcessId = (PVOID)ProcID; SysInfo.ImageName.Length = 0; SysInfo.ImageName.MaximumLength = BufferLength * sizeof(wchar_t); SysInfo.ImageName.Buffer = PathBuffer; ULONG RetLen = 0; NTSTATUS Status = NtQuerySystemInformation(SystemProcessIdInformation, &SysInfo, sizeof(SysInfo), &RetLen);
А что делать с путём, ядерные сервисы возвращают его не в дос формате https://wasm.in/threads/harddiscvolume.33003/ Осевой интерфейс - ссылка на любой обьект идёт через описатель, для которого определены права доступа. Это никак не обойти, может использовать файловый поиск что бы получить полный путь из базовой инфы, имени образа. Будет не быстро, но в обход штатной защиты.
У меня это так делается: Код (C++): long _stdcall NormalizeDrivePath(PWSTR PathBuffer, long BufferLength) { wchar_t DrvPath[MAX_PATH]; PROCESS_DEVICEMAP_INFORMATION MDrives; // size is 36 for both x32/64 PWSTR PathSrcPtr = PathBuffer; if((PathSrcPtr[0] == '\\') && (PathSrcPtr[7] == '\\') && (PathSrcPtr[1] == 'D') && (PathSrcPtr[6] == 'e')) { PathSrcPtr += 8; BufferLength -= 8; } if((PathSrcPtr[0] == 'M') && (PathSrcPtr[1] == 'u') && (PathSrcPtr[2] == 'p') && (PathSrcPtr[3] == '\\')) // NtQueryInformationProcess:ProcessImageFileName returns this for network drives { PathSrcPtr += 4; BufferLength -= 4; } NTSTATUS stat = NtQueryInformationProcess(NtCurrentProcess, ProcessDeviceMap, &MDrives, sizeof(MDrives), 0); //DWORD DrvMsk = GetLogicalDrives(); if(stat < 0)return -1; DWORD DrvMsk = MDrives.Query.DriveMap; for(wchar_t DrvIdx = 0; DrvMsk; DrvMsk >>= 1, DrvIdx++) { if(!(DrvMsk & 1))continue; wchar_t Drive[] = {wchar_t('A' + DrvIdx), ':', 0}; UINT res = QueryDosDeviceW(Drive, DrvPath, sizeof(DrvPath)/2); // \Device\LanmanRedirector\;Y:000000000002da76\Desktop-xxxxx\Tools // \Device\ImDisk1 if(!res)continue; BYTE DriveType = MDrives.Query.DriveType[DrvIdx]; DrvPath[res] = 0; while(!DrvPath[res-1])res--; // res includes some nulls! int RCnt = 2; PWSTR PPtr = DrvPath; if(DriveType == DRIVE_REMOTE)RCnt += 2; for(int idx=0;RCnt && *PPtr;PPtr++,res--) { if(*PPtr == '\\')RCnt--; } if(!memcmp(PathSrcPtr, PPtr, res*sizeof(wchar_t))) { PathBuffer[0] = Drive[0]; PathBuffer[1] = Drive[1]; long FLen = BufferLength - res; memmove(&PathBuffer[2], &PathSrcPtr[res], FLen*sizeof(wchar_t)); FLen += 2; PathBuffer[FLen] = 0; return FLen; } } return 0; } Ниже только разбирать ссылки в директории обьектов самостоятельно