这几天想了解下神秘的进程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直播授课