首页
社区
课程
招聘
[分享]遍历进程链表得到进程名和进程上下文
发表于: 2008-1-15 17:03 12212

[分享]遍历进程链表得到进程名和进程上下文

2008-1-15 17:03
12212

  这两天一直看Windows进程结构和进程切换,对进程结构有了一点了解,进程上下文指的就是进程的页目录物理地址,进程切换后之所以在同样的进程地址空间对应的物理地址也不相同就是因为进程的页目录基地址不同。页目录的物理地址由CR3寄存器存放。根据前面的分析可知进程切换时CR3的内容会发生改变,也就是说进程结构中有页目录物理,经过实验证实了我的想法。在KPROCESS偏移0x18处DirectoryTableBase存放着页目录的物理地址。我猜想进程切换的时候CR3的值应该就是在这里取得的吧。。。

所以写了个程序遍历EPROCESS中进程名(EPROCESS中偏移0x174h)和进程的Context

#include <ntifs.h>

VOID 
Unload( 
    IN PDRIVER_OBJECT  DriverObject 
    ); 

VOID GetAllProcess(ULONG Address);

NTSTATUS 
DriverEntry( IN PDRIVER_OBJECT DriverObject,
       IN PUNICODE_STRING RegistryPath )
{
  NTSTATUS status = STATUS_SUCCESS;
  ULONG Address;
  ULONG oldAddress;

  //得到当前进程的地址
  Address = (ULONG)PsGetCurrentProcess();
  //得到EPROCESS中链表的偏移
  Address += 0x88;
  //用oldAddress保存当前进程链表的地址
  oldAddress = Address;

  //遍历进程链表
  do
  {
    GetAllProcess(Address);
    //让Address指向当前链表的下一个进程链表的地址(注意是Flink)
    Address = *(ULONG*)Address;

  }while( oldAddress!=Address );//当得到的链表地址与保存的地址相等说明遍历完整个线程链表,返回
  
  DriverObject->DriverUnload = Unload;

  return status;
}

VOID 
Unload( 
    IN PDRIVER_OBJECT  DriverObject 
    )
{

}

VOID GetAllProcess(ULONG Address)
{
  //得到对应的EPROCESS结构
  Address -= 0x88;
  //EPROCESS偏移0x174为ImageFileName(进程名)
  DbgPrint("ProcessName %s \n",(char*)Address+0x174);
  //EPROCESS偏移0x18为页目录物理地址
  DbgPrint("Process Context %d \n",*(ULONG*)(Address+0x18)); 

}

  水平有限,写出来只为分享和自己记忆。。。


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

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢楼主的共享,好像又点复杂
2008-1-16 04:05
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
//EPROCESS偏移0x174为ImageFileName(进程名)

PsGetProcessImageFileName
2008-1-17 15:38
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
来个判断操作系统,再得到相应的偏移呀, 硬编码。。。

或者动态获取这些变量的偏移地址也不错呀.
eg: PsLookupProcessByProcessId--> 4[XP], 8 [WIN2K] --> "System" --> ImageFileName offset...

其他的也可以动态获取嘛~  炉子帖的那个API也不错~

写的很好哦.分享学习心得就要顶~~
2008-1-18 07:40
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
5
,写得不错。顶
2008-1-18 08:49
0
雪    币: 187
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
Because I don't know what's WDM two months ago...
2008-1-18 09:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我也顶顶顶.....................
2008-1-18 16:20
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
8
[quote=sudami;407270]来个判断操作系统,再得到相应的偏移呀, 硬编码。。。

或者动态获取这些变量的偏移地址也不错呀.
eg: PsLookupProcessByProcessId--> 4[XP], 8 [WIN2K] --> "System" --> ImageFileN...[/quote]

in DriverEntry

call PsGetCurrentProcess
Get offset of "System"
2008-1-18 17:04
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
9
嗯,在3*PAGE_SIZE范围内搜索当前EPROCESS,得到System的Offset.

呵呵.这个也不错~~

00000: ULONG   GetProcessNameOffset ( void )
00001: {
00002:     PEPROCESS curproc;
00003:    int i = 0;
00004:
00005:     curproc = PsGetCurrentProcess();
00006:    for ( i = 0; i < 3 * PAGE_SIZE; i++ ) {
00007:       if( !strncmp( "System", (PCHAR)curproc + i, strlen("System") )) {
00008:          return i;
00009:        }
00010:     }
00011:
00012:    return 0;
00013: }
2008-1-18 17:50
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
in DriverEntry->PsGetCurrentProcess

PsInitialSystemProcess
2008-1-18 18:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习.....
2008-1-20 19:31
0
游客
登录 | 注册 方可回帖
返回
//