Узнать полный путь процесса службы без получения SeDebugPrivilege

Тема в разделе "WASM.WIN32", создана пользователем Vicshann, 6 ноя 2020.

  1. Vicshann

    Vicshann Member

    Публикаций:
    0
    Регистрация:
    22 сен 2020
    Сообщения:
    36
    Возможно ли такое?
    А то недавно только заметил что CreateToolhelp32Snapshot + TH32CS_SNAPMODULE завершается с Access Denied так как пытается сделать NtOpenProcess для чтения памяти процесса.
    Для NtQueryInformationProcess + ProcessImageFileName тоже без NtOpenProcess не обойтись.
    NtQuerySystemInformation + SystemProcessInformation дает только имя исполняемого файла процесса.
    Получение SeDebugPrivilege требует прав админа, и это очень не удобно делать только ради такой мелочи.
     
  2. RETN

    RETN Member

    Публикаций:
    4
    Регистрация:
    4 апр 2020
    Сообщения:
    74
    просто прочитать из реестра, - там все службы прописаны
     
    Rel нравится это.
  3. Vicshann

    Vicshann Member

    Публикаций:
    0
    Регистрация:
    22 сен 2020
    Сообщения:
    36
    Как вариант, именно для службы да. Но интересно было бы иметь универсальную функцию нахождения полного пути любого запущенного процесса.
    Но наверно такое возможно только для драйверов.
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Через WMI можно и путь к образу и аргументы, с которыми сервис запущен, посмотреть:
    [​IMG]
     
    Rel, GRAFik и Vicshann нравится это.
  5. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    по сравнению с обычными процесссами, драйверам всё можно
     
  6. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    352
    Вот блин, век живи, век учись... )) f13nd, а на win7x64 такую же картинку как у вас можно получить через какую-нибудь команду по-быстрому?
     
  7. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Vicshann, можно попробовать как РН: OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION ) и дальше NtQueryInformationProcess (ProcessCommandLineInformation ). Вот не помню, нужны ли там админ права, я это для другого тестил (получить путь к системным процессам, которые с другими правами , кроме как query, не открыть никак даже под админом).
     
    ormoulu нравится это.
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Картинка с dbeaver'а снята. Его можно установить по-быстрому и создать там подключение к WMI. Ну или простенький .vbs скрипт сделать, примеров в интернете как грязи.
     
    GRAFik нравится это.
  9. Vicshann

    Vicshann Member

    Публикаций:
    0
    Регистрация:
    22 сен 2020
    Сообщения:
    36
    Но в итоге WMI все же не годится, так как лочится на ConnectServer при вызове из DllMain.
     
  10. vitokop

    vitokop Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    48
    M0rg0t
    c 'SeDebugPrivilege' можно все....
     

    Вложения:

  11. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
     
  12. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Работает из под пользователя, но с integrity не ниже medium. За иключением нескольких защищенных процессов (но у них все равно путь стандартный).
     
    Vicshann нравится это.
  13. Vicshann

    Vicshann Member

    Публикаций:
    0
    Регистрация:
    22 сен 2020
    Сообщения:
    36
    Вроде то, что нужно, спасибо.
    А к защищенным процессам вряд ли понадобится лезть в ближайшее время:)
     
  14. hiddy

    hiddy Member

    Публикаций:
    0
    Регистрация:
    10 мар 2019
    Сообщения:
    82
    ormoulu нравится это.
  15. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Интересно.
    А того же, но не обернутого в собственные библиотеки на непойми чем, случайно нет? (так, для порядку спрашиваю :blush2:)
     
  16. Panoff

    Panoff New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2020
    Сообщения:
    1
    не работает ваш паскаль код под Low!!!
     
  17. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Panoff, вы шо, таки собрали уже? А чем?
    --- Сообщение объединено, 7 ноя 2020 ---
    upload_2020-11-7_15-9-19.png
     
  18. Vicshann

    Vicshann Member

    Публикаций:
    0
    Регистрация:
    22 сен 2020
    Сообщения:
    36
    Вот это еще лучше:
    Код (C++):
    1.  SYSTEM_PROCESS_ID_INFORMATION SysInfo;
    2. SysInfo.ProcessId = (PVOID)ProcID;
    3. SysInfo.ImageName.Length = 0;
    4. SysInfo.ImageName.MaximumLength = BufferLength * sizeof(wchar_t);
    5. SysInfo.ImageName.Buffer = PathBuffer;
    6. ULONG RetLen = 0;
    7. NTSTATUS Status = NtQuerySystemInformation(SystemProcessIdInformation, &SysInfo, sizeof(SysInfo), &RetLen);
    8.  
     
    ormoulu нравится это.
  19. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    А что делать с путём, ядерные сервисы возвращают его не в дос формате https://wasm.in/threads/harddiscvolume.33003/

    Осевой интерфейс - ссылка на любой обьект идёт через описатель, для которого определены права доступа. Это никак не обойти, может использовать файловый поиск что бы получить полный путь из базовой инфы, имени образа. Будет не быстро, но в обход штатной защиты.
     
  20. Vicshann

    Vicshann Member

    Публикаций:
    0
    Регистрация:
    22 сен 2020
    Сообщения:
    36
    У меня это так делается:
    Код (C++):
    1. long _stdcall NormalizeDrivePath(PWSTR PathBuffer, long BufferLength)
    2. {
    3. wchar_t DrvPath[MAX_PATH];
    4. PROCESS_DEVICEMAP_INFORMATION MDrives;  // size is 36 for both x32/64
    5. PWSTR PathSrcPtr = PathBuffer;
    6. if((PathSrcPtr[0] == '\\') && (PathSrcPtr[7] == '\\') && (PathSrcPtr[1] == 'D') && (PathSrcPtr[6] == 'e'))
    7.   {
    8.   PathSrcPtr  += 8;
    9.   BufferLength -= 8;
    10.   }
    11. if((PathSrcPtr[0] == 'M') && (PathSrcPtr[1] == 'u') && (PathSrcPtr[2] == 'p') && (PathSrcPtr[3] == '\\'))  // NtQueryInformationProcess:ProcessImageFileName returns this for network drives
    12.   {
    13.   PathSrcPtr  += 4;
    14.   BufferLength -= 4;
    15.   }
    16. NTSTATUS stat = NtQueryInformationProcess(NtCurrentProcess, ProcessDeviceMap, &MDrives, sizeof(MDrives), 0);  //DWORD DrvMsk = GetLogicalDrives();  
    17. if(stat < 0)return -1;
    18. DWORD DrvMsk = MDrives.Query.DriveMap;
    19. for(wchar_t DrvIdx = 0; DrvMsk; DrvMsk >>= 1, DrvIdx++)
    20.   {
    21.   if(!(DrvMsk & 1))continue;
    22.   wchar_t Drive[] = {wchar_t('A' + DrvIdx), ':', 0};  
    23.   UINT res = QueryDosDeviceW(Drive, DrvPath, sizeof(DrvPath)/2);  // \Device\LanmanRedirector\;Y:000000000002da76\Desktop-xxxxx\Tools  // \Device\ImDisk1
    24.   if(!res)continue;
    25.   BYTE DriveType = MDrives.Query.DriveType[DrvIdx];
    26.   DrvPath[res] = 0;
    27.   while(!DrvPath[res-1])res--;  // res includes some nulls!
    28.   int RCnt = 2;
    29.   PWSTR PPtr = DrvPath;
    30.   if(DriveType == DRIVE_REMOTE)RCnt += 2;
    31.   for(int idx=0;RCnt && *PPtr;PPtr++,res--)
    32.   {
    33.   if(*PPtr == '\\')RCnt--;
    34.   }
    35.   if(!memcmp(PathSrcPtr, PPtr, res*sizeof(wchar_t)))
    36.   {
    37.   PathBuffer[0] = Drive[0];
    38.   PathBuffer[1] = Drive[1];
    39.   long FLen = BufferLength - res;
    40.   memmove(&PathBuffer[2], &PathSrcPtr[res], FLen*sizeof(wchar_t));
    41.   FLen += 2;
    42.   PathBuffer[FLen] = 0;
    43.   return FLen;
    44.   }
    45.   }
    46. return 0;
    47. }
    Ниже только разбирать ссылки в директории обьектов самостоятельно:)