看雪软件安全论坛



返回   看雪软件安全论坛 > 软件安全 > 『软件调试论坛』

『软件调试论坛』 本版讨论的主题包括:调试逆向、系统底层、漏洞分析、商业保护、病毒木马、虚拟机、.NET平台、安全新闻等

Expired Thread 该主题: "【原创】ring0检测隐藏进程" 因在一年内没有任何回复而自动关闭。
如果您还对该主题感兴趣或者想参与对此主题的讨论,请您重新发表一篇相关的新主题。

发表新主题 关闭主题
己收入精华集  
主题工具 显示模式
本站声明:看雪论坛文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者信息及本声明!
堕落天才
级别:2 | 在线时长:17小时 | 升级还需:4小时级别:2 | 在线时长:17小时 | 升级还需:4小时

中级会员
中级会员

资 料:
注册日期: Oct 2006
帖子: 65 堕落天才 品行端正
精华: 10
现金: 200 Kx
1 旧 默认 【原创】ring0检测隐藏进程
堕落天才 当前离线

标 题: 【原创】ring0检测隐藏进程
作 者: 堕落天才
时 间: 2007-05-10,13:28:20
链 接: http://bbs.pediy.com/showthread.php?t=44243

//网上得到一篇好文章 Ring0下搜索内存枚举隐藏进程 ,但是拿里面的代码来使用的时候发现并没有太多效果
//于是修改之,终于实现了最初的目标
//由于直接搜索内存,跟系统调度没什么关系,所以能够枚举到各种方法隐藏的进程 包括断链、抹PspCidTable... 
//甚至能枚举到已经"死掉"的进程,本程序通过进程的ExitTime来判断进程是不是已经结束
//除非能够把EProcess结构修改掉,但这个实现难度可能比较大,不知有没有哪位大侠试过(PID我修改过),欢迎讨论
//
//作者:堕落天才
//时间:2007年5月10日
//参考: uty  Ring0下搜索内存枚举隐藏进程 http://www.cnxhacker.net/Article/show/3412.html
//下面代码在XP SP2测试通过


#include<ntddk.h>

///////////////////////////不同的windows版本下面的偏移值不同
#define  EPROCESS_SIZE       0x25C //EPROCESS结构大小

#define  PEB_OFFSET          0x1B0
#define  FILE_NAME_OFFSET    0x174
#define  PROCESS_LINK_OFFSET 0x088
#define  PROCESS_ID_OFFSET   0x084
#define  EXIT_TIME_OFFSET    0x078

#define  OBJECT_HEADER_SIZE  0x018
#define  OBJECT_TYPE_OFFSET  0x008

#define PDE_INVALID 2 
#define PTE_INVALID 1 
#define VALID 0 


ULONG     pebAddress;         //PEB地址的前半部分
PEPROCESS pSystem;            //system进程
ULONG     pObjectTypeProcess; //进程对象类型

ULONG   VALIDpage(ULONG addr) ;  //该函数直接复制自 Ring0下搜索内存枚举隐藏进程
BOOLEAN IsaRealProcess(ULONG i); //该函数复制自 Ring0下搜索内存枚举隐藏进程
VOID    WorkThread(IN PVOID pContext);
ULONG   GetPebAddress();          //得到PEB地址前半部分
VOID    EnumProcess();            //枚举进程
VOID    ShowProcess(ULONG pEProcess); //显示结果

VOID    OnUnload(IN PDRIVER_OBJECT DriverObject)
{
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
  HANDLE hThread; 

  DriverObject -> DriverUnload = OnUnload;

  pSystem    = PsGetCurrentProcess();
  pebAddress = GetPebAddress();
  pObjectTypeProcess = *(PULONG)((ULONG)pSystem - 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()
{
  ULONG Address;
  PEPROCESS pEProcess;

        //由于system进程的peb总是零 我们只有到其他进程去找了
  pEProcess = (PEPROCESS)((ULONG)((PLIST_ENTRY)((ULONG)pSystem + PROCESS_LINK_OFFSET))->Flink - PROCESS_LINK_OFFSET);
  Address   = *(PULONG)((ULONG)pEProcess + PEB_OFFSET);

  return (Address & 0xFFFF0000);  
}
///////////////////////////////////////////////////////
VOID EnumProcess()
{
  ULONG  uSystemAddress = (ULONG)pSystem;
  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;                
        } 
      } 
    }else if(ret == PTE_INVALID){ 
      i -=4; 
      i += 0x1000;//4k 
    }else{ 
      i-=4; 
      i+= 0x400000;//4mb 
    } 
  }

  ShowProcess(uSystemAddress);//system的PEB总是零 上面的方法是枚举不到的 不过我们用PsGetCurrentProcess就能得到了
  DbgPrint("-------------------------------------------");
  
}
/////////////////////////////////////////////////////////
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",pEProcess,PID,pFileName);
}
/////////////////////////////////////////////////////////////
ULONG VALIDpage(ULONG addr) 

  ULONG pte; 
  ULONG pde; 
  
  pde = 0xc0300000 + (addr>>22)*4; 
  if((*(PULONG)pde & 0x1) != 0){ 
    //large page 
    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) 

  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; 


