首页
社区
课程
招聘
[求助]有没有什么通用的方法获取下一个eprocess的地址和进程的退出时间...
发表于: 2009-10-15 18:12 7797

[求助]有没有什么通用的方法获取下一个eprocess的地址和进程的退出时间...

2009-10-15 18:12
7797
如题.............
哪位大侠帮帮忙

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 538
活跃值: (460)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
2
初学驱动 参考网上代码
XP3 下编译通过 希望对你有帮助

#define PROCESS_ID_OFFSET 0x84
#define IMAGE_NAME_OFFSET 0x174
#define PROCESS_LINK_OFFSET 0x88
#define PROCESS_EXITTIME   0x78

void GetAllProcess()
{
        ULONG curr, next, per;
        PLIST_ENTRY ActiveProcessLinks;
        int i = 1;
        curr = (ULONG)IoGetCurrentProcess();//PsGetCurrentProcess();
       
        ActiveProcessLinks = (PLIST_ENTRY)((PUCHAR)curr + PROCESS_LINK_OFFSET);
        next = (ULONG)((PCHAR)(ActiveProcessLinks->Flink) - PROCESS_LINK_OFFSET);
       

        DbgPrint("EPROCESS --> [0x%08X] PID ---> [%d] ImageName %s", curr, *(PULONG)((PUCHAR)curr + PROCESS_ID_OFFSET),
                ((PUCHAR)curr + IMAGE_NAME_OFFSET));

        while(next != 0)
        {
                if(!MmIsAddressValid((PVOID)next))
                        break;

                //如果EPROCESS 的 ExitTime 不等于0 说明进程退出了
                if( *(LONGLONG*)((PUCHAR)next + PROCESS_EXITTIME) == 0) {

                        //正常来说PID 会小于 0xFFFF 除非是 Idle 进程 (纯属猜测)
                        if(*(PULONG)((PUCHAR)next + PROCESS_ID_OFFSET) < 0xFFFF) {
                               
                                DbgPrint("EPROCESS --> [0x%08X] PID ---> [%d] ImageName %s", next, *(PULONG)((PUCHAR)next + PROCESS_ID_OFFSET),
                                ((PUCHAR)next + IMAGE_NAME_OFFSET));
                               
                        } else {

                                DbgPrint("EPROCESS --> [0x%08X] PID ---> [0] ImageName Idle", next);
                        }
                        i ++;
                }
                ActiveProcessLinks = (PLIST_ENTRY)((PUCHAR)next + PROCESS_LINK_OFFSET);
                next = (ULONG)((PCHAR)(ActiveProcessLinks->Flink) - PROCESS_LINK_OFFSET);
               
                if(next == curr)
                        break;
        }
        DbgPrint("进程数量: %d", i);
       
}
2009-10-15 18:21
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我说的是通用的方法..不是硬编码...
不是还是谢谢你..
2009-10-15 21:13
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
摘自《寒江独钓——Windows内核编程与信息安全》

// 这个函数必须在DriverEntry中调用,否则cfCurProcName将不起作用。
static size_t s_cf_proc_name_offset = 0;
void cfCurProcNameInit()
{
        ULONG i;
        PEPROCESS  curproc;
        curproc = PsGetCurrentProcess();
        // 搜索EPROCESS结构,在其中找到字符串
        for(i=0;i<3*4*1024;i++)
        {
                if(!strncmp("System",(PCHAR)curproc+i,strlen("System")))
                {
                        s_cf_proc_name_offset = i;
                        break;
                }
        }
}

// 以下函数可以获得进程名。返回获得的长度。
ULONG cfCurProcName(PUNICODE_STRING name)
{
        PEPROCESS  curproc;
        ULONG        i,need_len;
    ANSI_STRING ansi_name;
        if(s_cf_proc_name_offset == 0)
                return 0;

    // 获得当前进程PEB,然后移动一个偏移得到进程名所在位置。
        curproc = PsGetCurrentProcess();

    // 这个名字是ansi字符串,现在转化为unicode字符串。
    RtlInitAnsiString(&ansi_name,((PCHAR)curproc + s_cf_proc_name_offset));
    need_len = RtlAnsiStringToUnicodeSize(&ansi_name);
    if(need_len > name->MaximumLength)
    {
        return RtlAnsiStringToUnicodeSize(&ansi_name);
    }
    RtlAnsiStringToUnicodeString(name,&ansi_name,FALSE);
        return need_len;
}

上面代码是获取进程名。

lkd> dt _EPROCESS
nt!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   +0x06c ProcessLock      : _EX_PUSH_LOCK
   +0x070 CreateTime       : _LARGE_INTEGER
   +0x078 ExitTime         : _LARGE_INTEGER           //这里就是退出时间
  .
   .
   .
2009-10-16 10:07
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
5
ZwQuerySystemInformation遍历进程,功能号:SystemProcessInformation

退出时间我只会硬编码
2009-10-16 10:16
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
好象只能硬编码 。。。
2009-10-16 15:09
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
ZwQueryInformationProcess
2009-10-16 16:22
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
8
ZwQueryInformationProcess不能获取退出时间吧
2009-10-17 14:57
0
游客
登录 | 注册 方可回帖
返回
//