首页
社区
课程
招聘
[求助]win7内核如何获取csrss进程的pid
发表于: 2011-6-7 11:11 17462

[求助]win7内核如何获取csrss进程的pid

2011-6-7 11:11
17462
以前xp可以通过"\\Windows\\ApiPort"这样的特殊对象,但是经过测试win7不行。在win7下大家都是怎么做的呢?要注意些什么?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
谁说Win7不行的。。。你代码没写好而已~
如果你是为了ShadowSSDT Hook的话,不用非得找csrss进程,只要不是System不是smss.exe就可以了。。。
2011-6-7 14:20
1
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不是为了ShadowSSDT hook,我是小菜,能够讲的多一点吗?
2011-6-7 14:50
0
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
要是为了ShadowSSDT Hook的话,教主空间有篇文章。说得比较详细。
2011-6-7 15:40
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
贴个某驱动里的源码,未测试~~

char* QueryHandleInfo(SYSTEM_INFORMATION_CLASS SystemInformationClass)
{
  SIZE_T bufferlen=0x4000;
  PVOID buffer;
  NTSTATUS status;
  while ( 1 )
  {
    buffer = ExAllocatePool(NonPagedPool, bufferlen);
    if ( !buffer )
      break;
    status = ZwQuerySystemInformation(SystemInformationClass, buffer, bufferlen, 0);
    if ( status != STATUS_INFO_LENGTH_MISMATCH )
    {
      if ( status == STATUS_SUCCESS )
        return buffer;
      ExFreePool(buffer);
      return 0;
    }
    ExFreePool(buffer);
    bufferlen *= 2;
  }
  return NULL;
}

/*
typedef struct _SYSTEM_HANDLE_INFORMATION {
        ULONG  ProcessId;
        UCHAR  ObjectTypeNumber;
        UCHAR  Flags;
        SHORT  Handle;
        PVOID  Object;
        ACCESS_MASK  GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
*/

