大地资源网视频在线观看新浪,日本春药精油按摩系列,成人av骚妻潮喷,国产xxxx搡xxxxx搡麻豆

您現在的位置:智能制造網>技術中心>再談進程PID相同的深入探究

直播推薦

更多>

企業動態

更多>

推薦展會

更多>

再談進程PID相同的深入探究

2006年11月17日 09:12:48人氣:1104來源:煙臺勾股通信技術有限公司

由于自己疏忽,在前幾天寫的分析文章中在一個環節中有錯誤。主要是在進程結束后的分析不夠。所以這次在深入的分析一下。結論也許很簡單,但是其中的分析,看看會很有幫助。
我們來分析一下進程創建的過程。如果有興趣可以自己跟CreateProcess函數。創建進程就靠他咯。
首先CreateProcess找到執行程序對應的WIN32映射執行程序后,創建執行程序對象。
然后就是設置EPROCESS塊其中包括把進程和會話ID存儲到對應的字段中,設置進程退出狀態,并創建訪問令牌。
再創建初始地址空間和內核進程塊與地址空間的設置以及PEB的設置。
創建線程和堆棧環境。
下面的一部就是向WIN32子系統傳遞信息,包括新建的進程線程句柄。創建標志中的項以及ID和確認其屬于WIN32應用程序的標志。后面就是初始化線程并完成整個進程的初始化。
這個過程中,需要詳細說明的就是設置EPROCESS結構(也叫KPEB)。每個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;

!kdex2x86.strct EPROCESS也可以給出EPROCESS的定義,主要是我覺得,這個里面的 HANDLE UniqueProcessId;比void *UniqueProcessId 更能體現出pid的類型。這個結構中包含了進程的N多信息。其中在UniqueProcessId中存儲著進程的ID,也就是我們常說的PID。
我門在來看下進程結束方面。

ExitProcess(process.c) : 2793
->NtTerminateProcess(psdelete.c) : 378
->ObDereferenceObject(obref.c) : 1721
->ObfDereferenceObject(obref.c) : 1200

ASSERT(ObjectHeader->HandleCount == 0);
...
ObpRemoveObjectRoutine( Object );
...

---------------------------

CloseHandle(handle.c) : 87
->NtClose(obclose.c) : 311
ObpDecrementHandleCount( PsGetCurrentProcess(),
ObjectHeader,
ObjectHeader->Type,
CapturedGrantedAccess );

ObDereferenceObject( Object );