////////////////////////////////////////////////////////////////////

此帖于 2007-05-10 14:39:18 被 堕落天才 最后编辑
回复时引用此帖 返回顶端
9521
级别:14 | 在线时长:282小时 | 升级还需:3小时级别:14 | 在线时长:282小时 | 升级还需:3小时级别:14 | 在线时长:282小时 | 升级还需:3小时级别:14 | 在线时长:282小时 | 升级还需:3小时级别:14 | 在线时长:282小时 | 升级还需:3小时

初级会员
初级会员

资 料:
注册日期: Nov 2005
帖子: 57 9521 品行端正
精华: 0
现金: 205 Kx
2 旧 2007-05-10, 13:42:39 默认
9521 当前离线

坐下来慢慢学习

回复时引用此帖 返回顶端
qandzjl
级别:7 | 在线时长:87小时 | 升级还需:9小时级别:7 | 在线时长:87小时 | 升级还需:9小时级别:7 | 在线时长:87小时 | 升级还需:9小时级别:7 | 在线时长:87小时 | 升级还需:9小时

qandzjl 的头像

初级会员
初级会员

资 料:
注册日期: Oct 2005
帖子: 40 qandzjl 品行端正
精华: 0
现金: 200 Kx
3 旧 2007-05-10, 13:47:06 默认
qandzjl 当前离线

顶堕落地``````````````

回复时引用此帖 返回顶端
SkyJack
级别:6 | 在线时长:62小时 | 升级还需:15小时级别:6 | 在线时长:62小时 | 升级还需:15小时级别:6 | 在线时长:62小时 | 升级还需:15小时

初级会员
初级会员

资 料:
注册日期: Dec 2006
帖子: 64 SkyJack 品行端正
精华: 0
现金: 200 Kx
4 旧 2007-05-10, 15:11:55 默认
SkyJack 当前离线

顶一个,学习ing.

回复时引用此帖 返回顶端
Losyz
级别:2 | 在线时长:20小时 | 升级还需:1小时级别:2 | 在线时长:20小时 | 升级还需:1小时

初级会员
初级会员

资 料:
注册日期: Mar 2007
帖子: 35 Losyz 品行端正
精华: 0
现金: 200 Kx
5 旧 2007-05-10, 15:47:44 默认
Losyz 当前离线

给个ntddk.h 吧

回复时引用此帖 返回顶端
林海雪原
级别:3 | 在线时长:23小时 | 升级还需:9小时级别:3 | 在线时长:23小时 | 升级还需:9小时级别:3 | 在线时长:23小时 | 升级还需:9小时

林海雪原 的头像

中级会员
中级会员

资 料:
注册日期: Jul 2005
帖子: 292 林海雪原 品行端正
精华: 6
现金: 202 Kx
6 旧 2007-05-10, 16:50:43 默认
林海雪原 当前离线

支持楼主了!!,

