Получить полный путь файла процесса по его PID

Тема в разделе "WASM.WIN32", создана пользователем cc, 17 окт 2006.

  1. cc

    cc New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    34
    Пишется что-то вроде системы защиты. Одним из аспектов безопасности является запрет запуска процессов, запуск которых явно не разрешен :). То бишь имеется база, в которой прописаны приложения, которым запускаться можно, при попытке запуска остальных выводится соответствующее сообщение, типа "Запуск невозможен, обратитесь к администратору". Теперь суть проблемы. Я перехватываю ZwResumeThread, там как известно передается хэндл потока, по нему, через NtQueryInformationThread получаю PID процесса, владеющего этим потоком. И вот теперь мне нужно получить как-то полный путь к этому процессу. Toolhelp API, Ps API и другие не помогают, говорят, что для их работы поток должен быть сначала проинициализирован через ZwResumeThread, а мне его запускать то нельзя, пока не проверю, возможен ли запуск этого приложения или нет! Кто-то советовал использовать NtQueryInformationProcess, но я там сколько не смотрел, так и не нашел, где можно узнать путь к процессу. Пишется все это дело под Win2000. Буду признателен любой помощи.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
  3. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    если NtQueryInformationProcess, то ProcessBasicInformation и в PEB.ProcessParameters
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    В R0 вряд ли такое пройдёт.
     
  5. cc

    cc New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    34
    Ага, вроде понял. А можете дать описание PEB? Или хотя бы ссылку? А то у меня описания PEB из различных источников и сильно различаются.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    по смещению 10h лежит адрес ProcessParameters.
    Код (Text):
    1. typedef struct _RTL_USER_PROCESS_PARAMETERS
    2. {
    3.     ULONG               AllocationSize;
    4.     ULONG               Size;
    5.     ULONG               Flags;
    6.     ULONG               DebugFlags;
    7.     HANDLE              hConsole;
    8.     ULONG               ProcessGroup;
    9.     HANDLE              hStdInput;
    10.     HANDLE              hStdOutput;
    11.     HANDLE              hStdError;
    12.     UNICODE_STRING      CurrentDirectoryName;
    13.     HANDLE              CurrentDirectoryHandle;
    14.     UNICODE_STRING      DllPath;
    15.     UNICODE_STRING      ImagePathName;
    16.     UNICODE_STRING      CommandLine;
    17.     PWSTR               Environment;
    18.     ULONG               dwX;
    19.     ULONG               dwY;
    20.     ULONG               dwXSize;
    21.     ULONG               dwYSize;
    22.     ULONG               dwXCountChars;
    23.     ULONG               dwYCountChars;
    24.     ULONG               dwFillAttribute;
    25.     ULONG               dwFlags;
    26.     ULONG               wShowWindow;
    27.     UNICODE_STRING      WindowTitle;
    28.     UNICODE_STRING      Desktop;
    29.     UNICODE_STRING      ShellInfo;
    30.     UNICODE_STRING      RuntimeInfo;
    31.     RTL_DRIVE_LETTER_CURDIR DLCurrentDirectory[0x20];
    32. } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Код (Text):
    1. typedef struct _PEB
    2. {
    3.     BYTE InheritedAddressSpace;
    4.     BYTE ReadImageFileExecOptions;
    5.     BYTE BeingDebugged;
    6.     BYTE SpareBool;
    7.     void* Mutant;
    8.     void* ImageBaseAddress;
    9.     struct _PEB_LDR_DATA* Ldr;
    10.     struct _RTL_USER_PROCESS_PARAMETERS* ProcessParameters;
    11.     void* SubSystemData;
    12.     void* ProcessHeap;
    13.     void* FastPebLock;
    14.     void* FastPebLockRoutine;
    15.     void* FastPebUnlockRoutine;
    16.     DWORD EnvironmentUpdateCount;
    17.     void* KernelCallbackTable;
    18.     DWORD SystemReserved[2];
    19.     struct _PEB_FREE_BLOCK* FreeList;
    20.     DWORD TlsExpansionCounter;
    21.     void* TlsBitmap;
    22.     DWORD TlsBitmapBits[2];
    23.     void* ReadOnlySharedMemoryBase;
    24.     void* ReadOnlySharedMemoryHeap;
    25.     void** ReadOnlyStaticServerData;
    26.     void* AnsiCodePageData;
    27.     void* OemCodePageData;
    28.     void* UnicodeCaseTableData;
    29.     DWORD NumberOfProcessors;
    30.     DWORD NtGlobalFlag;
    31.     LARGE_INTEGER CriticalSectionTimeout;
    32.     DWORD HeapSegmentReserve;
    33.     DWORD HeapSegmentCommit;
    34.     DWORD HeapDeCommitTotalFreeThreshold;
    35.     DWORD HeapDeCommitFreeBlockThreshold;
    36.     DWORD NumberOfHeaps;
    37.     DWORD MaximumNumberOfHeaps;
    38.     void** ProcessHeaps;
    39.     void* GdiSharedHandleTable;
    40.     void* ProcessStarterHelper;
    41.     DWORD GdiDCAttributeList;
    42.     void* LoaderLock;
    43.     DWORD OSMajorVersion;
    44.     DWORD OSMinorVersion;
    45.     WORD OSBuildNumber;
    46.     WORD OSCSDVersion;
    47.     DWORD OSPlatformId;
    48.     DWORD ImageSubsystem;
    49.     DWORD ImageSubsystemMajorVersion;
    50.     DWORD ImageSubsystemMinorVersion;
    51.     DWORD ImageProcessAffinityMask;
    52.     DWORD GdiHandleBuffer[34];
    53.     void* PostProcessInitRoutine;
    54.     void* TlsExpansionBitmap;
    55.     DWORD TlsExpansionBitmapBits[32];
    56.     DWORD SessionId;
    57.     ULARGE_INTEGER AppCompatFlags;
    58.     void* pShimData;
    59.     void* AppCompatInfo;
    60.     UNICODE_STRING CSDVersion;
    61.     void* ActivationContextData;
    62.     void* ProcessAssemblyStorageMap;
    63.     void* SystemDefaultActivationContextData;
    64.     void* SystemAssemblyStorageMap;
    65.     DWORD MinimumStackCommit;
    66. } PEB;
    я пользовался этим описанием.
    А зачем нужно перехватывать ZwResumeThread?
    Не проще поставить PsSetCreateProcessNotifyRoutine и далее через Eprocess?
     
  8. cc

    cc New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2006
    Сообщения:
    34
    n0name, cresta, благодарю за структуры, вроде помогли. :)
    cresta: может и проще, да только реализовать мне это надо в третьем кольце, а PsSetCreateProcessNotifyRoutine. насколько я помню, находится в ntoskrnl.exe
     
  9. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Поддержал старую тему) n0name скажи плиз. А это смещение для всех Windows действительно или оно отличается ?
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    для x64 и Vista не знаю, для остальных AFAIR действительно для всех.
     
  11. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Защита в r3 не очень долго проживет :)
     
  12. xh4ck

    xh4ck New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2005
    Сообщения:
    60
    Адрес:
    Russia
    смотря от кого защищаться =)
     
  13. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    n0name

    И в x86 висте покатит. По крайней мере все интересные поля на месте.
     
  14. liliput

    liliput New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    22
    Аналогичная проблема, тока одному r3 процессу надо отловить другой..., а корректно ли просто прочитать юникод стринг с адреса 20498h, без NTQueryInformationProcess? Вроде во всех ХР по этому адресу и находится путь к екзешнику...это и есть ImagePathName ?

    Кстати в MSDN апрель 2007 :

    Код (Text):
    1. typedef struct _PEB
    2. {  
    3. BYTE Reserved1[2];  
    4. BYTE BeingDebugged;  
    5. BYTE Reserved2[9];  
    6. PPEB_LDR_DATA LoaderData;  
    7. PRTL_USER_PROCESS_PARAMETERS ProcessParameters;  
    8. BYTE Reserved3[312];  
    9. PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;  
    10. BYTE Reserved4[132];  
    11. ULONG SessionId;
    12. } PEB,  *PPEB;
    13.  
    14. typedef struct _RTL_USER_PROCESS_PARAMETERS
    15. {  
    16. BYTE Reserved1[56];  
    17. UNICODE_STRING ImagePathName;  
    18. UNICODE_STRING CommandLine;  
    19. BYTE Reserved2[92];
    20. } RTL_USER_PROCESS_PARAMETERS,  *PRTL_USER_PROCESS_PARAMETERS;
    Чъему верить описанию PEB - x3...
     
  15. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Эти структуры не перетасовываются. Выкинь это описание. У них эта структура в MSDN документируется в год по полю. PEB если и меняется, то новые поля добавляются в _конец_.

    Предложенный тобой метод забивания констант - кривой, адрес PEB легко получается через NtQueryInformationProcess или через TEB. Путь к экзешнику можно ещё получить из лоадер блока. Проверено на всех NT от 4 до 6, одно и то же.
     
  16. liliput

    liliput New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    22
    просто у меня почему то не работает NTQueryInformationProcess ;(
    в олли дохожу до ZwQueryInformationProcess, вроде SYSENTER вижу...
    Код (Text):
    1. ...
    2. mov eax,9a
    3. mov edx,7ffe0300
    4. call near dword ptr ds:[edx] ; собссно ZwQueryInformationProcess
    5. ret 14 ;
    6. ...
    но буфер для PEB не заполняется...при возврате из NtQueryInformationProcess eax=2 ,это NTSTATUS вроде.
    почему вызов может не работать? что-то я не так делаю, но вот что - я хз... опыта, к сожалению нету, так что сильно не пинайте :)
    зы.
    А кривой способ хотя бы работает, в принципе, хотя я и согласен, что ето неорганично.
     
  17. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Код на паскале, но принцип должен быть понятен.
    Для этой функции нужен хэндл процесса.

    Код (Text):
    1.  
    2. var
    3. pBuf: PROCESS_BASIC_INFORMATION;
    4.  
    5. begin
    6.   ZwQueryInformationProcess(hProcess, ProcessBasicInformation, @pBuf, sizeof(PROCESS_BASIC_INFORMATION), @bytesIO);
    7.  
    8. end;
     
  18. liliput

    liliput New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    22
    Код (Text):
    1. .data
    2. ...
    3. hProcess     dd 0
    4. PEBSize  dd 0
    5. PEB  db 1030    dup (0)
    6. path_uni  db 1030 dup (0)
    7. TMP1    DWORD 0
    8. TMP2    DWORD 0
    9. TMP3    DWORD 0
    10. ...
    11. .code
    12. ...
    13. ;-------кусок собссно
    14.  
    15.  invoke  GetWindowThreadProcessId,eax,ADDR TMP1
    16.  invoke KillTimer,hWin,TimerID2;
    17.  invoke  OpenProcess,PROCESS_ALL_ACCESS,0,TMP1
    18.  mov     hProcess,eax ;досюда всё работает
    19. ;-------начало лажи
    20.  
    21.  invoke NtQuerySystemTime,addr TMP2 ;тоже кстати не работает
    22.  invoke NtQueryInformationProcess,hProcess,0,addr PEB[0],1000,addr PEBSize
    23.  
    24.  ;--------но после вызова буфер пуст, PEBSize =0 (((... поэтому делаем так
    25.  
    26.  mov    TMP2,00020498h
    27.  invoke  ReadProcessMemory,hProcess,TMP2,ADDR path_uni,1024,ADDR TMP3;читаем путь и парсим
    28. ...
    при возврате в eax=2 вроде в ntstatus.h
    #define STATUS_WAIT_2 ((NTSTATUS)0x00000002L)
    что бы это значило ?
     
  19. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    1.
    у тебя TMP2 объявлен как DWORD, в то время как
    Код (Text):
    1. NTSYSAPI
    2. NTSTATUS
    3. NTAPI
    4. NtQuerySystemTime(
    5.     OUT PLARGE_INTEGER pSystemTime
    6. );
    т.е. передавать ей нужно указатель на структуру LARGE_INTEGER
    2.
    вот уж насмешил! :lol:
    NtQueryInformationProcess с ProcessBasicInformation (второй параметр) заполняет структуру PROCESS_BASIC_INFORMATION, одним из полей которой является адрес PEB, но никак не сам PEB!
    например:
    NtQueryInformationProcess (hProc, 0, &PBI, sizeof(PBI), 0);

    ЗЫ: тебе бы не помешало покурить доки в сторону использования NtQueryInformationProcess и вообще NativeAPI
     
  20. liliput

    liliput New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    22
    про п.2 - во , это хорошо, что насмешил, конечно :) но разве название структуры вияет как-нибудь на работоспособность ф-ции? PIB -это ведь тоже структура в секции .data ?
    буфер, адрес которого передается в NtQueryInformationProcess, не заполняется... я бы разобрался, если бы увидел там хоть что-то, кроме нулей...
    про п.1 пасибо, ток это всё равно не фурычит
    зы.
    я тока начал пытаться использовать NtXXXXXX, до этого как-то обходился - ни фига не получается, вообще вызовы NtXXXX не работают у мну :dntknw:
    а кроме мсдн у меня ничего по теме нет из букварей, подскажите авторов толковых, шоб с нуля :) сорри за оффтоп.