Csrss.exe是什么进程?为何存在及有什么作用?

如果我们打开Windows系统的任务管理器,就会发现里面会有一个Csrss.exe进程,并且这个进程和一般的进程不一样,它的后面没有任何描述,而且通常不会显示使用该进程的用户(Windows XP系统会显示SYSTEM)。Csrss.exe进程运行于所有基于Windows NT的系统,其中包括Windows 2000、XP、Vista以及Win7系统里面。那么Csrss.exe是什么进程?它的功能是什么?是否安全呢?

来历及作用

这一进程是微软定义的Windows系统的核心进程,只要是基于Windows NT系统就必然会有它的存在。其用途主要是控制图形子系统、负责管理线程(创建或删除等),并执行16位的虚拟MS-DOS环境(即命令行程序cmd.exe)的图形窗口及其他某些部分,(不过Csrss.exe进程的这部分的功能被在后来的Vista及Win7系统中新增的Conhost.exe进程替代),另外此进程似乎在笔记本电脑中它还会涉及到电源管理方面。Csrss.exe对于系统的正常运行来说是非常重要的,没有它系统会出现故障,所以请不要轻易尝试终止此程序或将其删除。另外,Csrss.exe在系统中存放的目录位置:

C:\Windows\System32\csrss.exe(大小:6KB,我在XP和Win7上看到他们大小相同)

Csrss.exe进程信息

我实际测试发现:此进程Windows XP只有一个,Windows 7有两个,大小不过8KB

Win7旗舰版有两个Csrss.exe进程

并且在XP系统里面只有一个Csrss.exe进程,而在Win7系统里面有两个。另外有人反应Vista里面也有两个,由于我没了解过Vista所以不太清楚,使用这个系统的人希望可以留言反馈一下。在System32目录下的Csrss.exe如果大小没有异常都可以放心,而对于其他任何目录下的此进程都应保持警惕。(拓展阅读:svchost.exe是什么进程?)

病毒与安全

显然只要是一些关键进程都会获得木马病毒程序的“优待”,Csrss.exe也不例外。电脑安全软件厂商的信息显示有这类木马病毒的存在,它们可能会修改Csrss.exe也可能通过相类似的进程名来迷惑用户,以便更多的获得信任。

相关恶意进程:csrsc.exe、csrs.exe、csrsses.exe、csrssc.exe、csrse.exe

上面所列的这些进程主要是一些木马病毒,它们就是主要用来盗取账号及密码的键盘记录器或变种,如果电脑中有这些木马病毒,它们就会偷取你的各种账号密码。所以如果你发现类似可疑进程或者Csrss.exe程序大小不对(专业版不应大于6KB,旗舰版Win7不应大于8KB)或者存在于非System32目录中,应该立即使用杀毒软件对电脑进程处理。

TXPlatform.exe是什么进程?为何存在及有什么作用?

如果你的电脑里面有安装腾讯公司的QQ即时通讯软件的话,那么你的电脑里面机会有TXPlatform.exe这个进程。它是2007年的时候腾讯公司在其当时最新的版本之中加入的这个程序,只要你开启了QQ那么它就会自动运行这个TXPlatform.exe进程。所以TXPlatform.exe它不是一个Windows系统进程。

一些安全公司对这个程序的行为功能有过分析,其主要为防止一台计算机杀个同时运行2个QQ通讯软件以及满足一些外部调用(但可能并不止这些),它的运行通常情况下不会占用太多的系统资源。另外,它并不是一个会影响QQ主要功能使用的进程,因为一些人尝试过删除TXPlatform.exe以及相关的TXPFProxy.dll文件后依然可以完好的使用,这样做在一些情况下可以减少开启QQ软件对电脑性能的消耗(特别是一些较老的电脑)。如果删除之后它依然存在那么可以尝试卸载QQ客户端来测试这一进程的安全性。

注意:电脑里面的这一进程我们都无法通过文件名来鉴定其是否是100%为腾讯公司提供的,有一些病毒程序会使用与其相同的名称,相关病毒已经被安全公司捕获,其蔓延主要集中在中国以及周边如日本等国家。如上所述,如果你卸载QQ之后还发现此程序存在,建议你立即运行安全杀毒软件对电脑进行安全扫描。

Windows内核学习之进程保护器(防止任务管理器结束进程)

写了三天左右,思路什么的都很清晰,真正实现的时候就各种问题,蓝屏蓝到麻木了,幸好是虚拟机,半年前就打算看驱动了,因为各种原因耽搁了,现在什么都要重新来,这篇文章就当是开门贴吧。

主要功能:防止任务管理器结束进程。

