首页
社区
课程
招聘
[求助][求助]内核获取csrss进程Id的问题 (有代码)
发表于: 2010-9-25 18:36 8960

[求助][求助]内核获取csrss进程Id的问题 (有代码)

2010-9-25 18:36
8960
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日开班!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
如果是要win32k的内存映射,随便一个ui进程就可以了,比如explorer.exe
如果是要csrss.exe直接枚举进程,可以找到

何必那么复杂的枚举handle~
2010-9-25 23:56
0
雪    币: 112
活跃值: (48)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
3
根据特殊命名对象找csrss进程
2010-10-7 09:46
0
雪    币: 172
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
看看360的hookport.sys就知道了
2010-10-8 09:45
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你那个代码WIN7下不能用,win7、VISTA下alpc port对象不能duplicate/create
2010-10-9 01:43
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
先attach到那个进程 然后 才能这样子操作 xp就不用
2011-2-28 18:32
0
游客
登录 | 注册 方可回帖
返回