首页
社区
课程
招聘
[求助]关于内存枚举隐藏进程[已解决]
发表于: 2010-5-28 11:12 6876

[求助]关于内存枚举隐藏进程[已解决]

2010-5-28 11:12
6876
//******************************************************************************
//功能:声明变量
//******************************************************************************
#define     EPROCESS_SIZE       0x258 //EPROCESS结构大小
#define     PEB_OFFSET          0x1B0 //Peb
#define     FILE_NAME_OFFSET    0x174 //ImageFileName
#define     PROCESS_LINK_OFFSET 0x088 //ActiveProcessLinks
#define     PROCESS_ID_OFFSET   0x084 //UniqueProcessId
#define     EXIT_TIME_OFFSET    0x078 //ExitTime
#define     OBJECT_HEADER_SIZE  0x018 //_OBJECT_HEADER 0X018
#define     OBJECT_TYPE_OFFSET  0x008 //dt nt!_OBJECT_HEADER -b
#define     PDE_INVALID 2
#define     PTE_INVALID 1
#define     VALID 0
ULONG       pebAddress;         //PEB地址的前半部分
PEPROCESS   pSystem;            //system进程
ULONG       pObjectTypeProcess; //进程对象类型
HANDLE      hThread;
//******************************************************************************
//功能:声明函数
//******************************************************************************
ULONG      VALIDpage(ULONG addr) ;       //该函数直接复制自 Ring0下搜索内存枚举隐藏进程
BOOLEAN    IsaRealProcess(ULONG i);      //该函数复制自 Ring0下搜索内存枚举隐藏进程
VOID       WorkThread(IN PVOID pContext);
ULONG      GetPebAddress();              //得到PEB地址前半部分
VOID       EnumProcess();                //枚举进程
VOID       ShowProcess(ULONG pEProcess); //显示结果

NTSTATUS GetEnumProcess()
{
    pebAddress = GetPebAddress();
    pObjectTypeProcess = *(PULONG)((ULONG)SystemProcess - OBJECT_HEADER_SIZE +OBJECT_TYPE_OFFSET);  
    PsCreateSystemThread(&hThread,
                         (ACCESS_MASK)0,
                          NULL,
                         (HANDLE)0,
                          NULL,
                          WorkThread,
                          NULL
                          );

  return STATUS_SUCCESS;
}
//**************************************************************************************
//**************************************************************************************
//模块名字:
//模块功能:
//返回数值:
//**************************************************************************************
//参数说明:参数名                        |   输入/输出  |        参数说明
//                          |              |
//                          |              |
//                          |              |
//**************************************************************************************
//**************************************************************************************
VOID WorkThread(IN PVOID pContext)
{
    EnumProcess();
    PsTerminateSystemThread(STATUS_SUCCESS);  
}
//**************************************************************************************
//**************************************************************************************
//模块名字:ULONG  GetPebAddress()
//模块功能:得到PEB地址前半部分
//返回数值:
//**************************************************************************************
//参数说明:参数名                        |   输入/输出  |        参数说明
//                          |              |
//                          |              |
//                          |              |
//**************************************************************************************
//**************************************************************************************
ULONG  GetPebAddress()
{
    ULONG Address;
    PEPROCESS pEProcess;
    //由于system进程的peb总是零 我们只有到其他进程去找了
    pEProcess = (PEPROCESS)((ULONG)((PLIST_ENTRY)((ULONG)SystemProcess + PROCESS_LINK_OFFSET))->Flink - PROCESS_LINK_OFFSET);
    Address   = *(PULONG)((ULONG)pEProcess + PEB_OFFSET);
    return (Address & 0xFFFF0000);  
}
//**************************************************************************************
//**************************************************************************************
//模块名字:VOID EnumProcess()
//模块功能:枚举进程
//返回数值:
//**************************************************************************************
//参数说明:参数名                        |   输入/输出  |        参数说明
//                          |              |
//                          |              |
//                          |              |
//**************************************************************************************
//**************************************************************************************
VOID EnumProcess()
{
    ULONG  uSystemAddress = (ULONG)SystemProcess;
    ULONG  i;
    ULONG  Address;
    ULONG  ret;
   
    DbgPrint("-------------------------------------------");
    DbgPrint("EProcess    PID    ImageFileName");
    DbgPrint("---------------------------------");
      
    for(i = 0x80000000; i < uSystemAddress; i += 4)
       {//system进程的EPROCESS地址就是最大值了
           ret = VALIDpage(i);
           if (ret == VALID)
              {
                  Address = *(PULONG)i;
                  if (( Address & 0xFFFF0000) == pebAddress)
                     {//每个进程的PEB地址都是在差不多的地方,地址前半部分是相同的      
                         if(IsaRealProcess(i))
                           {
                               ShowProcess(i - PEB_OFFSET);  
                               i += EPROCESS_SIZE;
                               indexProcess = indexProcess + 1;               
                           }
                      }
              }
           else if(ret == PTE_INVALID)
              {
                  i -=4;
                  i += 0x1000;//4k
              }
           else
              {
                  i-=4;
                  i+= 0x400000;//4mb
              }
       }
    ShowProcess(uSystemAddress);//system的PEB总是零 上面的方法是枚举不到的 不过我们用PsGetCurrentProcess就能得到了
    DbgPrint("index:%d\n",indexProcess);
    DbgPrint("-------------------------------------------");
  }