主要原理:HOOK SSDT表中的NtOpenProcess,如果传入的是保护进程的PID,则返回无效句柄。

这个Windows进程保护器的主要界面如下:

防止任务管理器结束进程

利用此程序实现的禁止任务管理器中结束进程的效果图:

禁止结束进程

实现过程总结

应用程序层:

//为listcontrol添加右键菜单
#ifndef GET_X_LPARAM
#define GET_X_LPARAM(lParam) ((int)(short)LOWORD(lParam))
#endif
#ifndef GET_Y_LPARAM
#define GET_Y_LPARAM(lParam) ((int)(short)HIWORD(lParam))
#endif
case WM_CONTEXTMENU:
{
UINT xPos;
UINT yPos;
HWND hwndContext;
hwndContext = (HWND)wParam;
HWND hWndlist= GetDlgItem(hDlg, IDC_PROCESS_LIST);
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
// 来自 hWndlist 的消息
if(hwndContext == hWndlist)
{
// 非右键点击
if (xPos == -1 || yPos == -1)
{
break;
}
HMENU hMenu=LoadMenu(hIns,MAKEINTRESOURCE(IDR_MENU1));
HMENU hMenuTrackPopup=GetSubMenu(hMenu,0);
TrackPopupMenu(hMenuTrackPopup,TPM_LEFTALIGN | TPM_RIGHTBUTTON,xPos,yPos, 0, hDlg, NULL);
DestroyMenu(hMenu);
}
// 做你自己的事
break;
}
TrackPopupMenu倒数第二个参数,要为当前对话框的句柄,否则无法响应菜单ID。
//初始化listcontrol

VOID ListIni(HWND hDlg)
{
HWND hWndlist;
LVCOLUMN ColInfo1 = {0};
LVCOLUMN ColInfo2 = {0};
LVCOLUMN ColInfo3 = {0};
LVCOLUMN ColInfo4 = {0};
LVCOLUMN ColInfo5 = {0};
hWndlist= GetDlgItem(hDlg, IDC_PROCESS_LIST);
SendMessage(hWndlist, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_GRIDLINES);
ColInfo1.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
ColInfo1.iSubItem = 0;
ColInfo1.fmt = LVCFMT_CENTER;
ColInfo1.cx = 100;
ColInfo1.pszText = "进程名";
ColInfo1.cchTextMax = 50;
ColInfo2.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
ColInfo2.iSubItem = 0;
ColInfo2.fmt = LVCFMT_CENTER;
ColInfo2.cx = 50;
ColInfo2.pszText = "PID";
ColInfo2.cchTextMax = 50;
ColInfo3.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
ColInfo3.iSubItem = 0;
ColInfo3.fmt = LVCFMT_CENTER;
ColInfo3.cx = 80;
ColInfo3.pszText = "EPROCESS";
ColInfo3.cchTextMax = 50;
ColInfo4.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
ColInfo4.iSubItem = 0;
ColInfo4.fmt = LVCFMT_CENTER;
ColInfo4.cx = 210;
ColInfo4.pszText = "路径";
ColInfo2.cchTextMax = 50;
ColInfo5.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
ColInfo5.iSubItem = 0;
ColInfo5.fmt = LVCFMT_CENTER;
ColInfo5.cx = 50;
ColInfo5.pszText = "状态";
ColInfo5.cchTextMax = 50;
::SendMessage(hWndlist, LVM_INSERTCOLUMN, WPARAM(0), LPARAM(&ColInfo1));
::SendMessage(hWndlist, LVM_INSERTCOLUMN, WPARAM(1), LPARAM(&ColInfo2));
::SendMessage(hWndlist, LVM_INSERTCOLUMN, WPARAM(2), LPARAM(&ColInfo3));
::SendMessage(hWndlist, LVM_INSERTCOLUMN, WPARAM(3), LPARAM(&ColInfo4));
::SendMessage(hWndlist, LVM_INSERTCOLUMN, WPARAM(4), LPARAM(&ColInfo5));
}
//与驱动间的通信
传入要保护的进程PID数组
bRet = DeviceIoControl(hDevice, IOCTL_PROTECTPROCESS_CONTROL, ProPid, sizeof(ULONG)*100,
NULL,0,&dwOutput, NULL);
//从驱动中获取当前进程列表
bRet = DeviceIoControl(hDevice, IOCTL_GETPROCESS_CONTROL,&de, sizeof(ULONG),ProcessList,
sizeof(_ProcessList)*100,&dwOutput, NULL);
驱动层:
#pragma PAGEDCODE
struct _ProcessList
{
UCHAR ProcessName[30]; //进程名
ULONG PID;//PID
ULONG Eprocess;//Eprocess
ULONG ProCount;
}ProcessList[100];
#pragma PAGEDCODE
ULONG ProPid[100];

