http://bbs.pediy.com/showthread.php?t=150284

这几天想了解下神秘的进程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\*http://msdl.microsoft.com/download/symbols

如图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();/* Loop every Server DLL */for (i = 0; i < CSR_SERVER_DLL_MAX; i++){/* Get the Server DLL */ServerDll = CsrLoadedServerDll[i];/* Check if it's valid and if it has a Disconnect Callback */if (ServerDll && ServerDll->DisconnectCallback){/* Call it */(ServerDll->DisconnectCallback)(CsrProcess);   //进程关闭的通知
        }}
}

  Csrss 里面还存在着一个 关于线程的未导出符号叫做 CsrThreadHashTable。它是一个有 256 个元素的数组, 每一个元素都指向一个 CSR_THREAD 结构, 而 CSR_THREAD 结构同样包含一个 LIST_ENTRY。

typedef struct _CSR_THREAD
{ // <size 0x38>
    union _LARGE_INTEGER CreateTime;    struct _LIST_ENTRY Link;   struct _LIST_ENTRY HashLinks;   struct _CLIENT_ID ClientId;   struct _CSR_PROCESS* Process;   struct _CSR_WAIT_BLOCK* WaitBlock;   void* ThreadHandle;  unsigned long Flags;   unsigned long ReferenceCount;   unsigned long ImpersonateCount;
} CSR_THREAD, *PCSR_THREAD;

  相关操作函数CsrInsertThread,CsrRemoveThread。

  Win32 子系统进程与CSRSS 的通信
  我们首先从csrss是怎么启动的作为入口点,用进程查看工具procexp.exe查看相关信息。
  如下图3                                     
                              图3
  从图3中我们可以知道csrss进程的父进程是smss,我们同样利用procexp.exe工具查看csrss的启动参数是什么,如图4:
                             
                              图4
  从图4中我们首先能猜想到的就是ServerDll=winsrv:UserServerDllInitialization,3 的意思是winsev.dll这个核心服务dll里面存在导出函数UserServerDllInitialization。那么我们就先从这个函数里面找找看有什么有用的线索没。
从UserServerDllInitialization代码片段中我们发现了两张表,如图5
                                            
  我们在IDA中看看这两张表(UserServerApiDispatchTable 图6):
                             
                                           图6
  UserServerApiDispatchTable 这张表保存了很多函数。而UserServerApiServerValidTable这张表保存的是UserServerApiDispatchTable 表里面相对应函数是否有效的标志。
  同样的道理我们看看ConServerDllInitialization这个函数,我们也发现了类似的表。
  如下图7:


  所以winsrv.dll里面有两个重要的保存函数的表:ConsoleServerApiDispatchTable(控制台管理),UserServerApiDispatchTable(终端登录之类)。
  
  
  最后我们发现basesrv.DLL也存在一张保存函数的表:BaseServerApiDispatchTable,
如下图8   
                                     
                                               图8
  
  Csrsrv.dll存在CsrServerApiDispatchTable这张表。(图9)
                             
                                图9
  
  四个分发表序号如下:
  CsrServerApiDispatchTable:0
  BaseServerApiDispatchTable:1
  ConsoleServerApiDispatchTable:2
  UserServerApiDispatchTable:3
  
  因此我们可以知道csrss.exe启动时候参数winsrv:UserServerDllInitialization,3 的意思了。
Win32 子系统进程与CSRSS 的通信是通过lpc port,在图3中我们可以看到个名为\Windows\ApiPort 的LPC 端口与名为\Windows\sbApiPort的LPC端口。那么在 Csrss 中,对ApiPort 端口所接收到的LPC 消息的处理,主要是由csrsrv.dll 中的
CsrApiRequestThread 函数完成。CsrApiRequestThread 函数调用NtReplyWaitReceivePort 接收
消息,根据消息的类型执行特定的操作。

CsrApiRequestThread函数里面有一while循环处理各种请求,ReceiveMsg参数的ReceiveMsg.h.u2.s2.Type字段保存了消息的类型,当请求为LPC_REQUEST:
  LPC参数中某一字段:高16 位指定是哪个分发表,低16 位为分发表中函数的索引值
,定义如下:
#define CSR_APINUMBER_TO_SERVERDLLINDEX( ApiNumber ) \
    ((ULONG)((ULONG)(ApiNumber) >> 16))    //高16 位指定是哪个分发表

#define CSR_APINUMBER_TO_APITABLEINDEX( ApiNumber ) \
  ((ULONG)((USHORT)(ApiNumber)))  //低16 位为分发表中函数的索引值
   这样就可以通过分发表调用函数。
  
  ApiNumber = ReceiveMsg.ApiNumber;ServerDllIndex = CSR_APINUMBER_TO_SERVERDLLINDEX( ApiNumber );LoadedServerDll = CsrLoadedServerDll[ ServerDllIndex ](*(LoadedServerDll->ApiDispatchTable[ ApiTableIndex ]))(                                     &ReceiveMsg,                                     &ReplyStatus                                     );

