рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдП, рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рд╕рдХреНрд░рд┐рдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ (рдзреНрдпрд╛рди рджреЗрдВ, рдХреЗрд╡рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рднреА рд╣реИрдВред POSIX рдФрд░ OS / 2, рдЬреЛ, рдПрдХ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ, рдЕрдм рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ),
CSR_PROCESS рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рд╕реВрдЪреА, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рд╕реВрдЪреА
CSRSS рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИред
CSRSS рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛
PsActiveProcessHead (рдпрд╣ рджреЛрд╣рд░реА рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА
EPROCESS рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛
" csrss..exe " рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ, рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ IPD / рдПрдВрдЯреА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -Rootkit рдореЙрдбреНрдпреВрд▓, рддреЛ рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд░реВрдЯрдХрд┐рдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА (
DKOM рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рдХреЗ ) рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рд╕рд┐рд╕реНрдЯрдо рдмреВрдЯ рдХреЗ рджреМрд░рд╛рди, рдХрдИ рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ,
CSRSS рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж,
CSRSS ApiPort рдирд╛рдордХ рдПрдХ
ALPC рдкреЛрд░реНрдЯ рднреА рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде
CSRSS рдЕрдкрдиреЗ API рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
ApiPort рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж,
CSRSS рдПрдХ
CsrApiRequestThread рдереНрд░реЗрдб рдмрдирд╛рддрд╛ рд╣реИ
, рдЬреЛ рддрдм
NtAlpcSendWaitReceivePort рдХреЛ рдХреЙрд▓
рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреЛрд░реНрдЯ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд░реНрдЯ рд╣реИрдВрдбрд▓ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИ (рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЪрд┐рддреНрд░ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ,
ApiPort \ Windows рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╕реНрдерд┐рдд рд╣реИред рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ
CSRSS рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ,
рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП
ApiPort рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
\ Session \ N \ Windows рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
ALPC рдореЙрдбрд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдирд┐рд░реНрдгрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдпрд╣ рдерд╛ рдХрд┐ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ (рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ) рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реА рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддреА рд╣реИ рдФрд░, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕реЗ
NtCreatePort рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП,
ApiPort рдкрд░ рдПрдХ рдЦреБрд▓рд╛ рд╡рд┐рд╡рд░рдгрдХ рд╣реИ рдПрдХрдорд╛рддреНрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛
CSRSS рд╣реИ ред
рдЗрди рд╕рднреА рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рдмрд╛рдж, рдЖрдк рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ
CSRSS рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЪрд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
1. рдХрд┐рд╕реА рддрд░рд╣ рдПрдХ
ApiPort рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓рддрд╛ рд╣реИред
2. рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдХрд┐ рдмрдВрджрд░рдЧрд╛рд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рд╕рдВрднрд╛рд▓ рд╣реИред
рдХрджрдо 1редрдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ,
ALOpenObjectByName рдкреНрд░рдХреНрд░рд┐рдпрд╛
ALPC рд╕рд░реНрд╡рд░
рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ
рдХрд░реЗрдЧреА (рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЛрд░реНрдЯ
рдмреЗрдХрд╛рд░ рд╣реИрдВ)ред рдпрджрд┐ рдЖрдк
ALPC рд╕рд░реНрд╡рд░
рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде
ObOpenObjectByName рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдХреЛрдб
STATUS_NOT_IMPLEMENTED рдорд┐рд▓реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
ObReferenceObjectByName рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ:
NTKERNELAPI NTSTATUS ObReferenceObjectByName( __in PUNICODE_STRING ObjectName, __in ULONG Attributes, __in_opt PACCESS_STATE AccessState, __in_opt ACCESS_MASK DesiredAccess, __in POBJECT_TYPE ObjectType, __in KPROCESSOR_MODE AccessMode, __inout_opt PVOID ParseContext, __out PVOID *Object );
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкрддрд╛ рдорд┐рд▓рддрд╛ рд╣реИред
ApiPort рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдореВрдирд╛ рдХреЛрдб:
UNICODE_STRING apiport; PVOID pApiPort; NTSTATUS ret; RtlInitUnicodeString(&apiport,L"\\Windows\\ApiPort"); ret = ObReferenceObjectByName(&apiport,0,0,GENERIC_READ,*LpcPortObjectType,KernelMode,NULL,&pApiPort); DbgPrint("ObOpenObjectByName returned: %x\nOBJECT: %p",ret,pApiPort); if(!NT_SUCCESS(ret)) {
рдиреЛрдЯ!
LpcPortObjectType , LpcWaitablePortObjectType , AlpcPortObjectType - рд╡реЗ рд╕рднреА рдПрдХ рд╣реА OBJECT_TYPE рд╕рдВрд░рдЪрдирд╛ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИрдХрджрдо реиредрджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдореИрдиреЗрдЬрд░ рдХреЗ рдЕрдзреНрдпрдпрди рдореЗрдВ рдереЛрдбрд╝рд╛ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдСрдмреНрдЬреЗрдХреНрдЯ рдореИрдиреЗрдЬрд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ:

рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЗрдбрд░ (OBJECT_HEADERS) "рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЗрдбрд░" рдФрд░ "рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЗрдбрд░" рд╕реЗ рдорд┐рд▓рдХрд░ рдмрдирддрд╛ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЗрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдкреНрд╢рдирд▓ рд╣реЗрдбрд░ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕реНрдерд┐рдд рд╣реИред
1.Object рд╣реИрдбрд░ _OBJECT_HEADER рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
2. рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╕реНрддреБ рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
_OBJECT_HEADER_CREATOR_INFO ,
_OBJECT_HEADER_NAME_INFO ,
_OBJECT_HEADER_HANDLE_INFO ,
_OBJECT_HEADER_QUOTA_INFO ,
_OBJECT_HEADER_PROCESS_INFO ред
рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░ рдореМрдЬреВрдж рд╣реИрдВ,
_OBJECT_HEADER-> InfoMask рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░,
InfoMask рдПрдХ рдмрд┐рдЯрдорд╛рд╕реНрдХ рд╣реИ рдЬрд╣рд╛рдВ рдмрд┐рдЯреНрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
0x1
_OBJECT_HEADER_CREATOR_INFO0x2
_OBJECT_HEADER_NAME_INFO0x4
_OBJECT_HEADER_HANDLE_INFO0x8
_OBJECT_HEADER_QUOTA_INFO0x10
_OBJECT_HEADER_PROCESS_INFOInfoMask рдХрд╛ рдЙрдкрдпреЛрдЧ
ObpInfoMaskToOffset рдХреЗ рд╕рд░рдгреА (рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ) рдореЗрдВ рдСрдлрд╝рд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдмреЙрдбреА рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╡рд╛рдВрдЫрд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░ рдХреА рдСрдлрд╝рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдСрдлрд╕реЗрдЯ рдЧрдгрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
BYTE HeaderOffset = ObpInfoMaskToOffset[_OBJECT_HEADER->InfoMask & (HeaderBit | (HeaderBit-1))].
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдХрдбрд╝рд╛рдИ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐
ObpInfoMaskToOffset рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╛ рддреЛ рдкреИрдЯрд░реНрди рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рд╣рдо рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдЬреНрдЮрд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ (3 рдФрд░ рддрд░реАрдХреЗ рд╣реИрдВ: рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рд╕рд░рдгреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
ObpInfoMaskToOffset )ред
рдореИрдВрдиреЗ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдЪреБрдирд╛ред
enum OBJ_HEADER_INFO_FLAG { HeaderCreatorInfoFlag = 0x1, HeaderNameInfoFlag = 0x2, HeaderHandleInfoFlag= 0x4, HeaderQuotaInfoFlag= 0x8, HeaderProcessInfoFlag= 0x10 }; BYTE GetObjectHeaderOffset( BYTE InfoMask,OBJ_HEADER_INFO_FLAG Flag) { BYTE OffsetMask,HeaderOffset=0; if( (InfoMask & Flag) == 0 ) return 0; OffsetMask = InfoMask & ( Flag | (Flag - 1) ); if((OffsetMask & HeaderCreatorInfoFlag) != 0) HeaderOffset += (BYTE)sizeof(OBJECT_HEADER_CREATOR_INFO); if((OffsetMask & HeaderNameInfoFlag) != 0) HeaderOffset += (BYTE)sizeof(OBJECT_HEADER_NAME_INFO); if((OffsetMask & HeaderHandleInfoFlag) != 0) HeaderOffset += (BYTE)sizeof(OBJECT_HEADER_HANDLE_INFO); if((OffsetMask & HeaderQuotaInfoFlag) != 0) HeaderOffset += (BYTE)sizeof(OBJECT_HEADER_QUOTA_INFO); if((OffsetMask & HeaderProcessInfoFlag) != 0) HeaderOffset += (BYTE)sizeof(OBJECT_HEADER_PROCESS_INFO); return HeaderOffset; } POBJECT_HEADER_HANDLE_INFO GetObjectHeaderHandleInfo(POBJECT_HEADER pObjHeader) {
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ
GetObjectHeaderHandleInfo () рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ
, рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдореЗрдВ
_OBJECT_HEADER_HANDLE_INFO рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
typedef struct _OBJECT_HANDLE_COUNT_ENTRY // 3 elements, 0x10 bytes (sizeof) { PEPROCESS Process; struct // 2 elements, 0x4 bytes (sizeof) { ULONG32 HandleCount : 24;
_OBJECT_HEADER_HANDLE_INFO рдореЗрдВ рдПрдХ рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рд╕рдВрдШ рд╣реИ, рдФрд░ рд╕рдВрдШ рдореЗрдВ рджреЛ рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
HandleCountDataBase ,
SingleEntry (_OBJECT_HEADER-> рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдлрд╝реАрд▓реНрдб рд╣реИ)ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ,
OB_FLAG_SINGLE_HANDLE_ENTRY (0x40) рдзреНрд╡рдЬ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ SingleEntry рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ,
HandleCountDataBase (рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, HandleCountDataBase рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдореЗрд╢рд╛
ALPC рдкреЛрд░реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП,
HandCountDataBase рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), HandCountDataBase рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред ) рдФрд░ рджреВрд╕рд░рд╛ рддрддреНрд╡ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛрддрд╛ рд╣реИред
рддреЛ рдпрд╣рд╛рдБ рдХреЛрдб рдХрд╛ рдЕрдВрддрд┐рдо рднрд╛рдЧ рд╣реИ:
UNICODE_STRING apiport; POBJECT_HEADER pApiPortHeader; POBJECT_HEADER_HANDLE_INFO pHandleInfo; PVOID pApiPort; NTSTATUS ret; PEPROCESS procCSRSS; RtlInitUnicodeString(&apiport,L"\\Windows\\ApiPort"); ret = ObReferenceObjectByName(&apiport,0,0,GENERIC_READ,*LpcPortObjectType,KernelMode,NULL,&pApiPort); DbgPrint("ObOpenObjectByName returned: %x\nOBJECT: %p \nIndex: %d",ret,pApiPort,(*LpcPortObjectType)->Index); if(!NT_SUCCESS(ret)) DbgPrint("Can not reference ApiPort: %x",ret); pApiPortHeader = OBJECT_TO_OBJECT_HEADER(pApiPort); pHandleInfo = GetObjectHeaderHandleInfo(pApiPortHeader); DbgPrint("Handle Info:%p\nOBject:%p\nSIZEOF:%d",pHandleInfo,pApiPortHeader,sizeof(OBJECT_HEADER_NAME_INFO)); if(pHandleInfo != NULL) { if(pApiPortHeader->Flags & OB_FLAG_SINGLE_HANDLE_ENTRY) procCSRSS = pHandleInfo->SingleEntry.Process; else procCSRSS = pHandleInfo->HandleCountDataBase->HandleCountEntries[0].Process; DbgPrint("CSRSS: %p",procCSRSS); } else { DbgPrint("Can not obtain Handle Info Header for ApiPort"); } ObDereferenceObject(pApiPort);
рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЗрдбрд░реНрд╕ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рдЙрдкрджреНрд░рд╡ рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╕ рдХреНрд╖реЗрддреНрд░ ALPC_PORT-> OwnerProcess рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, (рд╣рдо рд╕реВрдЪрдХ рдХреЛ ObReferenceObjectByName рд╕реЗ ALPC_PORT рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ), рдмрд╕ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп, рдореБрдЭреЗ рдЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╣реИрдВрдбрд▓ рд╣реИрдВред рдореИрдВ ALPC_PORT рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдЧреБрд░реНрджреЗ рдореЗрдВ рдордд рдорд╛рд░реЛ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЗрдбрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдЕрднреА рднреА рдЙрдкрдпреЛрдЧреА рдереАредрд╡рд╣ рд╕рдм рд╣реИ!
рд▓рд┐рдВрдХ
рд╡рд┐рдВрдбреЛрдЬ 7 рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЗрдбрд░