博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ring0检测隐藏进程
阅读量:6591 次
发布时间:2019-06-24

本文共 3982 字,大约阅读时间需要 13 分钟。


//网上得到一篇好文章  ,但是拿里面的代码来使用的时候发现并没有太多效果
//于是修改之,终于实现了最初的目标
//由于直接搜索内存,跟系统调度没什么关系,所以能够枚举到各种方法隐藏的进程 包括断链、抹PspCidTable... 
//甚至能枚举到已经"死掉"的进程,本程序通过进程的ExitTime来判断进程是不是已经结束
//除非能够把EProcess结构修改掉,但这个实现难度可能比较大,不知有没有哪位大侠试过(PID我修改过),欢迎讨论
//
//作者:堕落天才
//时间:2007年5月10日
//参考: uty  Ring0下搜索内存枚举隐藏进程 http://www.cnxhacker.net/Article/show/3412.html
//下面代码在XP SP2测试通过
None.gif
#include
<
ntddk.h
>
None.gif
ExpandedBlockStart.gif
///
不同的windows版本下面的偏移值不同
None.gif
#define
  EPROCESS_SIZE       0x25C 
//
EPROCESS结构大小
None.gif
None.gif
#define
  PEB_OFFSET          0x1B0
None.gif
#define
  FILE_NAME_OFFSET    0x174
None.gif
#define
  PROCESS_LINK_OFFSET 0x088
None.gif
#define
  PROCESS_ID_OFFSET   0x084
None.gif
#define
  EXIT_TIME_OFFSET    0x078
None.gif
None.gif
#define
  OBJECT_HEADER_SIZE  0x018
None.gif
#define
  OBJECT_TYPE_OFFSET  0x008
None.gif
None.gif
#define
 PDE_INVALID 2 
None.gif
#define
 PTE_INVALID 1 
None.gif
#define
 VALID 0 
