原文发表于百度空间及看雪论坛,2009-05-13

看雪论坛地址:https://bbs.pediy.com/thread-89708.htm
==========================================================================

最近很忙,也很懒,发点以前写的东西吧~
学习了一下古老的CsrssWalker,写点笔记~~
在Csrss.exe中,保存着所有Win32子系统进程的进程信息,这些信息以链表的形式保存。
正常情况下,每一个新创建的进程都会通知Csrss.exe,Csrss.exe接收这些信息然后保存起来,所以遍历这个链表就可以得到所有Win32子系统进程的信息。首先就是找链表头了,链表头为CsrssRootProcess,在CSRSRV.DLL导出的函数中有对CsrssRootProcess的操作,因此可以通过CSRSRV.DLL的导出函数找到CsrssRootProcess。
比较方便一点的,是从CsrLockProcessByClientId中找到CsrssRootProcess.

mov      edx, [ebp+arg_4]
and dword ptr [edx],
mov esi, dword_75AA891C ; Base=75AA0000
add esi,
mov [ebp+arg_4], 0C0000001h

75AA891C处就是CsrssRootProcess的指针了,这个指针的值可以通过特征匹配找到,具体请参考代码。读取其内容,得到CsrssRootProcess=0x001629C0(这个只是我的系统上的)

从这里读就可以得到CsrssRootProcess的内容了,然后遍历Link即可
涉及以的一些数据结构在CsrssStruct.h中。
进程信息的结构如下:

typedef struct _CSR_PROCESS
{
CLIENT_ID ClientId; //这里可以得到进程PID和主线程TID
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;
ULONG Flags;
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[];
} CSR_PROCESS, *PCSR_PROCESS;

但是因为这不是在当前进程中,所以每次都要先读取出来,遍历时与普通的遍历双链表操作稍有差别,但是也很容易实现。

具体的步骤为:
1.找到Csrss.exe进程(这个很简单,Vista要注意有不止一个Csrss进程)
2.遍历Csrss.exe中的模块列表,找到CSRSRV.DLL的基址。
3.在CSRSRV.DLL中根据导出函数CsrLockProcessByClientId找CsrssRootProcess指针
4.构建当前进程名称列表,为输出作准备
5.根据CsrssRootProcess指针的地址,从Csrss.exe进程中读取和遍历每个进程的信息并输出

在Csrss.exe中同样还保存着所有Win32线程的信息,由于线程数目较多,Csrss中采用Hash表的形式来保存线程信息。同样从CSRSRV.DLL的导出函数CsrLockThreadByClientId可以得到CsrThreadHashTable的地址,这是一个Hash表,定义为:

LIST_ENTRY CsrThreadHashTable[256];

Hash算法为:

#define CsrHashThread(t) \
(HandleToUlong(t)&( - ))

很简单的算法,查找CsrThreadHashTable的方法及遍历方法与前面遍历CsrssRootProcessLink基本相同,不多说。这部分我并未在代码中实现,有兴趣的自己写一写吧,很简单。
对于Vista等较新的系统,由于Session隔离,系统中会有不止一个Csrss进程,这样就需要对这几个Csrss进程都进行处理。就说这么多了,具体地看代码~~
代码下载地址:

看雪:https://bbs.pediy.com/thread-89708.htm

【旧文章搬运】CsrssWalker学习笔记的更多相关文章

  1. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  2. 【旧文章搬运】PE重定位表学习手记

    原文发表于百度空间,2008-11-02========================================================================== 先定义一下 ...

  3. 【旧文章搬运】Windbg+Vmware驱动调试入门(四)---VirtualKD内核调试加速工具

    原文发表于百度空间,2009-01-09========================================================================== 今天又想起 ...

  4. 【旧文章搬运】深入分析Win7的对象引用跟踪机制

    原文发表于百度空间及看雪论坛,2010-09-12 看雪论坛地址:https://bbs.pediy.com/thread-120296.htm============================ ...

  5. 【旧文章搬运】分析了一下360安全卫士的HOOK(二)——架构与实现

    原文发表于百度空间及看雪论坛,2009-10-14 看雪论坛地址:https://bbs.pediy.com/thread-99460.htm 刚发这篇文章的时候,因为内容涉及360的核心产品,文章被 ...

  6. 【旧文章搬运】再谈隐藏进程中的DLL模块

    原文发表于百度空间,2009-09-17========================================================================== 相当老的话 ...

  7. 【旧文章搬运】Windows句柄表分配算法分析(一)

    原文发表于百度空间,2009-03-30========================================================================== 阅读提示: ...

  8. 【旧文章搬运】Windows句柄表格式

    原文发表于百度空间,2009-02-28========================================================================== 句柄是Wi ...

  9. 【旧文章搬运】更正一个枚举PspCidTable时的错误

    原文发表于百度空间及看雪论坛,2009-02-27 看雪论坛地址:https://bbs.pediy.com/thread-82919.htm============================= ...

随机推荐

  1. IO 函数

    http://www.cnblogs.com/orange1438/p/4613460.html

  2. 应用程序中的server错误,没有名称为“ServiceBehavior”的服务行为

    应用程序中的server错误,没有名称为"ServiceBehavior"的服务行为         今天在阅读"创建和使用Web服务"的相关内容,在浏览器中查 ...

  3. 单词number 和 numeral 的区别

    原文: http://blog.sina.com.cn/s/blog_72cd06360100vn7t.html be of 的用法,相当于表征特征或属性的形容词. 简单地说,“of + 名词”等于“ ...

  4. SolidEdge如何在零件上写字 如何绘制文字

    在草图状态下,插入-文字轮廓   可以按这两个按钮调节文字的大小和位置   之后你可以通过长出或除料把文字凸起或者凹下去   如果你要制作路径文字(比如环形文字),则先绘制一条圆或一段圆弧,并设为构造 ...

  5. redux 及 相关插件 项目实战

    目录结构 +-- app | +-- actions | +-- index.js | +-- components | +-- content.js | +-- footer.js | +-- se ...

  6. opencvSGBM半全局立体匹配算法的研究(1)

    转载请说明出处:http://blog.csdn.net/zhubaohua_bupt/article/details/51866567 这段时间对opencvSGBM半全局立体匹配算法进行了比較仔细 ...

  7. Arduino 网络时钟client

    升级! 添加了12h/24h 的开关,还有标准/ 夏令时开关!见步骤7 & 步骤8. 你是否曾想要一个和办公室时间来源全然准确的表? 这就有一个网络的办公时间server,你能够根据它并同步你 ...

  8. 使用DWR实现自己主动补全 相似百度搜索框的自己主动显示效果

    使用DWR实现自己主动补全 自己主动补全:是指用户在文本框中输入前几个字母或汉字的时候,自己主动在存放数据的文件或数据库中将全部以这些字母或汉字开头的数据提示给用户供用户选择 在日常上网过程中,我们常 ...

  9. C++类中使用new及delete小例子

    //默认复制构造函数的不足//尽管有默认的复制构造函数来解决一般对象与对象之间的初始化问题, 但是在有些情况下我们必须手动显式的去定义复制构造函数, 例如: #include <iostream ...

  10. layer弹层

    获得 layer 文件包后,解压并将 layer 整个文件夹(不要拆分结构) 存放到你项目的任意目录,使用时,只需引入 layer.js 即可. 注意:引入layer.js前必须先引入jquery1. ...