首页
社区
课程
招聘
[原创]Csrss进程剖析
发表于: 2012-5-6 19:00 19087

[原创]Csrss进程剖析

2012-5-6 19:00
19087

这几天想了解下神秘的进程csrss,在学习和了解的过程中就写下了自己对csrss进程的理解。


   Csrss(客户端/服务器运行时子系统)是 Win32 子系统的用户模式部分,在桌面管理、终端登录、控制台管理、错误报告报告和DOS 虚拟机等方面起着重要作用,另外还监控着系统内所有Win32 子系统进程和线程的运行,进程的创建与退出,都需要通知Csrss。


        图1是用内核工具xuetr观察Csrss进程加载的模块。(以下的分析环境为xp sp2 32位)


                           


                               图1


       


        由图1中我们可以知道Csrss进程除了加载诸如Kernel32,ntdll等基础模块之外,basesrv.dll,csrsrv.dll ,winsrv.dll就是Csrss进程的核心模块,因此我们重点研究这几个模块,当然研究这几个模块就要那个这几个模块的pdb文件,我们利用windbg提供的工具SymChk 下载这几个模块的pdb文件,首先在cmd命令行中进入windbg目录,然后用如下命令:


Symchk /r  c:\windows\system32 /s SRV*c:\mysymbols\*



        如图2.


                                       


                                            图2


       


        这样我们就有了csrss进程核心模块的pdb文件,为下面我们用IDA分析这些模块提供了方便。


       


        csrsrv.dll 里面有一个未导出符号叫做 CsrRootProcess, 对 csrss 起着重要的作用。CsrRootProcess 指向一个 CSR_PROCESS 结构。


       


        CSR_PROCESS 结构 (Vista/2008, 对于 XP/2003 同样适用) 如下:


        typedef struct _CSR_PROCESS


        {


        CLIENT_ID ClientId;


        LIST_ENTRY ListLink;


        LIST_ENTRY ThreadList;


        struct _CSR_PROCESS *Parent;


        PCSR_NT_SESSION NtSession;


        ULONG ExpectedVersion;


        HANDLE ClientPort;


        ULONG_PTR ClientViewBase;


        ULONG_PTR ClientViewBounds;


        HANDLE ProcessHandle;


        ULONG SequenceNumber;


        BYTE Flags[4];


        ULONG DebugFlags;


        CLIENT_ID DebugCid;


        ULONG ReferenceCount;


        ULONG ProcessGroupId;


        ULONG ProcessGroupSequence;


        ULONG fVDM;


        ULONG ThreadCount;


        ULONG PriorityClass;


        ULONG Reserved;


        ULONG ShutdownLevel;


        ULONG ShutdownFlags;


        PVOID ServerData[ANYSIZE_ARRAY];


        } CSR_PROCESS, *PCSR_PROCESS;


       


       


        每一个进程都对应着一个 CSR_PROCESS 结构体,所有进程的CSR_PROCESS 结构体


        通过成员struct _LIST_ENTRY ListLink 构成了一个链表,通过CsrRootProcess 可以遍历这个链表。当一个进程创建时,Csrss.exe 会新建一个CSR_PROCESS 结构体,加入到这个链表


中(从Csrss.dll中我们可以看到插入链表是通过未导出函数CsrInsertProcess实现的);当一个进程退出时,Csrss.exe 会将该进程对应的CSR_PROCESS 结构体从链表中删除(从Csrss.dll中我们可以看到插入链表是通过未导出函数CsrRemoveProcess实现的)。



下面我们可以简单看下这连个函数的实现:



VOID


NTAPI


CsrInsertProcess(IN PCSR_PROCESS Parent OPTIONAL,


                 IN PCSR_PROCESS CurrentProcess OPTIONAL,


                 IN PCSR_PROCESS CsrProcess)


{


    PCSR_SERVER_DLL ServerDll;


    ULONG i;



    /* Set the parent */


    CsrProcess->Parent = Parent;



    /* Insert it into the Root List */


    InsertTailList(&CsrRootProcess->ListLink, &CsrProcess->ListLink);



    /* Notify the Server DLLs */


    for (i = 0; i < CSR_SERVER_DLL_MAX; i++)


    {


        /* Get the current Server DLL */


        ServerDll = CsrLoadedServerDll[i];



        /* Make sure it's valid and that it has callback */


        if (ServerDll && ServerDll->NewProcessCallback)


        {


            (*ServerDll->NewProcessCallback)(CurrentProcess, CsrProcess);  //进程创建的通知


        }


    }


}



VOID


NTAPI


CsrRemoveProcess(IN PCSR_PROCESS CsrProcess)


{


    PCSR_SERVER_DLL ServerDll;


    ULONG i;



    /* Remove us from the Process List */


    RemoveEntryList(&CsrProcess->ListLink);



    /* Release the lock */


    CsrReleaseProcessLock();


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

上传的附件:
收藏
免费 6
支持
分享
最新回复 (20)
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
2
直接占楼,下载观看。
2012-5-6 19:12
0
雪    币: 297
活跃值: (275)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
3
板凳。。。。支持一个
2012-5-6 19:15
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
4
探花也不错,支持一个!
2012-5-6 21:01
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主很厉害的....顺便看论坛下。。
2012-5-6 21:59
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
6
写的好,前两天刚写一个csrsswaker 遍历进程,今天看楼主文章加深下记忆。
2012-5-6 22:04
0
雪    币: 94
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
论坛打不开啊  文章不错的说
2012-5-6 22:13
0
雪    币: 410
活跃值: (214)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
8
mark。有空看看
2012-5-6 23:30
0
雪    币: 227
活跃值: (120)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
9
另推荐
d79K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3Z5H3x3s2u0#2i4K6u0W2N6X3g2^5K9h3I4D9K9i4g2E0i4K6u0W2L8%4u0Y4i4K6u0r3i4K6y4r3M7q4)9K6c8o6R3&6x3H3`.`.
CSRSS系列文
2012-5-6 23:46
0
雪    币: 2203
活跃值: (1021)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
弱弱的问下 CsrInsertProcess CsrRemoveProcess 这两个函数的源代码是怎么来的?
2012-5-6 23:49
0
雪    币: 81
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
很强大,紧跟楼主,了解CSRSS构造
2012-5-7 00:23
0
雪    币: 347
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习~
感谢楼主分享
2012-5-7 08:53
0
雪    币: 564
活跃值: (42)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
13
reactos里面有
2012-5-7 09:06
0
雪    币: 564
活跃值: (42)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
14
不错哦,看看
2012-5-7 09:07
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
很不错,站位以后看。
2012-5-7 09:41
0
雪    币: 269
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
16
学习了~~期待继续~
2012-5-7 10:26
0
雪    币: 1737
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
看不懂~ 以后再来吧~
2012-5-7 10:43
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
向 CSRSS 发送请求的应用程序一般调用哪个API? 参数是如何配置的?
2012-5-7 11:40
0
雪    币: 219
活跃值: (878)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
19
先 顶
                           
2012-5-7 13:46
0
雪    币: 304
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
看一眼 就知道很强!!
2012-5-7 15:51
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
mark it
2012-5-7 18:10
0
游客
登录 | 注册 方可回帖
返回