None.gif
None.gif
None.gifULONG     pebAddress;         
//
PEB地址的前半部分
None.gif
PEPROCESS pSystem;            
//
system进程
None.gif
ULONG     pObjectTypeProcess; 
//
进程对象类型
None.gif
None.gifULONG   VALIDpage(ULONG addr) ;  
//
该函数直接复制自 Ring0下搜索内存枚举隐藏进程
None.gif
BOOLEAN IsaRealProcess(ULONG i); 
//
该函数复制自 Ring0下搜索内存枚举隐藏进程
None.gif
VOID    WorkThread(IN PVOID pContext);
None.gifULONG   GetPebAddress();          
//
得到PEB地址前半部分
None.gif
VOID    EnumProcess();            
//
枚举进程
None.gif
VOID    ShowProcess(ULONG pEProcess); 
//
显示结果
None.gif
None.gifVOID    OnUnload(IN PDRIVER_OBJECT DriverObject)
ExpandedBlockStart.gif
{
ExpandedBlockEnd.gif}
None.gifNTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
ExpandedBlockStart.gif
{
InBlock.gif  HANDLE hThread; 
InBlock.gif
InBlock.gif  DriverObject 
->
 DriverUnload 
=
 OnUnload;
InBlock.gif
InBlock.gif  pSystem    
=
 PsGetCurrentProcess();
InBlock.gif  pebAddress 
=
 GetPebAddress();
InBlock.gif  pObjectTypeProcess 
=
 
*
(PULONG)((ULONG)pSystem 
-
 OBJECT_HEADER_SIZE 
+
OBJECT_TYPE_OFFSET);  
InBlock.gif
InBlock.gif  PsCreateSystemThread(
&
hThread, 
InBlock.gif    (ACCESS_MASK)
0
InBlock.gif    NULL, 
InBlock.gif    (HANDLE)
0
InBlock.gif    NULL, 
InBlock.gif    WorkThread, 
InBlock.gif    NULL ); 
InBlock.gif
InBlock.gif  
return
 STATUS_SUCCESS;
ExpandedBlockEnd.gif}
ExpandedBlockStart.gif
/
/
None.gif
VOID WorkThread(IN PVOID pContext) 
ExpandedBlockStart.gif
InBlock.gif  EnumProcess();
InBlock.gif  PsTerminateSystemThread(STATUS_SUCCESS);  
ExpandedBlockEnd.gif}
ExpandedBlockStart.gif
//
//
None.gif
ULONG  GetPebAddress()
ExpandedBlockStart.gif
{
InBlock.gif  ULONG Address;
InBlock.gif  PEPROCESS pEProcess;
InBlock.gif
InBlock.gif        
//
由于system进程的peb总是零 我们只有到其他进程去找了
InBlock.gif
  pEProcess 
=
 (PEPROCESS)((ULONG)((PLIST_ENTRY)((ULONG)pSystem 
+
 PROCESS_LINK_OFFSET))
->
Flink 
-
 PROCESS_LINK_OFFSET);
InBlock.gif  Address   
=
 
*
(PULONG)((ULONG)pEProcess 
+
 PEB_OFFSET);
InBlock.gif
InBlock.gif  
return
 (Address 
&
 
0xFFFF0000
);  
ExpandedBlockEnd.gif}
ExpandedBlockStart.gif
//
/
None.gif
VOID EnumProcess()
ExpandedBlockStart.gif
{
InBlock.gif  ULONG  uSystemAddress 
=
 (ULONG)pSystem;
InBlock.gif  ULONG  i;
InBlock.gif  ULONG  Address;
InBlock.gif  ULONG  ret;
InBlock.gif
InBlock.gif  DbgPrint(
"
-------------------------------------------
"
);
InBlock.gif  DbgPrint(
"
EProcess    PID    ImageFileName
"
);
InBlock.gif  DbgPrint(
"
---------------------------------
"
);
InBlock.gif  
InBlock.gif
ExpandedSubBlockStart.gif  
for
(i 
=
 
0x80000000
; i 
<
 uSystemAddress; i 
+=
 
4
)
{
//
system进程的EPROCESS地址就是最大值了
InBlock.gif
    ret 
=
 VALIDpage(i); 
ExpandedSubBlockStart.gif    
if
 (ret 
==
 VALID)
InBlock.gif      Address 
=
 
*
(PULONG)i;
ExpandedSubBlockStart.gif      
if
 (( Address 
&
 
0xFFFF0000
==
 pebAddress)
{
//
每个进程的PEB地址都是在差不多的地方,地址前半部分是相同的       
ExpandedSubBlockStart.gif
        
if
(IsaRealProcess(i))
InBlock.gif          ShowProcess(i 
-
 PEB_OFFSET);  
InBlock.gif           i 
+=
 EPROCESS_SIZE;                
ExpandedSubBlockEnd.gif        }
 
ExpandedSubBlockEnd.gif      }
 
ExpandedSubBlockStart.gif    }
else
 
if
(ret 
==
 PTE_INVALID)
InBlock.gif      i 
-=
4
InBlock.gif      i 
+=
 
0x1000
;
//
4k 
ExpandedSubBlockStart.gif
    }
else
InBlock.gif      i
-=
4
InBlock.gif      i
+=
 
0x400000
;
//
4mb 
ExpandedSubBlockEnd.gif
    }
 
ExpandedSubBlockEnd.gif  }
InBlock.gif
InBlock.gif  ShowProcess(uSystemAddress);
//
system的PEB总是零 上面的方法是枚举不到的 不过我们用PsGetCurrentProcess就能得到了
InBlock.gif
  DbgPrint(
"
-------------------------------------------
"
);
InBlock.gif  
ExpandedBlockEnd.gif}
ExpandedBlockStart.gif
/
None.gif
VOID    ShowProcess(ULONG pEProcess)
ExpandedBlockStart.gif
{
InBlock.gif  PLARGE_INTEGER ExitTime;
InBlock.gif  ULONG PID;
InBlock.gif  PUCHAR pFileName;
InBlock.gif  
InBlock.gif  ExitTime 
=
 (PLARGE_INTEGER)(pEProcess 
+
 EXIT_TIME_OFFSET);  
InBlock.gif  
if
(ExitTime
->
QuadPart 
!=
 
0
//
已经结束的进程的ExitTime为非零
InBlock.gif
    
return
 ;
InBlock.gif
InBlock.gif  PID 
=
 
*
(PULONG)(pEProcess 
+
 PROCESS_ID_OFFSET);
InBlock.gif  pFileName 
=
 (PUCHAR)(pEProcess 
+
 FILE_NAME_OFFSET);
InBlock.gif
InBlock.gif  DbgPrint(
"
0x%08X  %04d   %s
"
,pEProcess,PID,pFileName);
ExpandedBlockEnd.gif}
ExpandedBlockStart.gif
/
None.gif
ULONG VALIDpage(ULONG addr) 
ExpandedBlockStart.gif
InBlock.gif  ULONG pte; 
InBlock.gif  ULONG pde; 
InBlock.gif  
InBlock.gif  pde 
=
 
0xc0300000
 
+
 (addr
>>
22
)
*
4
ExpandedSubBlockStart.gif  
if
((
*
(PULONG)pde 
&
 
0x1
!=
 
0
)
InBlock.gif    
//
large page 
ExpandedSubBlockStart.gif
    
if
((
*
(PULONG)pde 
&
 
0x80
!=
 
0
)
InBlock.gif      
return
 VALID; 
ExpandedSubBlockEnd.gif    }
 
InBlock.gif    pte 
=
 
0xc0000000
 
+
 (addr
>>
12
)
*
4
ExpandedSubBlockStart.gif    
if
((
*
(PULONG)pte 
&
 
0x1
!=
 
0
)
InBlock.gif      
return
 VALID; 
ExpandedSubBlockStart.gif    }
else
InBlock.gif      
return
 PTE_INVALID; 
ExpandedSubBlockEnd.gif    }
 
ExpandedSubBlockEnd.gif  }
 