没想到今儿被毒叮上了 (VBS代理下载器变种Q(Trojan.DL.VBS.Agent.q  Hack.SuspiciousAni),google了下,原是机子有MS06-014漏洞,,现在终于清静了...真好!

回复时引用此帖 返回顶端
其其
级别:0 | 在线时长:0小时 | 升级还需:5小时

初级会员
初级会员

资 料:
注册日期: May 2007
帖子: 2 其其 品行端正
精华: 0
现金: 200 Kx
7 旧 2007-05-10, 22:50:59 默认
其其 当前离线

学习咯.
支持咯

回复时引用此帖 返回顶端
riijj
级别:11 | 在线时长:172小时 | 升级还需:20小时级别:11 | 在线时长:172小时 | 升级还需:20小时级别:11 | 在线时长:172小时 | 升级还需:20小时级别:11 | 在线时长:172小时 | 升级还需:20小时级别:11 | 在线时长:172小时 | 升级还需:20小时

riijj 的头像

『CrackMe & ReverseMe』版主<br>核心管理团队
『CrackMe & ReverseMe』版主
核心管理团队

资 料:
注册日期: May 2004
帖子: 1,279 riijj 品行端正
精华: 7
现金: 2081 Kx
8 旧 2007-05-11, 15:36:58 默认
riijj 当前离线

微软 EPROCESS 就是每个版本不同,使大家不能好好用它

回复时引用此帖 返回顶端
WinDbg
级别:8 | 在线时长:110小时 | 升级还需:7小时级别:8 | 在线时长:110小时 | 升级还需:7小时

初级会员
初级会员

资 料:
注册日期: Dec 2006
帖子: 22 WinDbg 品行端正
精华: 0
现金: 222 Kx
9 旧 2007-05-11, 17:34:23 默认
WinDbg 当前离线

引用:
最初由 Losyz发布 查看帖子
给个ntddk.h 吧
ntddk.h在windows development kits中,要下载Windows DDK

回复时引用此帖 返回顶端
小喂
级别:5 | 在线时长:59小时 | 升级还需:1小时级别:5 | 在线时长:59小时 | 升级还需:1小时

小喂 的头像

普通会员
普通会员

资 料:
注册日期: Oct 2006
帖子: 86 小喂 品行端正
精华: 5
现金: 200 Kx
10 旧 2007-05-11, 20:02:39 默认
小喂 当前离线

引用:
最初由 WinDbg发布 查看帖子
ntddk.h在windows development kits中,要下载Windows DDK
你的昵称强啊,小心微软告你!

回复时引用此帖 返回顶端
xPLK
级别:17 | 在线时长:386小时 | 升级还需:10小时级别:17 | 在线时长:386小时 | 升级还需:10小时

xPLK 的头像

普通会员
普通会员

资 料:
注册日期: Mar 2007
帖子: 461 xPLK 品行端正
精华: 3
现金: 136 Kx
11 旧 2007-05-11, 21:05:53 默认
帅哥 xPLK 当前离线

顶下~学习。。

回复时引用此帖 返回顶端
仙剑太郎
级别:3 | 在线时长:26小时 | 升级还需:6小时级别:3 | 在线时长:26小时 | 升级还需:6小时级别:3 | 在线时长:26小时 | 升级还需:6小时

仙剑太郎 的头像

普通会员
普通会员

资 料:
注册日期: Nov 2004
帖子: 239 仙剑太郎 品行端正
精华: 2
现金: 200 Kx
12 旧 2007-05-12, 16:24:26 默认
仙剑太郎 当前离线

引用:
最初由 堕落天才发布 查看帖子
//网上得到一篇好文章 Ring0下搜索内存枚举隐藏进程 (http://www.cnxhacker.net/Article/show/3412.html) ,但是拿里面的代码来使用的时候发现并没有太多效果
//于是修改之,终于实现了最初的目标
//由于直接搜索内存,跟系统调度没什么关系,所以能...
学习学习...

回复时引用此帖 返回顶端
其其
级别:0 | 在线时长:0小时 | 升级还需:5小时

初级会员
初级会员

资 料:
注册日期: May 2007
帖子: 2 其其 品行端正
精华: 0
现金: 200 Kx
13 旧 2007-05-12, 23:17:09 默认
其其 当前离线

请问直接修改EPRODESS结构的Object,求有没有问题

回复时引用此帖 返回顶端
Saver
级别:4 | 在线时长:33小时 | 升级还需:12小时

Saver 的头像

初级会员
初级会员

资 料:
注册日期: Feb 2005
帖子: 283 Saver 品行端正
精华: 0
现金: 203 Kx
14 旧 2007-05-13, 08:26:36 默认
Saver 当前离线

学习学习

回复时引用此帖 返回顶端
gegon
级别:10 | 在线时长:142小时 | 升级还需:23小时级别:10 | 在线时长:142小时 | 升级还需:23小时级别:10 | 在线时长:142小时 | 升级还需:23小时级别:10 | 在线时长:142小时 | 升级还需:23小时

gegon 的头像

初级会员
初级会员

资 料:
注册日期: Dec 2005
帖子: 43 gegon 品行端正
精华: 0
现金: 147 Kx
15 旧 2007-05-13, 10:16:24 默认
gegon 当前离线

收藏慢慢看 ,虽然现在还看不太懂

回复时引用此帖 返回顶端
发表新主题 关闭主题

书签
Expired Thread 该主题: "【原创】ring0检测隐藏进程" 因在一年内没有任何回复而自动关闭。
如果您还对该主题感兴趣或者想参与对此主题的讨论,请您重新发表一篇相关的新主题。


主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子
论坛启用 BB 代码
论坛启用 表情符号
论坛跳转

相似的主题
主题 主题作者 版面 回复 最后发表
源码学习 纯Delphi实现,Hook API实现进程隐藏代码! lovenuo 『资料导航』 38 2010-05-10 22:16:18
商业保护 【原创】反NP监视原理(+Bypass NP in ring0) 堕落天才 『软件调试论坛』 91 2008-01-12 10:31:06
【原创】ring0使nProtect GameGuard的键盘保护失效 堕落天才 『资源下载』 17 2007-11-24 18:57:03
【求助】在Ring0下怎么得到当前进程的句柄? kmax 『软件调试论坛』 4 2007-05-11 07:44:39
怎么od怎么调试np隐藏了的进程呢? linsion 『软件调试论坛』 2 2007-04-21 22:37:44


所有时间均为北京时间。现在的时间是 22:00:12


©2000-2010 PEdiy.com All rights reserved.By PEDIY
Powered by vBulletin ®Jelsoft Enterprises Ltd. 增强包制作PHP源动力.界面支持standme Studio.