由于代碼多,涉及頭文件也過多,所以在此進行了一些省略,把重要的貼出來,ExitProcess是調用了NtTerminateProcess來結束進程的。
EPROCESS會在HandleCount等于0的時候從內存中自動釋放。如果進程退出,只有等待擁有該進程Handle的進程CloseHandle了相應的進程后,由函數ObpDecrementHandleCount將HandleCount降低,從而是的HandleCount = 0,才將EPROCESS釋放出內存。
那我們在來看一個例子,將EPROCESS釋放出內存,并不是將EPROCESS這些數據從內存中刪除。
打開比記本,然后我們來分析一下在這個進程結束前與結束后,EPROCESS中的數據變化。
lkd>!process 0 0
。。。。。
。。。。。
PROCESS 81bef448 SessionId: 0 Cid: 0d00 Peb: 7ffdf000 ParentCid: 0734
DirBase: 03d30000 ObjectTable: e1274b28 HandleCount: 38.
Image: notepad.exe
然后查看該進程的EPROCESS數據
lkd> dt _eprocess 81bef448
nt!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER 0x1c540c9`dab0f904
+0x078 ExitTime : _LARGE_INTEGER 0x0
+0x080 RundownProtect : _EX_RUNDOWN_REF
+0x084 UniqueProcessId : 0x00000d00
+0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x80570de8 - 0x81be4a48 ]
+0x090 QuotaUsage : [3] 0x960
+0x09c QuotaPeak : [3] 0xb38
+0x0a8 CommitCharge : 0x162
+0x0ac PeakVirtualSize : 0x1e45000
+0x0b0 VirtualSize : 0x1bc6000
+0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0xf8973010 - 0x81be4a74 ]
+0x0bc DebugPort : (null)
+0x0c0 ExceptionPort : 0xe1455d08
+0x0c4 ObjectTable : 0xe1274b28
+0x0c8 Token : _EX_FAST_REF
+0x0cc WorkingSetPage : 0x97f3
+0x0d0 AddressCreationLock : _KGUARDED_MUTEX
+0x0f0 HyperSpaceLock : 0
+0x0f4 ForkInProgress : (null)
+0x0f8 HardwareTrigger : 0
+0x0fc PhysicalVadRoot : (null)
+0x100 CloneRoot : (null)
+0x104 NumberOfPrivatePages : 0xc5
+0x108 NumberOfLockedPages : 0
+0x10c Win32Process : 0xbc2eae70
+0x110 Job : (null)
+0x114 SectionObject : 0xe1d530a0
+0x118 SectionBaseAddress : 0x01000000
+0x11c QuotaBlock : 0x820da788
+0x120 WorkingSetWatch : (null)
+0x124 Win32WindowStation : 0x00000028
+0x128 InheritedFromUniqueProcessId : 0x00000734
+0x12c LdtInformation : (null)
+0x130 VadFreeHint : (null)
+0x134 VdmObjects : (null)
+0x138 DeviceMap : 0xe16457e8
+0x13c Spare0 : [3] (null)
+0x148 PageDirectoryPte : _HARDWARE_PTE
+0x148 Filler : 0
+0x150 Session : 0xf8973000
+0x154 ImageFileName : [16] "notepad.exe"
+0x164 JobLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x16c LockedPagesList : (null)
+0x170 ThreadListHead : _LIST_ENTRY [ 0x81bcbdb4 - 0x81bcbdb4 ]
+0x178 SecurityPort : (null)
+0x17c PaeTop : (null)
+0x180 ActiveThreads : 1
+0x184 GrantedAccess : 0x1f0fff
+0x188 DefaultHardErrorProcessing : 1
+0x18c LastThreadExitStatus : 0
+0x190 Peb : 0x7ffdf000
+0x194 PrefetchTrace : _EX_FAST_REF
+0x198 ReadOperationCount : _LARGE_INTEGER 0xb
+0x1a0 WriteOperationCount : _LARGE_INTEGER 0xb
+0x1a8 OtherOperationCount : _LARGE_INTEGER 0xdf
+0x1b0 ReadTransferCount : _LARGE_INTEGER 0x2ec
+0x1b8 WriteTransferCount : _LARGE_INTEGER 0x318
+0x1c0 OtherTransferCount : _LARGE_INTEGER 0x128c
+0x1c8 CommitChargeLimit : 0
+0x1cc CommitChargePeak : 0x162
+0x1d0 AweInfo : (null)
+0x1d4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
+0x1d8 Vm : _MMSUPPORT
+0x238 MmProcessLinks : _LIST_ENTRY [ 0x8056abc8 - 0x81be4bf8 ]
+0x240 ModifiedPageCount : 9
+0x244 JobStatus : 0
+0x248 Flags : 0x450801
+0x248 CreateReported : 0y1
+0x248 NoDebugInherit : 0y0
+0x248 ProcessExiting : 0y0
+0x248 ProcessDelete : 0y0
+0x248 Wow64SplitPages : 0y0
+0x248 VmDeleted : 0y0
+0x248 OutswapEnabled : 0y0
+0x248 Outswapped : 0y0
+0x248 ForkFailed : 0y0
+0x248 Wow64VaSpace4Gb : 0y0
+0x248 AddressSpaceInitialized : 0y10
+0x248 SetTimerResolution : 0y0
+0x248 BreakOnTermination : 0y0
+0x248 SessionCreationUnderway : 0y0
+0x248 WriteWatch : 0y0
+0x248 ProcessInSession : 0y1
+0x248 OverrideAddressSpace : 0y0
+0x248 HasAddressSpace : 0y1
+0x248 LaunchPrefetched : 0y0
+0x248 InjectInpageErrors : 0y0
+0x248 VmTopDown : 0y0
+0x248 ImageNotifyDone : 0y1
+0x248 PdeUpdateNeeded : 0y0
+0x248 VdmAllowed : 0y0
+0x248 Unused : 0y0000000 (0)
+0x24c ExitStatus : 259
+0x250 NextPageColor : 0x8bc4
+0x252 SubSystemMinorVersion : 0 ''
+0x253 SubSystemMajorVersion : 0x4 ''
+0x252 SubSystemVersion : 0x400
+0x254 PriorityClass : 0x2 ''
+0x258 VadRoot : _MM_AVL_TABLE
然后在將進程結束掉
lkd> dt _eprocess 81bef448
nt!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER 0x1c540c9`dab0f904
+0x078 ExitTime : _LARGE_INTEGER 0x1c540ca`012ed006
+0x080 RundownProtect : _EX_RUNDOWN_REF
+0x084 UniqueProcessId : 0x00000d00
+0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x81f2b328 - 0x81be4a48 ]
+0x090 QuotaUsage : [3] 0
+0x09c QuotaPeak : [3] 0xb38
+0x0a8 CommitCharge : 0
+0x0ac PeakVirtualSize : 0x1e45000
+0x0b0 VirtualSize : 0x17d2000
+0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0x81f2b354 - 0x81be4a74 ]
+0x0bc DebugPort : (null)
+0x0c0 ExceptionPort : (null)
+0x0c4 ObjectTable : (null)
+0x0c8 Token : _EX_FAST_REF
+0x0cc WorkingSetPage : 0x97f3
+0x0d0 AddressCreationLock : _KGUARDED_MUTEX
+0x0f0 HyperSpaceLock : 0
+0x0f4 ForkInProgress : (null)
+0x0f8 HardwareTrigger : 0
+0x0fc PhysicalVadRoot : (null)
+0x100 CloneRoot : (null)
+0x104 NumberOfPrivatePages : 0
+0x108 NumberOfLockedPages : 0
+0x10c Win32Process : (null)
+0x110 Job : (null)
+0x114 SectionObject : (null)
+0x118 SectionBaseAddress : 0x01000000
+0x11c QuotaBlock : 0x820da788
+0x120 WorkingSetWatch : (null)
+0x124 Win32WindowStation : 0x00000028
+0x128 InheritedFromUniqueProcessId : 0x00000734
+0x12c LdtInformation : (null)
+0x130 VadFreeHint : (null)
+0x134 VdmObjects : (null)
+0x138 DeviceMap : (null)
+0x13c Spare0 : [3] (null)
+0x148 PageDirectoryPte : _HARDWARE_PTE
+0x148 Filler : 0
+0x150 Session : 0xf8973000
+0x154 ImageFileName : [16] "notepad.exe"
+0x164 JobLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x16c LockedPagesList : (null)
+0x170 ThreadListHead : _LIST_ENTRY [ 0x81bef5b8 - 0x81bef5b8 ]
+0x178 SecurityPort : 0x00000001
+0x17c PaeTop : (null)
+0x180 ActiveThreads : 0
+0x184 GrantedAccess : 0x1f0fff
+0x188 DefaultHardErrorProcessing : 1
+0x18c LastThreadExitStatus : 0
+0x190 Peb : 0x7ffdf000
+0x194 PrefetchTrace : _EX_FAST_REF
+0x198 ReadOperationCount : _LARGE_INTEGER 0xf
+0x1a0 WriteOperationCount : _LARGE_INTEGER 0xf
+0x1a8 OtherOperationCount : _LARGE_INTEGER 0x104
+0x1b0 ReadTransferCount : _LARGE_INTEGER 0x3fc
+0x1b8 WriteTransferCount : _LARGE_INTEGER 0x438
+0x1c0 OtherTransferCount : _LARGE_INTEGER 0x176c
+0x1c8 CommitChargeLimit : 0
+0x1cc CommitChargePeak : 0x163
+0x1d0 AweInfo : (null)
+0x1d4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
+0x1d8 Vm : _MMSUPPORT
+0x238 MmProcessLinks : _LIST_ENTRY [ 0x81f2b4d8 - 0x81be4bf8 ]
+0x240 ModifiedPageCount : 0x11
+0x244 JobStatus : 0
+0x248 Flags : 0x44082d
+0x248 CreateReported : 0y1
+0x248 NoDebugInherit : 0y0
+0x248 ProcessExiting : 0y1
+0x248 ProcessDelete : 0y1
+0x248 Wow64SplitPages : 0y0
+0x248 VmDeleted : 0y1
+0x248 OutswapEnabled : 0y0
+0x248 Outswapped : 0y0
+0x248 ForkFailed : 0y0
+0x248 Wow64VaSpace4Gb : 0y0
+0x248 AddressSpaceInitialized : 0y10
+0x248 SetTimerResolution : 0y0
+0x248 BreakOnTermination : 0y0
+0x248 SessionCreationUnderway : 0y0
+0x248 WriteWatch : 0y0
+0x248 ProcessInSession : 0y0
+0x248 OverrideAddressSpace : 0y0
+0x248 HasAddressSpace : 0y1
+0x248 LaunchPrefetched : 0y0
+0x248 InjectInpageErrors : 0y0
+0x248 VmTopDown : 0y0
+0x248 ImageNotifyDone : 0y1
+0x248 PdeUpdateNeeded : 0y0
+0x248 VdmAllowed : 0y0
+0x248 Unused : 0y0000000 (0)
+0x24c ExitStatus : 0
+0x250 NextPageColor : 0x8bc5
+0x252 SubSystemMinorVersion : 0 ''
+0x253 SubSystemMajorVersion : 0x4 ''
+0x252 SubSystemVersion : 0x400
+0x254 PriorityClass : 0x2 ''
+0x258 VadRoot : _MM_AVL_TABLE
進程結束后EPROCESS依然還在內存中。
而從剛才EPROCESS結構定義中的這句PHANDLE_TABLE ObjectTable; 我們知道 ObjectTable就是指向的HanDleTable 也就是句柄的數據,在進程結束后+0x0c4 ObjectTable : (null)。證明ObjectTable的數據已經被清空。而進程結束后會關閉所有句柄,而釋放EPROCESS,但是EPROCESS的數據并沒有被刪除,只是部分數據被清0。+0x084 UniqueProcessId : 0x00000d00 在進程結束前與結束后,數據依然沒有變化。就證明PID數據依然儲存在內存中。

知道了這些,我們可以舉個例子。
一個父進程創建了子進程,然后子進程結束。那么根據上面的分析,EPROCESS數據依然存在在內存中,沒有被釋放。而EPROCESS中的UniqueProcessId中還存儲著進程ID。win32子系統進程CSRSS.exe,依然繼續著它的任務,創建進程。而在這個時候,CSRSS.EXE并不會去驗證保存在內存中那些名存實亡的數據。所以還在用他的規律不段的創建進程,這樣就會出現不同的EPROCESS使用著同樣的PID。也就是說。兩個執行程序進程塊共同使用著一個PID。這就是所謂的進程PID相同。
在這種情況下任務管理器是看不到這個進程的。
任務管理器調用NtQuerySystemInformation函數來枚舉進程信息。
而NtQuerySystemInformation函數是獲取進程的鏈表。然后在執行其他工作。
不過我們來看看在windows2k源代碼中關于PspExitProcess的代碼

VOID
PspExitProcess(
IN BOOLEAN TrimAddressSpace,
IN PEPROCESS Process
)
{

…………

PoRundownProcess(Process);
if ( Process->ActiveProcessLinks.Flink != NULL &&
Process->ActiveProcessLinks.Blink != NULL ) {

ExAcquireFastMutex(&PspActiveProcessMutex);
RemoveEntryList(&Process->ActiveProcessLinks);
Process->ActiveProcessLinks.Flink = NULL;
Process->ActiveProcessLinks.Blink = NULL;
ExReleaseFastMutex(&PspActiveProcessMutex);

}
……………………
}

從這里看的出來,在進程結束的時候,已經將鏈表移除了。所以在任務管理器中就無法顯示了。但是任務管理器看不到相同PID不一定就證明沒有PID相同的進程。上面說了,進程結束把ActiveProcessLinks移除。但是EPROCESS在進程結束的時候,數據依然保存在內存中。

依據人們所知道的關于進程的定義(所有的進程都由一個進程執行塊表示,進程執行塊就是EPROCESS)而EPROCESS數據保存在內存中并沒被刪除。在后來的不斷創建進程中,就會出現不同的EPROCESS中使用著同樣的進程ID。結論也就是兩個進程PID相同,但是這樣的結果并不會影響系統的正常工作。
后記
因為使用著相同PID的不同的兩個EPROCESS,其中一個名存實亡,并非活動中的進程。換句話說,掛著號但是沒有實際用途的進程。
由于篇幅原因,在此對win32子系統(CSRSS.exe)產生PID的規則就一帶而過,沒有做過多解釋。
感謝eva,zwell指出*篇文章中的錯誤。

關鍵詞:PID
全年征稿/資訊合作 聯系郵箱:1271141964@qq.com

免責聲明

  • 凡本網注明"來源:智能制造網"的所有作品,版權均屬于智能制造網,轉載請必須注明智能制造網,http://www.xashilian.com。違反者本網將追究相關法律責任。
  • 企業發布的公司新聞、技術文章、資料下載等內容,如涉及侵權、違規遭投訴的,一律由發布企業自行承擔責任,本網有權刪除內容并追溯責任。
  • 本網轉載并注明自其它來源的作品,目的在于傳遞更多信息,并不代表本網贊同其觀點或證實其內容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網站或個人從本網轉載時,必須保留本網注明的作品來源,并自負版權等法律責任。
  • 如涉及作品內容、版權等問題,請在作品發表之日起一周內與本網聯系,否則視為放棄相關權利。

<
更多 >

工控網機器人儀器儀表物聯網3D打印工業軟件金屬加工機械包裝機械印刷機械農業機械食品加工設備制藥設備倉儲物流環保設備造紙機械工程機械紡織機械化工設備電子加工設備水泥設備海洋水利裝備礦冶設備新能源設備服裝機械印染機械制鞋機械玻璃機械陶瓷設備橡塑設備船舶設備電子元器件電氣設備


我要投稿
  • 投稿請發送郵件至:(郵件標題請備注“投稿”)1271141964.qq.com
  • 聯系電話0571-89719789
工業4.0時代智能制造領域“互聯網+”服務平臺
智能制造網APP

功能豐富 實時交流

智能制造網小程序

訂閱獲取更多服務

微信公眾號

關注我們

抖音

智能制造網

抖音號:gkzhan

打開抖音 搜索頁掃一掃

視頻號

智能制造網

公眾號:智能制造網

打開微信掃碼關注視頻號

快手

智能制造網

快手ID:gkzhan2006

打開快手 掃一掃關注
意見反饋
關閉
企業未開通此功能
詳詢客服 : 0571-87858618
主站蜘蛛池模板: 曲水县| 盐亭县| 临沂市| 钦州市| 乃东县| 南澳县| 盐津县| 方城县| 临江市| 莎车县| 文昌市| 莒南县| 福清市| 兴仁县| 嘉荫县| 溧水县| 屯昌县| 巴里| 扶余县| 大英县| 镇坪县| 陆良县| 盐山县| 娱乐| 亳州市| 涿鹿县| 即墨市| 乌鲁木齐县| 平湖市| 丹寨县| 滦平县| 东光县| 新闻| 沁源县| 马鞍山市| 东莞市| 新巴尔虎左旗| 赫章县| 察隅县| 新巴尔虎右旗| 汉沽区|