InBlock.gif  
return
 PDE_INVALID; 
ExpandedBlockEnd.gif}
 
ExpandedBlockStart.gif
///
/
None.gif
BOOLEAN IsaRealProcess(ULONG i) 
ExpandedBlockStart.gif
InBlock.gif  NTSTATUS STATUS; 
InBlock.gif  PUNICODE_STRING pUnicode; 
InBlock.gif  UNICODE_STRING Process; 
InBlock.gif  ULONG pObjectType; 
InBlock.gif  ULONG ObjectTypeAddress; 
InBlock.gif  
ExpandedSubBlockStart.gif  
if
 (VALIDpage(i
-
 PEB_OFFSET) 
!=
 VALID)
InBlock.gif    
return
 FALSE; 
ExpandedSubBlockEnd.gif  }
 
InBlock.gif
InBlock.gif  ObjectTypeAddress 
=
 i 
-
 PEB_OFFSET 
-
 OBJECT_HEADER_SIZE 
+
 OBJECT_TYPE_OFFSET ;
InBlock.gif  
ExpandedSubBlockStart.gif  
if
 (VALIDpage(ObjectTypeAddress) 
==
 VALID)
InBlock.gif    pObjectType 
=
 
*
(PULONG)ObjectTypeAddress; 
ExpandedSubBlockStart.gif  }
else
InBlock.gif    
return
 FALSE; 
ExpandedSubBlockEnd.gif  }
 
InBlock.gif  
ExpandedSubBlockStart.gif  
if
(pObjectTypeProcess 
==
 pObjectType)
//
确定ObjectType是Process类型
InBlock.gif
    
return
 TRUE; 
ExpandedSubBlockEnd.gif  }
 
InBlock.gif  
return
 FALSE; 
InBlock.gif
ExpandedBlockEnd.gif}
 

转载地址:http://vxuio.baihongyu.com/

你可能感兴趣的文章
Dell PowerEdge R940解析:四路顶配服务器维护平民化
查看>>
《数据重现》赠书活动开始
查看>>
Android 中文 API (93) —— BaseExpandableListAdapter
查看>>
PowerShell中单引号和双引号的区别
查看>>
【ARM】gpio·arm体系结构之gpio
查看>>
数据库启动时遇到ORA-01578错误
查看>>
Fedora 12 (Constantine)Beta版及Alpha镜像下载
查看>>
稳扎稳打Silverlight(3) - 2.0控件之Border, Button, Calendar, Canvas, CheckBox, ComboBox
查看>>
Who's Using Cyberthreat Intelligence and How?
查看>>
【翻译】SQL Server索引进阶:第六级,标签
查看>>
确定两串乱序同构
查看>>
寒假研究计划
查看>>
Android:ListView、BaseAdapter、convertView、ListView优化及事件、notifyDataSetChanged()
查看>>
新版发布功能上线,新增「大屏快照」功能!
查看>>
代码调优及其他zz
查看>>
Centos7+Postfix+Dovecot实现邮件收发
查看>>
“蒜你狠”和“豆你玩”的遐想。。
查看>>
无法解析连接描述中指定的SID
查看>>
ext3格式化成ext4
查看>>
自己编译redhat 9.0内核心得
查看>>