HANDLE GetCsrssProcessId()
{
        char* buffer;
        int HandleCount;
        int cnt=0;
        OBJECT_ATTRIBUTES oa;
        CLIENT_ID ClientId;
        HANDLE hTargetProc;
        HANDLE ObjectHandle;
        PVOID Object;
        PEPROCESS ProcessObject;
        char ObjectInformation[500];
        ULONG ReturnLength;
        WCHAR *ObjectName;
        PSYSTEM_HANDLE_INFORMATION pSysHandleInfo;
        PUNICODE_STRING pNameInfo;
        NTSTATUS status;
        BOOL bFound;
        ULONG v3=0;
       
        pNameInfo=(PUNICODE_STRING)ObjectInformation;
        ObjectName=pNameInfo->Buffer;
        if ( *NtBuildNumber >= 6000 )                           // Vista or later
        {
                pfnPsAcquireProcessExitSynchronization = (NTSTATUS (__stdcall *)(PEPROCESS))MmGetSystemRoutineAddress(&usPsAcquireFunName);
                pfnPsReleaseProcessExitSynchronization = (NTSTATUS (__stdcall *)(PEPROCESS))MmGetSystemRoutineAddress(&usPsReleaseFunName);
        }
        buffer = QueryHandleInfo(SystemHandleInformation);            // 使用查询句柄\Windows\ApiPort所有者的方法
        if ( buffer == NULL )
                return 0;
        HandleCount = *(ULONG*)buffer;
        if ( HandleCount ==0  )
        {
                ExFreePool(buffer);
                return 0;
        }
        pSysHandleInfo=(PSYSTEM_HANDLE_INFORMATION)(buffer + sizeof(ULONG));
        while ( 1 )
        {
                InitializeObjectAttributes(&oa,NULL,0x200,NULL,0);
                ClientId.UniqueProcess = (HANDLE)pSysHandleInfo->ProcessId;
                ClientId.UniqueThread = 0;
                if ( NT_SUCCESS(ZwOpenProcess(&hTargetProc, 0x40u, &oa, &ClientId)) )
                {
                        if ( ZwDuplicateObject(hTargetProc, (HANDLE)pSysHandleInfo->Handle, NtCurrentProcess(), &ObjectHandle, 0, 0, 2u) >=0)
                        {
                                if ( ZwQueryObject(ObjectHandle, ObjectTypeInfo, &ObjectInformation, 0x500u, &ReturnLength) >= 0
                                && pNameInfo->Buffer
                                && (!_wcsnicmp(pNameInfo->Buffer, L"Port", 4u) || !_wcsnicmp(pNameInfo->Buffer, L"ALPC Port", 9u))
                                && ZwQueryObject(ObjectHandle, ObjectNameInfo, &ObjectInformation, 0x500u, &ReturnLength) >= 0
                                && pNameInfo->Buffer
                                && ObjectInformation
                                && !_wcsnicmp(L"\\Windows\\ApiPort", pNameInfo->Buffer, 0x10u))
                                break;
                        }
                        else
                        {
                                if (  *NtBuildNumber >= 6000
                                        && pfnPsAcquireProcessExitSynchronization
                                        && pfnPsReleaseProcessExitSynchronization)
                                {
                                        if (NT_SUCCESS(PsLookupProcessByProcessId(ClientId.UniqueProcess, &ProcessObject)))
                                        {
                                                if ( NT_SUCCESS(pfnPsAcquireProcessExitSynchronization(ProcessObject)) )
                                                {
                                                        KeAttachProcess(ProcessObject);
                                                        if ( NT_SUCCESS(ObReferenceObjectByHandle((HANDLE)pSysHandleInfo->Handle, 0x80000000u, 0, 0, &Object, 0)) )
                                                        {
                                                                if ( Object == pSysHandleInfo->Object )
                                                                {
                                                                        if ( NT_SUCCESS(ZwQueryObject((HANDLE)pSysHandleInfo->Handle,ObjectTypeInfo,&ObjectInformation,0x500,&ReturnLength))
                                                                                && pNameInfo->Buffer
                                                                                && !_wcsnicmp(pNameInfo->Buffer, L"ALPC Port", 9)
                                                                                && NT_SUCCESS(ZwQueryObject((HANDLE)pSysHandleInfo->Handle,ObjectNameInfo,&ObjectInformation,0x500,&ReturnLength))
                                                                                && pNameInfo->Buffer
                                                                                && ObjectInformation
                                                                                && !_wcsnicmp(pNameInfo->Buffer, L"\\Windows\\ApiPort", 16))
                                                                        {
                                                                                bFound = TRUE;
                                                                        }
                                                                }
                                                        }
                                                        if ( Object )
                                                                ObfDereferenceObject(Object);
                                                        pfnPsReleaseProcessExitSynchronization(ProcessObject);
                                                        KeDetachProcess();
                                                        ObfDereferenceObject(ProcessObject);
                                                        ZwClose(hTargetProc);
                                                        if ( bFound )
                                                        {
                                                                ExFreePool(buffer);
                                                                return ClientId.UniqueProcess;                // 找到Csrss.exe的PID
                                                        }
                                                }
                                                else
                                                {
                                                        ObfDereferenceObject(ProcessObject);
                                                }
                                        }
                                }
                                ZwClose(hTargetProc);
                        }
                ZwClose(ObjectHandle);
                }//enfif of OpenProcess
        ++cnt;
        pSysHandleInfo++;
        if ( cnt >= HandleCount )
        {
                ExFreePool(buffer);
                return 0;
        }
        bFound = FALSE;
        }//end of while
        ExFreePool(buffer);
        ZwClose(ObjectHandle);
        ZwClose(hTargetProc);
        return ClientId.UniqueProcess;
}
2011-6-7 17:00
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
非常感谢,学习~~
2011-6-7 18:27
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
7
向里面注入一个线程获取吧
2011-6-8 12:37
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
8
我一般是r3,CsrGetProcessId,然后传到r0去
切换用户后要重新获取
2011-6-8 14:15
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我今天测试了一下(win7中),上面那段驱动的代码获取的是csrss进程Session0的的PID,由r3层获取csrss的pid然后传入r0也可以,r3层我是用Toolhelp获取,你是用的什么方法呢?
2011-6-8 16:35
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
10
Session 0的pid在某些情况下是没法使用的

我的方法是r3,调用未公开API - ntdll.CsrGetProcessId,返回和这个r3程序同一个Session的csrss的pid传到r0(如果就一个桌面,一般来说,获取到的就是session 1)
2011-6-8 16:38
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好东西,mark下研究研究
2011-6-8 16:54
0
雪    币: 2271
活跃值: (2160)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
12
海风的方法挺简单的, 学习了.
2011-6-19 18:16
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
13
路过,远离csrss.exe很多年了~有需要的时候,直接hook一下ZwReadFile然后看调用者名是csrss.exe记录一下pid就好~何必枚举~~~
2011-6-19 18:44
0
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
数字里面的大牛写的还是很标准D……
2011-6-19 22:18
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
15
呵,不管是键盘还是鼠标,都得用到这玩意儿。。。
2011-6-19 22:29
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
16
查询句柄信息这块儿我觉得循环次数太多。。。可能是考虑兼容Win2000才这么写的吧,要不然两次就行了~
2011-6-19 22:32
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
17
话说 如果是键盘鼠标,直接XX kbdclass.sys和mouclass.sys多好
2011-6-20 08:44
0
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
调用者名这个……是不是不够可靠……
2011-6-20 09:41
0
雪    币: 1040
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
一直以为这个是风格出的……不晓得2K怎么处理的……
2011-6-20 09:42
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
这不就是365的代码
2011-7-22 11:22
0
游客
登录 | 注册 方可回帖
返回
//