原文发表于百度空间,2008-7-25
==========================================================================

前面对PEB的相关结构和其中的重要成员进行了分析和学习,现在开始真正进入内核,学习内核中的一些结构.
这个EPROCESS结构在ntddk.h中有定义,但是并未给出具体的结构,因此要得到EPROCESS中一些重要的成员变量,只能通过偏移的方法,比如PID,ImageName等.这些偏移可以在Windbg中dt _EPROCESS得到,但是不公开感觉还是不爽,而且这东西在不同的系统版本中不一样,如果要兼容的话,就必须先判断操作系统版本.
在此程序中用到的相关偏移如下(XP系统):

#define EPROCESS_ACTIVELIST_OFFSET 0x88  //活动进程链
#define EPROCESS_PID_OFFSET 0x84 //PID了
#define EPROCESS_IMAGENAME_OFFSET 0x174 //映像名称
#define EPROCESS_FLINK_OFFSET 0x88 //双链表的前向指针
#define EPROCESS_BLINK_OFFSET 0x8C //双链表的后向指针

由于是第一次写驱动,有些写法还不太清楚,下面的代码参考了别人的一些.

VOID ShowEPROCESS(void)
{
DWORD EProcess,FirstEProcess;
LIST_ENTRY* ActiveProcessLinks;
DWORD pid,dwCount=;
PUCHAR pImage;
PPROCESS_INFO ProcessInfo={};
EProcess=FirstEProcess=(DWORD)PsGetCurrentProcess();
//pid=*(DWORD*)((char*)EProcess+EPROCESS_PID_OFFSET);
__try {
while ( EProcess!= )
{
dwCount++;
pid= *( (DWORD*)( EProcess + EPROCESS_PID_OFFSET ) );
pImage= (PUCHAR)( EProcess + EPROCESS_IMAGENAME_OFFSET ) ; DbgPrint ( "[Pid=%8d] EProcess=0x%08X %s\n", pid, EProcess, pImage) ; ActiveProcessLinks = (LIST_ENTRY*) ( EProcess + EPROCESS_FLINK_OFFSET ) ;
EProcess = (DWORD)ActiveProcessLinks->Flink - EPROCESS_FLINK_OFFSET ; if ( EProcess == FirstEProcess )
break ;
}
DbgPrint ( "ProcessCount = %d\n", dwCount ) ;
}
__except ( ) {
DbgPrint ( "EnumProcessList exception !" ) ;
}
}

上面代码的实现思想很简单,因为系统中所有进程的EPROCESS通过它的一个成员变ActiveProcessLinks这个双向链表连接起来,遍历链表的操作很简单,每得到一个ActiveProcessLinks,取其地址,再减去它离EPROCESS结构入口处的偏移,就可以得到EPROCESS的地址了,然后就可以轻松得到想要的成员变量.

下面的结果图:

结果比实际进程数要多,表明其中有一部分其实是僵尸进程,已经死掉却还在进程链上挂着.
由此我感觉到,这个进程链并不是那么严格,因此也就可以把正常进程从链上摘掉,这为下面的隐藏进程实现提供了基础.
至于对抗这种检测方法,很简单,DKOM把想要隐藏的进程从活动进程链上摘掉即可.
实现原理如下图:

图中,着色部分即是LIST_ENTRY结构,绿色指针Flink指向前一个,黄色指针Blink指向后一个.
正常的连接情况如蓝线所示,若要摘要某个结点,修改该结点前后两个结点的指针即可,修改示意如红线所示.同时,还要把被隐藏的进程的EPROCESS中的两个指针都修改为NULL.
这样,通过遍历双链表的方法就找不到这个进程了,这就是最简单的DKOM法隐藏进程.

【旧文章搬运】遍历EPROCESS中的ActiveProcessLinks枚举进程的更多相关文章

  1. 【旧文章搬运】ntfs中的文件名排序规则~

    原文发表于百度空间,2011-04-05========================================================================== 在分析nt ...

  2. 【旧文章搬运】PsVoid中IrpCreateFile函数在Win7下蓝屏BUG分析及解决

    原文发表于百度空间,2010-04-05========================================================================== 这也许是我 ...

  3. 【旧文章搬运】Windows中全局钩子DLL的加载过程

    原文发表于百度空间,2011-03-24========================================================================== 看雪上别人 ...

  4. Ueditor编辑旧文章,从数据库中取出要修改的内容

    Ueditor编辑旧文章,从数据库中取出要修改的内容然后放置到编辑器中: <script type="text/plain" id="editor"> ...

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

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

  6. 【旧文章搬运】PspCidTable攻与防

    原文发表于百度空间,2009-03-29========================================================================== PspCi ...

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

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

  8. 【旧文章搬运】如何从EPROCESS辨别一个进程是否已退出

    原文发表于百度空间,2008-7-31========================================================================== 前面已经通过 ...

  9. 【旧文章搬运】《从PEB获取内存中模块列表》的补充

    原文发表于百度空间,2008-7-26========================================================================== 继续研究PE ...

随机推荐

  1. mysql获取子父级节点

    获取所有子节点 DROP FUNCTION IF EXISTS `F_Co29_GetAllChildrenIdsOfTaskevent`;DELIMITER //CREATE FUNCTION `F ...

  2. 微信小程序 项目实战(二)board 首页

    1.项目结构 2.页面 (1)数据(逻辑) board.js // pages/board/board.js Page({ /** * 页面的初始数据 */ data: { imgWrap: [] } ...

  3. 关于Java中强制类型转换的问题

    为了更好的理解我们先看下面的例子: package com.yonyou.test; import java.util.ArrayList; import java.util.Iterator; im ...

  4. c程序设计语言第一章4

    (昨天网络出现了问题,导致这篇没来得及上传,再次补上,今晚照常上传笔记) 练习1.19编写函数r e v e r s e ( s )将字符串s中的字符顺序颠倒过来.使用该函数编写一个程序,每次颠倒一个 ...

  5. PHPMailer发送邮件乱码

    PHPMailer发送邮件乱码, $mail->CharSet="GB2312";$mail->Encoding = "base64"; 设成这样不 ...

  6. VirtualBox中使用双网卡实现CentOS既能上网(校园网)也能使用SSHclient

    近期在虚拟机中使用linux操作系统,之前使用NAT方式上网,能够畅通无阻.可是使用SSHclient连接linux虚拟机就必须为其指定固定的IP地址.依照网上的配置方法使用桥接方式,这种方式是能够的 ...

  7. VS2008转VS2013时遇到的问题

    最近我们要把DPM进行行人检测嵌入到我们的项目里,需要一个高级版本的VS,于是我们要把2008转换成2013,至于为什么没有换成最高级的版本,可能担心会遇到有更多的麻烦吧,毕竟我们的DPM源码是在20 ...

  8. 项目Beta冲刺(团队1/7)

    项目Beta冲刺(团队1/7) 团队名称: 云打印 作业要求: 项目Beta冲刺(团队) 作业目标: 完成项目Beta版本 团队队员 队员学号 队员姓名 个人博客地址 备注 221600412 陈宇 ...

  9. python day 13 生成器 以及 推导式

    1.生成器的本质是迭代器 2.生成器函数 def  fn() 函数体 yield fn() g = fn() 此时这个g就是生成器 所以g 是可迭代的 g._ _next_ _ 每执行一次_ _nex ...

  10. BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash

    1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...