Для начала в собственном теле.. Думал в TEB'e что интересное найду, но увы... Или может плохо искал? Глобальный хук ZwQuerySystemInformation единственный вариант? В утилите procx у explorer'a и у еще одного процесса нет матери и отца Хочется узнать они от святого духа родились или подлые преступники, и убили своих родителей ) вот скрин:
родитель explorer'a - userinit,завершается вскоре после входа пользователя в систему. рекомендую почитать литературу по внутреннему устройству системы. руссиновичанапример.
typedef struct _OBJECT_HEADER_CREATOR_INFO { LIST_ENTRY TypeList; HANDLE CreatorUniqueProcess; <---------------- USHORT CreatorBackTraceIndex; USHORT Reserved; } OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO; typedef struct _OBJECT_HEADER { LONG_PTR PointerCount; union { LONG_PTR HandleCount; PVOID NextToFree; }; POBJECT_TYPE Type; UCHAR NameInfoOffset; UCHAR HandleInfoOffset; UCHAR QuotaInfoOffset; UCHAR Flags; union { POBJECT_CREATE_INFORMATION ObjectCreateInfo; PVOID QuotaBlockCharged; }; PSECURITY_DESCRIPTOR SecurityDescriptor; QUAD Body; } OBJECT_HEADER, *POBJECT_HEADER;
нуну. изменяйте заголовки объектов. В EPROCESS есть поле InheritedFromUniqueProcessId, скорее всего отсюда и берет значение NtQuerySystemInformation.
Windows XP SP2. NtQuerySysInfo -> ExpGetProcessInfo -> ExpCopyProcessInfo() edi - EPROCESS esi - PSYSTEM_PROCESS_INFORMATION FIELD_OFFSET(EPROCESS_wxp, InheritedFromUniqueProcessId) == 14Ch Код (Text): PAGE:004B2D69 mov eax, [edi+14Ch] PAGE:004B2D6F mov [esi+48h], eax
Для начало следует сказать что InheritedFromUniqueProcessId не является идентификатором процесса, создавшего обьект(процесс), а чемто другим, уже не помню, давно с этим сталкивался. Для UserMode без доступа к ядерной памяти это единственный способ узнать ID процесса, создавшего обьект(именно создавшего, а не владеющего или ещё чтото). NtQuerySystemInformation(InfoClass=SystemObjectInformation) NtQuerySystemInformation: case SystemObjectInformation: if (SystemInformationLength < sizeof( SYSTEM_OBJECTTYPE_INFORMATION )) { return STATUS_INFO_LENGTH_MISMATCH; } Status = ExpGetObjectInformation( SystemInformation, SystemInformationLength, &Length ); -------------------------------------------------------------------------------------- ExpGetObjectInformation()->ObGetObjectInformation() ObGetObjectInformation: ObjectInfo->NextEntryOffset = 0; ObjectInfo->Object = Object; ObjectInfo->CreatorUniqueProcess = CreatorInfo->CreatorUniqueProcess; Три раза редактировал, пока нормально написал..
CreateProcessA -> CreateProcessInternalA -> CreateProcessInternalW -> NtCreateProcessEx -> PspCreateProcess esi - parent EPROCESS ebx - new EPROCESS FIELD_OFFSET(EPROCESS_wxp, UniqueProcessId) == 84h Код (Text): PAGE:004B3707 cmp edi, esi PAGE:004B3709 jz have_not_parent PAGE:004B370F mov eax, [edi+1A8h] PAGE:004B3715 mov [ebx+1A8h], eax PAGE:004B371B mov eax, [edi+84h] PAGE:004B3721 mov [ebx+14Ch], eax может уже хватит высказывать ничем не обоснованные суждения?