首页
社区
课程
招聘
枚举隐藏进程问题
发表于: 2010-1-24 16:15 4301

枚举隐藏进程问题

2010-1-24 16:15
4301
#define EPROCESS_SIZE 1  
#define PEB_OFFSET 2  
#define FILE_NAME_OFFSET 3  
#define PROCESS_LINK_OFFSET 4  
#define PROCESS_ID_OFFSET 5  
#define EXIT_TIME_OFFSET 6   

typedef ULONG DWORD ;   

typedef struct _PROCESS_INFO {   
    DWORD   dwProcessId ;   
    PUCHAR  pImageFileName ;   
} PROCESS_INFO, *PPROCESS_INFO ;   

DWORD GetPlantformDependentInfo(DWORD dwFlag)   
{   
    DWORD current_build;   
    DWORD ans = 0;   
       
    PsGetVersion(NULL, NULL, ¤t_build, NULL);   
  
    switch (dwFlag)   
    {   
    case EPROCESS_SIZE:   
        if (current_build == 2195) ans = 0 ;        // 2000,当前不支持2000,下同   
        if (current_build == 2600) ans = 0x25C;     // xp   
        if (current_build == 3790) ans = 0x270;     // 2003   
        break;   
    case PEB_OFFSET:   
        if (current_build == 2195)  ans = 0;   
        if (current_build == 2600)  ans = 0x1b0;   
        if (current_build == 3790)  ans = 0x1a0;   
        break;   
    case FILE_NAME_OFFSET:   
        if (current_build == 2195)  ans = 0;   
        if (current_build == 2600)  ans = 0x174;   
        if (current_build == 3790)  ans = 0x164;   
        break;   
    case PROCESS_LINK_OFFSET:   
        if (current_build == 2195)  ans = 0;   
        if (current_build == 2600)  ans = 0x088;   
        if (current_build == 3790)  ans = 0x098;   
        break;   
    case PROCESS_ID_OFFSET:   
        if (current_build == 2195)  ans = 0;   
        if (current_build == 2600)  ans = 0x084;   
        if (current_build == 3790)  ans = 0x094;   
        break;   
    case EXIT_TIME_OFFSET:   
        if (current_build == 2195)  ans = 0;   
        if (current_build == 2600)  ans = 0x078;   
        if (current_build == 3790)  ans = 0x088;   
        break;   
    }   
    return ans;   
}

///////////////////////////////////////////////////////////////////////////////
//        枚举进程——遍历通过EPROCESS结构的ActiveProcessLinks链表//        这个链表,其实就是全局变量PsActiveProcessHead所指示的链表
///////////////////////////////////////////////////////////////////////////////
VOID EnumProcessList()
{
        PROCESS_INFO        ProcessInfo = {0} ;
        DWORD                        EProcess ;
        DWORD                        FirstEProcess ;
        DWORD                        dwCount = 0 ;
        LIST_ENTRY                *ActiveProcessLinks ;
       
        DWORD        dwPidOffset                = GetPlantformDependentInfo ( PROCESS_ID_OFFSET ) ;
        DWORD        dwPNameOffset        = GetPlantformDependentInfo ( FILE_NAME_OFFSET ) ;
        DWORD        dwPLinkOffset        = GetPlantformDependentInfo ( PROCESS_LINK_OFFSET ) ;
       
        DbgPrint ( "PidOff=0x%X NameOff=0x%X LinkOff=0x%X", dwPidOffset, dwPNameOffset, dwPLinkOffset ) ;
       
        FirstEProcess = EProcess = (DWORD)PsGetCurrentProcess() ;
       
        __try {
                while ( EProcess != 0)
                {
                        dwCount++;
                       
                        ProcessInfo.dwProcessId = *((DWORD*)( EProcess + dwPidOffset ));
                        ProcessInfo.pImageFileName = (PUCHAR)( EProcess + dwPNameOffset ) ;
                       
                        DbgPrint ( "[Pid=%8d] EProcess=0x%08X %s\n", ProcessInfo.dwProcessId, EProcess, ProcessInfo.pImageFileName ) ;
                       
                        ActiveProcessLinks = (LIST_ENTRY*) ( EProcess + dwPLinkOffset ) ;
                        EProcess = (DWORD)ActiveProcessLinks->Flink - dwPLinkOffset ;
                       
                        if ( EProcess == FirstEProcess )
                                break ;
                }
                DbgPrint ( "ProcessNum = %d\n", dwCount ) ;
        } __except ( 1 ) {
                DbgPrint ( "EnumProcessList exception !" ) ;
        }
}
为什么枚举进程的时候会把执行过已经关闭的程序进程也枚举出来?

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

收藏
免费
支持
分享
最新回复 (4)
雪    币: 65
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
会不会是没刷新?因为也没这方面的经验,所以这是猜测
2010-1-24 22:28
0
雪    币: 1981
活跃值: (771)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
3
看过教主的文章_
称这些为疆尸进程
2010-1-24 23:04
0
雪    币: 124
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
1 可能是这个程序点了关闭 ,但是只是窗口线程给结束了 ,进程中还有其他线程在运行,所以进程没有退出,这个时候应该在任务管理器里还可以看到这个进程
2 可能是有其他程序打开了这个进程的句柄(openprocess)或者父进程(createprocess),这样得到的进程句柄没有关掉,使得进程的内核计数不为0,那么系统就没有销毁eprocess,所以还能枚举到,当进程退出了,而且没有其他程序还持有这个进程的进程句柄的时候,系统销毁eprocess,你就枚举不到了
2010-1-24 23:59
0
雪    币: 30
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那该如何清除这些僵尸进程呢?
2010-1-25 10:44
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册
// // 统计代码