Пишется что-то вроде системы защиты. Одним из аспектов безопасности является запрет запуска процессов, запуск которых явно не разрешен . То бишь имеется база, в которой прописаны приложения, которым запускаться можно, при попытке запуска остальных выводится соответствующее сообщение, типа "Запуск невозможен, обратитесь к администратору". Теперь суть проблемы. Я перехватываю ZwResumeThread, там как известно передается хэндл потока, по нему, через NtQueryInformationThread получаю PID процесса, владеющего этим потоком. И вот теперь мне нужно получить как-то полный путь к этому процессу. Toolhelp API, Ps API и другие не помогают, говорят, что для их работы поток должен быть сначала проинициализирован через ZwResumeThread, а мне его запускать то нельзя, пока не проверю, возможен ли запуск этого приложения или нет! Кто-то советовал использовать NtQueryInformationProcess, но я там сколько не смотрел, так и не нашел, где можно узнать путь к процессу. Пишется все это дело под Win2000. Буду признателен любой помощи.
Ага, вроде понял. А можете дать описание PEB? Или хотя бы ссылку? А то у меня описания PEB из различных источников и сильно различаются.
по смещению 10h лежит адрес ProcessParameters. Код (Text): typedef struct _RTL_USER_PROCESS_PARAMETERS { ULONG AllocationSize; ULONG Size; ULONG Flags; ULONG DebugFlags; HANDLE hConsole; ULONG ProcessGroup; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; UNICODE_STRING CurrentDirectoryName; HANDLE CurrentDirectoryHandle; UNICODE_STRING DllPath; UNICODE_STRING ImagePathName; UNICODE_STRING CommandLine; PWSTR Environment; ULONG dwX; ULONG dwY; ULONG dwXSize; ULONG dwYSize; ULONG dwXCountChars; ULONG dwYCountChars; ULONG dwFillAttribute; ULONG dwFlags; ULONG wShowWindow; UNICODE_STRING WindowTitle; UNICODE_STRING Desktop; UNICODE_STRING ShellInfo; UNICODE_STRING RuntimeInfo; RTL_DRIVE_LETTER_CURDIR DLCurrentDirectory[0x20]; } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
Код (Text): typedef struct _PEB { BYTE InheritedAddressSpace; BYTE ReadImageFileExecOptions; BYTE BeingDebugged; BYTE SpareBool; void* Mutant; void* ImageBaseAddress; struct _PEB_LDR_DATA* Ldr; struct _RTL_USER_PROCESS_PARAMETERS* ProcessParameters; void* SubSystemData; void* ProcessHeap; void* FastPebLock; void* FastPebLockRoutine; void* FastPebUnlockRoutine; DWORD EnvironmentUpdateCount; void* KernelCallbackTable; DWORD SystemReserved[2]; struct _PEB_FREE_BLOCK* FreeList; DWORD TlsExpansionCounter; void* TlsBitmap; DWORD TlsBitmapBits[2]; void* ReadOnlySharedMemoryBase; void* ReadOnlySharedMemoryHeap; void** ReadOnlyStaticServerData; void* AnsiCodePageData; void* OemCodePageData; void* UnicodeCaseTableData; DWORD NumberOfProcessors; DWORD NtGlobalFlag; LARGE_INTEGER CriticalSectionTimeout; DWORD HeapSegmentReserve; DWORD HeapSegmentCommit; DWORD HeapDeCommitTotalFreeThreshold; DWORD HeapDeCommitFreeBlockThreshold; DWORD NumberOfHeaps; DWORD MaximumNumberOfHeaps; void** ProcessHeaps; void* GdiSharedHandleTable; void* ProcessStarterHelper; DWORD GdiDCAttributeList; void* LoaderLock; DWORD OSMajorVersion; DWORD OSMinorVersion; WORD OSBuildNumber; WORD OSCSDVersion; DWORD OSPlatformId; DWORD ImageSubsystem; DWORD ImageSubsystemMajorVersion; DWORD ImageSubsystemMinorVersion; DWORD ImageProcessAffinityMask; DWORD GdiHandleBuffer[34]; void* PostProcessInitRoutine; void* TlsExpansionBitmap; DWORD TlsExpansionBitmapBits[32]; DWORD SessionId; ULARGE_INTEGER AppCompatFlags; void* pShimData; void* AppCompatInfo; UNICODE_STRING CSDVersion; void* ActivationContextData; void* ProcessAssemblyStorageMap; void* SystemDefaultActivationContextData; void* SystemAssemblyStorageMap; DWORD MinimumStackCommit; } PEB; я пользовался этим описанием. А зачем нужно перехватывать ZwResumeThread? Не проще поставить PsSetCreateProcessNotifyRoutine и далее через Eprocess?
n0name, cresta, благодарю за структуры, вроде помогли. cresta: может и проще, да только реализовать мне это надо в третьем кольце, а PsSetCreateProcessNotifyRoutine. насколько я помню, находится в ntoskrnl.exe
Поддержал старую тему) n0name скажи плиз. А это смещение для всех Windows действительно или оно отличается ?
Аналогичная проблема, тока одному r3 процессу надо отловить другой..., а корректно ли просто прочитать юникод стринг с адреса 20498h, без NTQueryInformationProcess? Вроде во всех ХР по этому адресу и находится путь к екзешнику...это и есть ImagePathName ? Кстати в MSDN апрель 2007 : Код (Text): typedef struct _PEB { BYTE Reserved1[2]; BYTE BeingDebugged; BYTE Reserved2[9]; PPEB_LDR_DATA LoaderData; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; BYTE Reserved3[312]; PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine; BYTE Reserved4[132]; ULONG SessionId; } PEB, *PPEB; typedef struct _RTL_USER_PROCESS_PARAMETERS { BYTE Reserved1[56]; UNICODE_STRING ImagePathName; UNICODE_STRING CommandLine; BYTE Reserved2[92]; } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS; Чъему верить описанию PEB - x3...
Эти структуры не перетасовываются. Выкинь это описание. У них эта структура в MSDN документируется в год по полю. PEB если и меняется, то новые поля добавляются в _конец_. Предложенный тобой метод забивания констант - кривой, адрес PEB легко получается через NtQueryInformationProcess или через TEB. Путь к экзешнику можно ещё получить из лоадер блока. Проверено на всех NT от 4 до 6, одно и то же.
просто у меня почему то не работает NTQueryInformationProcess ;( в олли дохожу до ZwQueryInformationProcess, вроде SYSENTER вижу... Код (Text): ... mov eax,9a mov edx,7ffe0300 call near dword ptr ds:[edx] ; собссно ZwQueryInformationProcess ret 14 ; ... но буфер для PEB не заполняется...при возврате из NtQueryInformationProcess eax=2 ,это NTSTATUS вроде. почему вызов может не работать? что-то я не так делаю, но вот что - я хз... опыта, к сожалению нету, так что сильно не пинайте зы. А кривой способ хотя бы работает, в принципе, хотя я и согласен, что ето неорганично.
Код на паскале, но принцип должен быть понятен. Для этой функции нужен хэндл процесса. Код (Text): var pBuf: PROCESS_BASIC_INFORMATION; begin ZwQueryInformationProcess(hProcess, ProcessBasicInformation, @pBuf, sizeof(PROCESS_BASIC_INFORMATION), @bytesIO); end;
Код (Text): .data ... hProcess dd 0 PEBSize dd 0 PEB db 1030 dup (0) path_uni db 1030 dup (0) TMP1 DWORD 0 TMP2 DWORD 0 TMP3 DWORD 0 ... .code ... ;-------кусок собссно invoke GetWindowThreadProcessId,eax,ADDR TMP1 invoke KillTimer,hWin,TimerID2; invoke OpenProcess,PROCESS_ALL_ACCESS,0,TMP1 mov hProcess,eax ;досюда всё работает ;-------начало лажи invoke NtQuerySystemTime,addr TMP2 ;тоже кстати не работает invoke NtQueryInformationProcess,hProcess,0,addr PEB[0],1000,addr PEBSize ;--------но после вызова буфер пуст, PEBSize =0 (((... поэтому делаем так mov TMP2,00020498h invoke ReadProcessMemory,hProcess,TMP2,ADDR path_uni,1024,ADDR TMP3;читаем путь и парсим ... при возврате в eax=2 вроде в ntstatus.h #define STATUS_WAIT_2 ((NTSTATUS)0x00000002L) что бы это значило ?
1. у тебя TMP2 объявлен как DWORD, в то время как Код (Text): NTSYSAPI NTSTATUS NTAPI NtQuerySystemTime( OUT PLARGE_INTEGER pSystemTime ); т.е. передавать ей нужно указатель на структуру LARGE_INTEGER 2. вот уж насмешил! NtQueryInformationProcess с ProcessBasicInformation (второй параметр) заполняет структуру PROCESS_BASIC_INFORMATION, одним из полей которой является адрес PEB, но никак не сам PEB! например: NtQueryInformationProcess (hProc, 0, &PBI, sizeof(PBI), 0); ЗЫ: тебе бы не помешало покурить доки в сторону использования NtQueryInformationProcess и вообще NativeAPI
про п.2 - во , это хорошо, что насмешил, конечно но разве название структуры вияет как-нибудь на работоспособность ф-ции? PIB -это ведь тоже структура в секции .data ? буфер, адрес которого передается в NtQueryInformationProcess, не заполняется... я бы разобрался, если бы увидел там хоть что-то, кроме нулей... про п.1 пасибо, ток это всё равно не фурычит зы. я тока начал пытаться использовать NtXXXXXX, до этого как-то обходился - ни фига не получается, вообще вызовы NtXXXX не работают у мну а кроме мсдн у меня ничего по теме нет из букварей, подскажите авторов толковых, шоб с нуля сорри за оффтоп.