当时看的是Windows驱动开发详解,把变量换到分页内存中,害我蓝屏了30多次。

//获取进程列表
VOID EnumProcessList()
{
ULONG EProcess , FirstEProcess ;
ULONG dwCount = 0 ;
PLIST_ENTRY ActiveProcessLinks;
ULONG dwPidOffset =0x84;
ULONG dwPNameOffset = 0x174;
ULONG dwPLinkOffset = 0x88;
ULONG dwProcessId;
PUCHAR pImageFileName;
FirstEProcess = EProcess = ( ULONG ) PsGetCurrentProcess() ;

while ( EProcess != 0 )
{
dwProcessId = * ( (PULONG) ( EProcess + dwPidOffset ) ) ;
pImageFileName = ( PUCHAR ) ( EProcess + dwPNameOffset ) ;
if ( ( LONG ) dwProcessId >= 0 )
{
//DbgPrint( "[Pid=%8d] EProcess=0x%08x %s\n" ,dwProcessId , EProcess , pImageFileName ) ;
strcpy((char*)ProcessList[dwCount].ProcessName,(char*)pImageFileName);
ProcessList[dwCount].PID=dwProcessId;
ProcessList[dwCount].Eprocess=EProcess;
ProcessList[dwCount].ProCount=0;
dwCount ++ ;
}
ActiveProcessLinks = ( PLIST_ENTRY ) ( EProcess + dwPLinkOffset ) ;
EProcess = ( ULONG ) ActiveProcessLinks->Flink - dwPLinkOffset ;
if ( EProcess == FirstEProcess )
{
break ;
}
}
DbgPrint ( "ProcessNum = %d\n", dwCount ) ;
ULONG i=0;
ProcessList[0].ProCount=dwCount;
DbgPrint ( "ProcessNum = %d\n", ProcessList[0].ProCount ) ;
for (i=0;iMajorFunction)
{
case IRP_MJ_CREATE:
DbgPrint("IRP_MJ_CREATE被调用\n");
break;
case IRP_MJ_CLOSE:
DbgPrint("IRP_MJ_CLOSE被调用\n");
break;
case IRP_MJ_DEVICE_CONTROL:
DbgPrint("IRP_MJ_DEVICE_CONTROL被调用\n");
IoControlCode=IrpStack->Parameters.DeviceIoControl.IoControlCode;
switch(IoControlCode)
{
case IOCTL_PROTECTPROCESS_CONTROL:
inSize=IrpStack->Parameters.DeviceIoControl.InputBufferLength;
outSize=IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
inBuf=(long*)pIrp->AssociatedIrp.SystemBuffer;
RtlCopyMemory(ProPid,inBuf,sizeof(ULONG)*100);
break;
case IOCTL_GETPROCESS_CONTROL:
PVOID pInputBuffer, pOutputBuffer;
ULONG outputLength, inputLength;
DbgPrint("COMM_BufferedIo\r\n");
outputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
inputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
pInputBuffer = pIrp->AssociatedIrp.SystemBuffer;
pOutputBuffer = pIrp->AssociatedIrp.SystemBuffer;
DbgPrint("COMM_BufferedIo UserModeMessage = '%s'", pInputBuffer);
for (int i=0;iIoStatus.Information = outputLength;
break;
default:
break;
}
break;
default:
DbgPrint("未知请求包被调用\n");
break;
}
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("Leave HelloDDKDispatchRoutine\n"));
return status;
}

System idle Process是什么进程?它有什么作用为何使用率高?

我想每一个关注电脑的细心用户都会通过Windows任务管理器发现里面有一个叫做System idle Process进程,当我们看到它的时候可能第一个反应就是:这个进程的CPU使用率怎么那么高(它通常在80%~90%以上)?而随着这个问题就会延伸出这些疑惑:System idle Process是什么进程?它在Windows系统中的作用是什么呢?毫无疑问,本文将让你弄懂它。

首先关于System idle Process进程的CPU使用率的问题。通常情况下我们理所当然的知道,一个进程的CPU占用率应该越低越好,然而这个想法对于System idle Process进程却完全相反。

System idle Process是什么进程

