深入分析进程PID相同的奥秘
作者:sunwear (btwlu_at_163.com) 泉源:http://www.xfocus.net/
深入阐发进程PID雷同的秘密
shellcoder@163.com
2005年4月
差别的进程真的不克不及够拥有雷同的PID么?我相信大部门人都市说,这是不行能的,由于PID是在操作体系中表现进程的独一性标示,因此不行能呈现差别的进程拥有雷同的PID,否则在体系调理的时间就会呈现杂乱。但是真的是如许么?有如许一个步伐xxxx,当我们用xxx工具来观察体系中的pid。我们发现,在这个步伐运转时,体系中居然呈现了差别的进程拥有了雷同的pid。这是为什么?我们的明白与我们看到的现象居然呈现了抵牾。
首先让我们来了解一下EPROCESS布局。每个Windows 2000进程都由一个执行步伐进程(EPROCESS)块表现,也就是说在内核中,进程是靠EPROCESS来识另外.下面是EPROCESS的布局定义
typedef struct _EPROCESS {
KPROCESS Pcb;
NTSTATUS ExitStatus;
KEVENT LockEvent;
ULONG LockCount;
LARGE_INTEGER CreateTime;
LARGE_INTEGER ExitTime;
PKTHREAD LockOwner;
HANDLE UniqueProcessId;
LIST_ENTRY ActiveProcessLinks;
SIZE_T QuotaPeakPoolUsage[2];
SIZE_T QuotaPoolUsage[2];
SIZE_T PagefileUsage;
SIZE_T CommitCharge;
SIZE_T PeakPagefileUsage;
SIZE_T PeakVirtualSize;
SIZE_T VirtualSize;
MMSUPPORT Vm;
LIST_ENTRY SessionProcessLinks;
PVOID DebugPort;
PVOID ExceptionPort;
PHANDLE_TABLE ObjectTable;
PACCESS_TOKEN Token;
FAST_MUTEX WorkingSetLock;
PFN_NUMBER WorkingSetPage;
BOOLEAN ProcessOutswapEnabled;
BOOLEAN ProcessOutswapped;
UCHAR AddressSpaceInitialized;
BOOLEAN AddressSpaceDeleted;
FAST_MUTEX AddressCreationLock;
KSPIN_LOCK HyperSpaceLock;
struct _ETHREAD *ForkInProgress;
USHORT VmOperation;
UCHAR ForkWasSuccessful;
UCHAR MmAgressiveWsTrimMask;
PKEVENT VmOperationEvent;
PVOID PaeTop;
ULONG LastFaultCount;
ULONG ModifiedPageCount;
PVOID VadRoot;
PVOID VadHint;
PVOID CloneRoot;
PFN_NUMBER NumberOfPrivatePages;
PFN_NUMBER NumberOfLockedPages;
USHORT NextPageColor;
BOOLEAN ExitProcessCalled;
BOOLEAN CreateProcessReported;
HANDLE SectionHandle;
PPEB Peb;
PVOID SectionBaseAddress;
PEPROCESS_QUOTA_BLOCK QuotaBlock;
NTSTATUS LastThreadExitStatus;
PPAGEFAULT_HISTORY WorkingSetWatch;
HANDLE Win32WindowStation;
HANDLE InheritedFromUniqueProcessId;
ACCESS_MASK GrantedAccess;
ULONG DefaultHardErrorProcessing;
PVOID LdtInformation;
PVOID VadFreeHint;
PVOID VdmObjects;
PVOID DeviceMap;
ULONG SessionId;
LIST_ENTRY PhysicalVadList;
union {
HARDWARE_PTE PageDirectoryPte;
ULONGLONG Filler;
};
ULONG PaePageDirectoryPage;
UCHAR ImageFileName[ 16 ];
ULONG VmTrimFaultValue;
BOOLEAN SetTimerResolution;
UCHAR PriorityClass;
union {
struct {
UCHAR SubSystemMinorVersion;
UCHAR SubSystemMajorVersion;
};
USHORT SubSystemVersion;
};
PVOID Win32Process;
struct _EJOB *Job;
ULONG JobStatus;
LIST_ENTRY JobLinks;
PVOID LockedPagesList;
PVOID SecurityPort ;
PWOW64_PROCESS Wow64Process;
LARGE_INTEGER ReadOperationCount;
LARGE_INTEGER WriteOperationCount;
LARGE_INTEGER OtherOperationCount;
LARGE_INTEGER ReadTransferCount;
LARGE_INTEGER WriteTransferCount;
LARGE_INTEGER OtherTransferCount;
SIZE_T CommitChargeLimit;
SIZE_T CommitChargePeak;
LIST_ENTRY ThreadListHead;
PRTL_BITMAP VadPhysicalPagesBitMap;
ULONG_PTR VadPhysicalPages;
KSPIN_LOCK AweLock;
} EPROCESS;
每个Windows进程都市由体系空间中的一个EPROCESS块来标示。此中有一个UniqueProcessId的属性存储了在体系空间中独一的进程ID,也就是我们常说的PID。
下面我们在来看看进程的创建,正如文章开端所说的例子,一个父进程不断创建子进程,子进程竣事但是HANDLE并未封闭,WIN32子体系进程(csrss)不断创建新进程。
进程创建过程可以通过跟踪阐发CreateProcess来了解。我简略的说一下。
首先CreateProcess找到执行步伐对应的WIN32映射执行步伐后,创建执行步伐对象。
首先就是设置EPROCESS块此中包罗把进程和会话ID存储到对应的字段中,设置进程加入状态,并创建访问令牌。
然后创建初始地点空间和内核进程块与地点空间的设置以及PEB的设置。
再创建线程和堆栈情况。
下面的一部就是向WIN32子体系传递信息,包罗新建的进程线程句柄。创建标记中的项以及ID和确认其属于WIN32使用步伐的标记。后面就是初始化线程并完成整个进程的初始化。
下面我们来看看步伐加入的方面。
ExitProcess函数在竣事进程的时间 并没有开释EPROCESS在内存中的数据,导致进程竣事,但EPROCESS还存在.
通过下面的阐发,可以知道子进程的EPROCESS并不会同进程一起消散,由于EPROCESS必须等到所有的Handle封闭后才会封闭。也就是说进程的EPROCESS Handle count为0的时间,EPROCESS才会被封闭。说白了是,一旦有进程拥有EPROCESS的句柄,那么纵然进程加入,那么EPROCESS也暂时不会被清除出内存,直到所有的Handle都封闭后,才会被清除。下面提到的进程封闭而HANDLE未封闭的进程就称做僵尸进程(tombie process)。如许的情况下win32子体系无法认识到有些进程已成为僵尸。
一般检察进程信息的步伐均调用 NtQuerySystemInformation函数来显示出进程的信息。
NTSTATUS
NtQuerySystemInformation (
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
)
SystemInformationClass 信息的类别,SystemInformation 一个指向函数输出缓冲区的指针,SystemInformationLength 是这个缓冲区的长度,ReturnLength是写入字节的数目。
NtQuerySystemInformation函数 是间接枚举EPROCESS,以是,要是间接通过NtQuerySystemInformation枚举进程的话,会呈现有些雷同的PID。缘故原由就是CSRSS基础就不思量已死的进程。
通过下面的信息也可以了解,只要在进程竣事后,EPROCESS从内存中开释前,才会呈现这种情况。
要是文中有错误或不敷请关照作者 sunwear shellcoder@163.com :)
- 文章作者: 福州军威计算机技术有限公司
军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。
TAG:
评论加载中...
|