转载于:https://www.cnblogs.com/himessage/archive/2012/12/27/2835286.html

(转) Csrss进程剖析相关推荐

  1. windows内核情景分析---进程线程1

    本篇主要讲述进程的启动过程.线程的调度与切换.进程挂靠 一.进程的启动过程: BOOL CreateProcess ( LPCTSTR lpApplicationName,               ...

  2. 关于win7下r3窗口进程保护的一些方式

    背景 随着Windows PG保护的出现,过去内核挂钩inline hook的时代逐渐远去,hook OpenProcess的日子也一去不复返了.那么,如果想在Windows操作系统上不那么轻易的被结 ...

  3. 【旧文章搬运】为什么win32k.sys在System进程空间无法访问

    原文发表于百度空间,2010-01-02 ========================================================================== 玩过Sh ...

  4. 为什么win32k.sys在System进程空间无法访问

    2010年01月02日 21:21 玩过Shadow SSDT Hook的都知道,在System进程中是无法访问win32k.sys的内存空间的,要想访问必须切换到csrss进程或者任意一个GUI进程 ...

  5. Icesword FAQ端口 进程 服务篇

    问:现在进程端口工具很多,什么要使用IceSword? 答:1.绝大多数所谓的进程工具都是利用Windows的Toolhlp32或psapi再或 ZwQuerySystemInformation系统调 ...

  6. Windows 进程和作业

    Windows 进程和作业 创建进程 CreateProcess 函数的参数 CreateProcess 的流程 创建Windows"现代化"进程 创建其他类型的进程 进程的内部构 ...

  7. Windows内核新手上路2——挂钩shadow SSDT

    Windows内核新手上路2--挂钩shadow SSDT 文章核心内容:安全软件窗口保护.安全输入.截屏保护的一些思路.挂钩NtUserFindWindowEx.NtUserGetForegroun ...

  8. 系统蓝屏的几种姿势,确定不了解下么?

    前言 在 蓝屏(BSOD)转储设置,看本文就够了!这篇文章里比较详细的介绍了蓝屏转储设置.做好设置后,我们就可以在需要的时候使系统蓝屏了.本文介绍几种使系统蓝屏的办法,当然肯定还有其它办法,如果哪位小 ...

  9. 《软件调试》读书笔记:第13章 硬错误和蓝屏

    会话管理器进程SMSS.exe是系统启动后的第一个用户态进程,负责启动和监护windows子系统进程:CSRSS.exe和登陆管理进程:WinLogon SMSS.exe从注册表中查询子系统exe文件 ...

  10. DockOne技术分享:十个问题带你了解Windows Docker

    DockOne技术分享:十个问题带你了解Windows Docker [编者的话]微软在5月份Build大会上的官方说法,说是这个夏天会放出Windows Server Container的测试版.也 ...

最新文章

  1. 美国五大科技巨头的人工智能竞赛
  2. ubuntu命令安装jdk
  3. linux 记一次链路聚合
  4. rose顺序图转换为协作图_【S7200指令教程】顺序控制指令SCR SCRT SCRE
  5. 最明的int和Integer的区别
  6. python怎么模拟浏览器交互_干货分享:python爬虫模拟浏览器的两种方法实例分析(赶紧收藏)...
  7. 【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流
  8. mysql 排序 过滤_【MYSQL】-3 排序与过滤
  9. kafka consumer配置拉取速度慢_Kafka消费者的使用和原理
  10. 【知识图谱系列】多关系异质图神经网络CompGCN
  11. 印刷文字的字体与字号规定
  12. 增值电信许可证与icp许可证有什么区别
  13. java自旋锁使用_10.Java锁之自旋锁
  14. 小米Pro 安装Ubuntu,以及安装成功之后,各种关机重启的卡死问题
  15. 【思维导图】Excel转成思维导图
  16. 构建TCP套接字(socket)的概念及具体步骤
  17. unity3D 跳一跳
  18. SpringBoot使用elasticsearch-rest-high-level-client操作ElasticSearch
  19. Java 利用感知哈希算法简单实现用户头像搜索(搜图)
  20. Android的一些开源项目集锦 以备以后研究

热门文章

  1. 比例调速阀AMESim仿真
  2. 计算机与生物的关系论文题目,生物论文
  3. Matlab图像线条绘制
  4. C语言——恶搞之关机代码
  5. linux 蓝牙编程avrcp,bluetooth(蓝牙) AVRCP协议概念及代码流程解析
  6. vue+html5实现分类、商品分类、类别、菜单的左右层级布局两种不同精美样式
  7. IAR软件生成库文件.a的license限制
  8. 51单片机跑马灯程序
  9. java统计代码的行数
  10. SQL基本使用-查询表中的记录