• 标 题: 为什么每个进程都有四个不同的ID?
  • 作 者:NaX
  • 时 间:2007-04-21 18:14

为什么每个进程都有四个不同的ID(XP SP2)? 请高手指教!

0496   0x0000009C  \??\C:\WINDOWS\system32\csrss.exe
0497   0x0000009C  \??\C:\WINDOWS\system32\csrss.exe
0498   0x0000009C  \??\C:\WINDOWS\system32\csrss.exe
0499   0x0000009C  \??\C:\WINDOWS\system32\csrss.exe
0520   0x0000009C  \??\C:\WINDOWS\system32\winlogon.exe
0521   0x0000009C  \??\C:\WINDOWS\system32\winlogon.exe
0522   0x0000009C  \??\C:\WINDOWS\system32\winlogon.exe
0523   0x0000009C  \??\C:\WINDOWS\system32\winlogon.exe
0564   0x0000009C  C:\WINDOWS\system32\services.exe
0565   0x0000009C  C:\WINDOWS\system32\services.exe
0566   0x0000009C  C:\WINDOWS\system32\services.exe
0567   0x0000009C  C:\WINDOWS\system32\services.exe
0576   0x0000009C  C:\WINDOWS\system32\lsass.exe
0577   0x0000009C  C:\WINDOWS\system32\lsass.exe
0578   0x0000009C  C:\WINDOWS\system32\lsass.exe
0579   0x0000009C  C:\WINDOWS\system32\lsass.exe
.......
......
请注意 上面显示的是同一个进程有四个不同的ID 并不是一个EXE打开四次显示的
根据上面的原理 有一个神奇的关闭RootkitUnhooker的方法 就是将RootkitUnhooker的进程ID+1\+2\+3 然后就能轻易地将其关闭.因为RootkitUnhooker HOOK 了NtOpenProcess 直接用原来的进程ID 是无法将它的进程打开的

  • 标 题:问题答案
  • 作 者:NaX
  • 时 间:2007-08-06 09:47

NtOpenProcess->PsLookupProcessByProcessId->ExMapHandleToPointer->ExpLookupHandleTableEntry:
ExpLookupHandleTableEntry (
    IN PHANDLE_TABLE HandleTable,
    IN EXHANDLE Handle
    )
{
    ULONG i,j,k,l;      

    l = (Handle.Index >> 24) & 255;
    i = (Handle.Index >> 16) & 255;
    j = (Handle.Index >> 8)  & 255;
    k = (Handle.Index)       & 255;
  
     return &(HandleTable->Table[i][j][k]);
}

其中 EXHANDLE结构如下:

typedef struct _EXHANDLE {
    union {
        struct {       
            ULONG TagBits : 2;
            ULONG Index : 30; 
        };
        HANDLE GenericHandleOverlay;
    };
} EXHANDLE, *PEXHANDLE;

而 EXHANDLE.GenericHandleOverlay = 传过来的进程ID,由上可知  
EXHANDLE.Index = (GenericHandleOverlay/4) & 0x3FFFFFFF;
可见Index是ID整除4的结果,所以就有“四个ID”了。。。