就如上图所示的那样,穆童的电脑里面System idle Process进程的CPU使用率高达96%……但是情况是相反的,因为这个程序是“系统空闲进程”。它所指的正确意思应该是:CPU有96%的空闲,而并非使用了96%,空闲得越多就说明你的电脑CPU使用率更低(是反过来的)。而且事实上这个System idle Process进程本身CPU使用率可以忽略不计。一些人会想到关闭这个进程来降低CPU的使用率,这其实是完全没有必要的,同时也是行不通的,因为这个进程你无法终止也不允许你终止(即便你使用第三方程序管理工具)。

所以我们完全没有必要担心System idle Process进程有多高的使用率,如果这个进程的CPU使用率低反而是件坏事,因为那说明你的电脑正在高负荷运行。如果一个你玩一个游戏,它的CPU使用率是30%,那么System idle Process进程的CPU使用率就是70%了。

未完待续……

svchost.exe是什么进程?为什么系统中有很多在运行?

我想细心的电脑用户应该会在电脑的Windows任务管理器中发现有svchost.exe进程在运行,而且通常情况下svchost.exe进程并非同绝大多数程序那样只显示一个,有时候我们能发现10多个svchost.exe正在运行。那么很多人就有了疑问了,svchost.exe是什么进程?为什么svchost.exe进程会有那么多?它会不会是病毒(因为太多了所以可疑)?既然这是个普遍的问题那么我想应该需要来解答一番了。

svchost.exe是什么进程?

首先我们来了解下svchost.exe进程是从哪里来的。我们可以通过Windows任务管理器对svchost.exe进程的描述来了解到这一信息,如下图所示:

svchost.exe进程的来头

从图中我们可以看到svchost.exe进程是Windows服务主进程,这意味着svchost.exe是Windows系统的一部分,它是安全的核心文件。当然,到目前为止没有理由证明我们可以完全相信Windows任务管理器所显示的信息。我再利用安全工具对系统的进程进行了扫描,安全工具显示svchost.exe进程是来自微软公司的Windows系统,请看下图:

使用安全工具检测svchost.exe的来历

重复检测的目前就是为了说明一个很重要的问题,那就是svchost.exe进程是Windows系统的一部分。我们可以确定了它的来历,这一点很重要,因为这样我们或许可以从官方网站找到一些相关介绍svchost.exe进程的技术文档。不出所料,微软的网站中的中文知识库编号为314056的文件就对svchost.exe进程做了介绍:

svchost.exe是从动态连结程式库(DLL) 执行之服务的一般性主处理程序名称。 当电脑启动时,SVCHOST.EXE会检查登录中的服务部分,以建立一份它需要载入的服务清单。 多个svchost.exe可以同时执行,且每一个svchost.exe工作阶段都可以包含一组服务。

上面所使用的安全工具也在描述栏里面简要介绍了svchost.exe进程,只是图片截图是没截取,我再截取一个看的清楚一些的:

svchost.exe进程的作用

为什么需要svchost.exe进程?

上面来自微软的314056文件对svchost.exe的解释里面提到了一个很核心的东西:DLL。关于DLL文件穆童在以前的那篇《DLL文件怎么打开?及DLL格式文件的作用》文章中也简要提到过。而svchost.exe程序与DLL文件之间的关系密切,为了让Windows的软件编程更为高效及提高运行效率,DLL文件就诞生了。但不能从Windows直接启动DLL文件,这个时候一个专门的svchost.exe进程就诞生了。现在我们能够明白微软314056文件所描述的“svchost.exe会检查登录中的服务部分,以建立一份它需要载入的服务清单”这句话了。我们可是使用第三方的任务管理器工具来查看到这一现象:

svchost.exe进程与DLL文件的关系

我们可以从上图看到,一个svchost.exe进程会加载很多的DLL文件。

为什么会有那么多svchost.exe进程?

我们通过上面推荐的那篇文章会知道,DLL文件的作用就是让特定的某个功能使用一个dll文件以便重用。例如,在Windows操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数,因此每个程序都可以使用该DLL中包含的功能(服务)来实现“打开”对话框,这有助于促进代码重用和内存的有效使用。而如果我们的电脑安装的软件很多,需要开启很多的功能,那么理所当然的我们就需要更多的DLL文件(因为功能就在这里面),而我们也知道DLL文件是无法直接使用的,它需要svchost.exe进程来帮助。所以,功能多的时候svchost.exe进程就会越多。

上面的这一解释也能解答大家关于,为什么Windows XP会比Windows 7系统少很多svchost.exe进程的原因,因为毫无疑问Windows 7系统的功能要比Windows XP强大,所以就会出现这种情况。

好啦,我想介绍到这里应该能够让大家比较清楚的了解到svchost.exe是什么进程以及这个进程的作用及来历啦。当然,如果您对本文的解答有些疑惑不解或者有些好的建议欢迎您留言一起交流。