ULONG GetCsrPid()
{
NTSTATUS ntStatus;
HANDLE Process, hObject;
NTSTATUS St;
ULONG CsrId = 0;
OBJECT_ATTRIBUTES obj;
CLIENT_ID cid;
POBJECT_NAME_INFORMATION ObjName;
UNICODE_STRING ApiPortName;
PSYSTEM_HANDLE_INFORMATION_EX Handles;
int i;
RtlInitUnicodeString(&ApiPortName, L"\\Windows\\ApiPort");
Handles = GetInfoTable( SystemHandleInformation );
if( Handles == NULL )
return 0;
ObjName = ExAllocatePool( PagedPool, 0x2000 );
DbgPrint("CCRootkit: Number of handles %d", Handles->NumberOfHandles);
for( i = 0; i != Handles->NumberOfHandles; i++ )
{ //´ò¿ªµÄ¶ÔÏóµÄÀàÐÍÊÇ·ñΪ21
if (Handles->Information.ObjectTypeNumber == 21) //Port object
{
InitializeObjectAttributes(
&obj,
NULL,
OBJ_KERNEL_HANDLE,
NULL,
NULL);
cid.UniqueProcess = (HANDLE)Handles->Information.ProcessId;
cid.UniqueThread = 0;
ntStatus = ZwOpenProcess(&Process, PROCESS_DUP_HANDLE, &obj, &cid);
if( NT_SUCCESS(ntStatus) )
{
ntStatus = ZwDuplicateObject(
Process,
(HANDLE)Handles->Information.Handle,
NtCurrentProcess(),
&hObject,
0,
0,
DUPLICATE_SAME_ACCESS);
if( NT_SUCCESS(ntStatus) )
{
ntStatus = ZwQueryObject(
hObject,
ObjectNameInformation,
ObjName,
0x2000,
NULL);
if( NT_SUCCESS(ntStatus) )
{
if (ObjName->Name.Buffer != NULL)
{
if ( wcsncmp(ApiPortName.Buffer,
ObjName->Name.Buffer, 20) == 0 )
{
DbgPrint("CCRootkit: Csrss PID:%d",
Handles->Information.ProcessId);
DbgPrint("CCRootkit: Csrss Port - %ws", ObjName->Name.Buffer);
CsrId = Handles->Information.ProcessId;
ZwClose( Process );
ZwClose( hObject );
CsrId = Handles->Information.ProcessId;
ExFreePool( Handles );
ExFreePool( ObjName );
return CsrId;
}
}
} else
DbgPrint("CCRootkit: Error in Query Object");
ZwClose(hObject);
} else
DbgPrint("CCRootkit: Error on duplicating object");
ZwClose(Process);
} else
DbgPrint("CCRootkit: Could not open process");
}
}
ExFreePool( Handles );
ExFreePool( ObjName );
return 0;
}
这个段代码在网上很好找 问题是ObjName->Name.Buffer 这个地方我在win7下调试 输出的是\Default或者是\WindowLong 而得不到\\Windows\\ApiPort 这是怎么回事啊 是在win7下测试的 谢谢
[培训]科锐逆向工程师培训第53期2025年7月8日开班!