//**************************************************************************************
//**************************************************************************************
//模块名字:VOID ShowProcess(ULONG pEProcess)
//模块功能:显示结果
//返回数值:
//**************************************************************************************
//参数说明:参数名                        |   输入/输出  |        参数说明
//                          |              |
//                          |              |
//                          |              |
//**************************************************************************************
//**************************************************************************************
VOID ShowProcess(ULONG pEProcess)
{
    PLARGE_INTEGER ExitTime;
    ULONG PID;
    PUCHAR pFileName;  
    ExitTime = (PLARGE_INTEGER)(pEProcess + EXIT_TIME_OFFSET);  
    if(ExitTime->QuadPart != 0) //已经结束的进程的ExitTime为非零
    return ;
    PID = *(PULONG)(pEProcess + PROCESS_ID_OFFSET);
    pFileName = (PUCHAR)(pEProcess + FILE_NAME_OFFSET);
    DbgPrint("0x%08X  %04d   %s\n",pEProcess,PID,pFileName);
}
//**************************************************************************************
//**************************************************************************************
//模块名字:ULONG VALIDpage(ULONG addr)
//模块功能:该函数直接复制自 Ring0下搜索内存枚举隐藏进程
//返回数值:
//**************************************************************************************
//参数说明:参数名                        |   输入/输出  |        参数说明
//                          |              |
//                          |              |
//                          |              |
//**************************************************************************************
//**************************************************************************************
ULONG VALIDpage(ULONG addr)
{
    ULONG pte;
    ULONG pde;
  
    pde = 0xc0300000 + (addr>>22)*4;
    if((*(PULONG)pde & 0x1) != 0)
      {
          if((*(PULONG)pde & 0x80) != 0)
            {
                return VALID;
            }
          pte = 0xc0000000 + (addr>>12)*4;
          if((*(PULONG)pte & 0x1) != 0)
            {
                return VALID;
            }
          else
            {
                return PTE_INVALID;
            }
      }
  return PDE_INVALID;
}
//**************************************************************************************
//**************************************************************************************
//模块名字:BOOLEAN IsaRealProcess(ULONG i)
//模块功能:该函数复制自 Ring0下搜索内存枚举隐藏进程
//返回数值:
//**************************************************************************************
//参数说明:参数名                        |   输入/输出  |        参数说明
//                          |              |
//                          |              |
//                          |              |
//**************************************************************************************
//**************************************************************************************
BOOLEAN IsaRealProcess(ULONG i)
{
    NTSTATUS STATUS;
    PUNICODE_STRING pUnicode;
    UNICODE_STRING Process;
    ULONG pObjectType;
    ULONG ObjectTypeAddress;
  
    if (VALIDpage(i- PEB_OFFSET) != VALID)
       {
           return FALSE;
       }
    ObjectTypeAddress = i - PEB_OFFSET - OBJECT_HEADER_SIZE + OBJECT_TYPE_OFFSET ;  
    if (VALIDpage(ObjectTypeAddress) == VALID)
       {
           pObjectType = *(PULONG)ObjectTypeAddress;
       }
    else
       {
           return FALSE;
       }
  
    if(pObjectTypeProcess == pObjectType)
      { //确定ObjectType是Process类型
           return TRUE;
      }
    return FALSE;
}
这个是堕落天才的隐藏进程代码,真是奇怪,在虚拟机上 能显示搜索到的进程,在我的电脑上无法
搜索到进程,WINDBG 看了下偏移地址,都正确,不禁如此,我还找了一个VB的内存枚举进程
基本跟堕落天才的一样,也是虚拟机好用,我的电脑不好用,都是winxp3...
帮帮忙,我都快疯了。。。。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
虚拟机和 winxp3 系统的分页方式不一样

#define   U4     unsigned long
//检测内存页PDE PTE等,得到新的分页方式
//addr 内存地址,返回新地址。pageFlag 虚拟机或 winxp3 分页标记: 0 1
U4 GetNewAddr ( U4 addr,U4 pageFlag)
{      
        U4 pte,pde,uTmp;
  
  if(pageFlag) pde=0xC0600000+((addr>>21)<<3);
        else         pde=0xc0300000+((addr>>22)<<2);

        uTmp=*(U4 *)pde;
  if((uTmp & 0x1) != 0){
    if((uTmp & 0x80) != 0) return 0;  

                if(pageFlag) pte=0xC0000000 + ((addr>>12)<<3);
                else         pte=0xc0000000 + ((addr>>12)<<2);

                if((*(U4 *)pte & 0x1)) return 0;

                return addr+0x1000-4;//4k INVALID_PTE;
  }
        //PDE
        if(pageFlag)  return addr+0x200000-4; //2M
        return               addr+0x400000-4; //4M
}
2010-5-28 11:49
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
3
哦 谢谢了 怪不得 我说怎么所有的都在虚拟机好用,而物理机的不好用
怎么查看 XP的分页方式
2010-5-28 12:18
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
U4 IsPaging()//得到系统的分页方式
{
                U4 cr4;
                __asm{
                        _emit 0x0f
                        _emit 0x20
                        _emit 0xE0   
                        mov cr4, eax
                }
                return (cr4 & 0x20) ? 1 : 0;
}
2010-5-28 12:32
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了,还是头一次听见这样的
2010-5-28 12:38
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
6
^_^ 谢谢了 好用了。忙活了一天。。。。。
2010-5-28 12:51
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
暴力搜内存太容易蓝了...不好搞...
2010-5-29 03:01
0
雪    币: 168
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
蛋疼的蓝屏啊,要留神
2011-5-3 14:32
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
for(i = 0x80000000; i < uSystemAddress; i += 4)
       {//system进程的EPROCESS地址就是最大值了

这个是错的!把虚拟机内存调小点,比如说128M,就会看到几乎所有进程的EPROCESS地址都比system进程的大
2011-5-3 15:15
0
游客
登录 | 注册 方可回帖
返回
//