windows程序员进阶系列《软件调试》之五windows操作系统概要.docx
《windows程序员进阶系列《软件调试》之五windows操作系统概要.docx》由会员分享,可在线阅读,更多相关《windows程序员进阶系列《软件调试》之五windows操作系统概要.docx(20页珍藏版)》请在冰豆网上搜索。
![windows程序员进阶系列《软件调试》之五windows操作系统概要.docx](https://file1.bdocx.com/fileroot1/2022-11/25/7bf684ca-e117-45a9-b0c8-5229e4aa3833/7bf684ca-e117-45a9-b0c8-5229e4aa38331.gif)
windows程序员进阶系列《软件调试》之五windows操作系统概要
windows程序员进阶系列:
《软件调试》之五windows操作系统概要
windows程序员进阶系列:
《软件调试》之五:
Windows操作系统概要
操作系统是计算机系统中的基本软件。
它负责管理系统中的软硬件资源。
通常都包括文件管理、内存管理、进程管理、打印管理、网络管理等基本功能。
除此之外,支持调试也是操作系统设计的一项根本任务。
从被调试对象的角度来看,可以把操作系统的调试支持分为以下三个方面:
一:
对应用程序的调试。
即如何简单高效的调试运行在系统中的应用程序。
二:
对设备驱动程序的调试。
三:
对操作系统自身调试的支持。
本文我们会介绍Windows操作系统的架构及核心组件,加深大家对Windows系统的理解。
Windows是个典型的多任务操作系统,它允许有多个进程在系统中同时运行。
进程是资源分配和保护的基本单位。
每个进程都有自己的虚拟地址空间。
这保证了每个进程相互隔离互不干扰。
除了地址空间之外每个进程还包括:
一:
一个全局唯一的进程ID。
二:
一个可执行映像(可执行文件)。
三:
一个或多个线程。
四:
一个位于内核空间中的名为_EPROCESS数据结构。
用以记录该进程的关键信息,包括进程创建时间、映像文件名称等。
五:
一个位于内核空间的句柄表。
用以记录和索引该进程所创建的或打开的内核对象。
句柄只是句柄表的索引,操作系统根据句柄表来得到指向内核对象的指针。
六:
一个用于描述内存页目录表起始位置的基地址。
简称页目录基地址。
当cpu切换任务时会将该地址加载到CR3寄存器中。
七:
一个位于用户空间中的环境块(ProcessEnvironmentblock)PEB。
八:
一个访问权限令牌。
用以表示该进程的用户、安全组以及优先级别。
为了更好的理解以上列出的每个项目。
我们可以结合Windbg使用dt命令来观察_EPROCESS的每个字段。
在windbg中可以输入命令:
dt_EPROCESS。
该命令会显示_EPROCESS结构的各个字段。
如果你通过其他方法,如!
process00可得到了某个进程的_ERPCESS结构的地址,你可以为上面的命令加上_EPROCESS结构地址。
如输入dt_EPROCESSEPROCESS结构地址。
该命令会在显示_EPROCESS结构的同时,显示该地址处各个字段的取值。
以下为_EPROCESS结构:
[cpp]viewplaincopyprint?
1.typedefstruct_EPROCESS{
2.KPROCESSPcb;
3.NTSTATUSExitStatus;
4.KEVENTLockEvent;
5.ULONGLockCount;
6.LARGE_INTEGERCreateTime;
7.LARGE_INTEGERExitTime;
8.PKTHREADLockOwner;
9.HANDLEUniqueProcessId;
10.LIST_ENTRYActiveProcessLinks;
11.SIZE_TQuotaPeakPoolUsage[2];
12.SIZE_TQuotaPoolUsage[2];
13.SIZE_TPagefileUsage;
14.SIZE_TCommitCharge;
15.SIZE_TPeakPagefileUsage;
16.SIZE_TPeakVirtualSize;
17.SIZE_TVirtualSize;
18.MMSUPPORTVm;
19.LIST_ENTRYSessionProcessLinks;
20.PVOIDDebugPort;
21.PVOIDExceptionPort;
22.PHANDLE_TABLEObjectTable;
23.PACCESS_TOKENToken;
24.
25.FAST_MUTEXWorkingSetLock;
26.PFN_NUMBERWorkingSetPage;
27.BOOLEANProcessOutswapEnabled;
28.BOOLEANProcessOutswapped;
29.UCHARAddressSpaceInitialized;
30.BOOLEANAddressSpaceDeleted;
31.FAST_MUTEXAddressCreationLock;
32.KSPIN_LOCKHyperSpaceLock;
33.struct_ETHREAD*ForkInProgress;
34.USHORTVmOperation;
35.UCHARForkWasSuccessful;
36.UCHARMmAgressiveWsTrimMask;
37.PKEVENTVmOperationEvent;
38.PVOIDPaeTop;
39.ULONGLastFaultCount;
40.ULONGModifiedPageCount;
41.PVOIDVadRoot;
42.PVOIDVadHint;
43.PVOIDCloneRoot;
44.PFN_NUMBERNumberOfPrivatePages;
45.PFN_NUMBERNumberOfLockedPages;
46.USHORTNextPageColor;
47.BOOLEANExitProcessCalled;
48.BOOLEANCreateProcessReported;
49.HANDLESectionHandle;
50.PPEBPeb;
51.PVOIDSectionBaseAddress;
52.PEPROCESS_QUOTA_BLOCKQuotaBlock;
53.NTSTATUSLastThreadExitStatus;
54.PPAGEFAULT_HISTORYWorkingSetWatch;
55.HANDLEWin32WindowStation;
56.HANDLEInheritedFromUniqueProcessId;
57.ACCESS_MASKGrantedAccess;
58.ULONGDefaultHardErrorProcessing;
59.PVOIDLdtInformation;
60.PVOIDVadFreeHint;
61.PVOIDVdmObjects;
62.PVOIDDeviceMap;
63.ULONGSessionId;
64.LIST_ENTRYPhysicalVadList;
65.union{
66.HARDWARE_PTEPageDirectoryPte;
67.ULONGLONGFiller;
68.};
69.ULONGPaePageDirectoryPage;
70.UCHARImageFileName[16];
71.ULONGVmTrimFaultValue;
72.BOOLEANSetTimerResolution;
73.UCHARPriorityClass;
74.union{
75.struct{
76.UCHARSubSystemMinorVersion;
77.UCHARSubSystemMajorVersion;
78.};
79.USHORTSubSystemVersion;
80.};
81.PVOIDWin32Process;
82.struct_EJOB*Job;
83.ULONGJobStatus;
84.LIST_ENTRYJobLinks;
85.PVOIDLockedPagesList;
86.PVOIDSecurityPort;
87.PWOW64_PROCESSWow64Process;
88.LARGE_INTEGERReadOperationCount;
89.LARGE_INTEGERWriteOperationCount;
90.LARGE_INTEGEROtherOperationCount;
91.LARGE_INTEGERReadTransferCount;
92.LARGE_INTEGERWriteTransferCount;
93.LARGE_INTEGEROtherTransferCount;
94.SIZE_TCommitChargeLimit;
95.SIZE_TCommitChargePeak;
96.LIST_ENTRYThreadListHead;
97.PRTL_BITMAPVadPhysicalPagesBitMap;
98.ULONG_PTRVadPhysicalPages;
99.KSPIN_LOCKAweLock;
100.}EPROCESS;
typedefstruct_EPROCESS{
KPROCESSPcb;
NTSTATUSExitStatus;
KEVENTLockEvent;
ULONGLockCount;
LARGE_INTEGERCreateTime;
LARGE_INTEGERExitTime;
PKTHREADLockOwner;
HANDLEUniqueProcessId;
LIST_ENTRYActiveProcessLinks;
SIZE_TQuotaPeakPoolUsage[2];
SIZE_TQuotaPoolUsage[2];
SIZE_TPagefileUsage;
SIZE_TCommitCharge;
SIZE_TPeakPagefileUsage;
SIZE_TPeakVirtualSize;
SIZE_TVirtualSize;
MMSUPPORTVm;
LIST_ENTRYSessionProcessLinks;
PVOIDDebugPort;
PVOIDExceptionPort;
PHANDLE_TABLEObjectTable;
PACCESS_TOKENToken;
FAST_MUTEXWorkingSetLock;
PFN_NUMBERWorkingSetPage;
BOOLEANProcessOutswapEnabled;
BOOLEANProcessOutswapped;
UCHARAddressSpaceInitialized;
BOOLEANAddressSpaceDeleted;
FAST_MUTEXAddressCreationLock;
KSPIN_LOCKHyperSpaceLock;
struct_ETHREAD*ForkInProgress;
USHORTVmOperation;
UCHARForkWasSuccessful;
UCHARMmAgressiveWsTrimMask;
PKEVENTVmOperationEvent;
PVOIDPaeTop;
ULONGLastFaultCount;
ULONGModifiedPageCount;
PVOIDVadRoot;
PVOIDVadHint;
PVOIDCloneRoot;
PFN_NUMBERNumberOfPrivatePages;
PFN_NUMBERNumberOfLockedPages;
USHORTNextPageColor;
BOOLEANExitProcessCalled;
BOOLEANCreateProcessReported;
HANDLESectionHandle;
PPEBPeb;
PVOIDSectionBaseAddress;
PEPROCESS_QUOTA_BLOCKQuotaBlock;
NTSTATUSLastThreadExitStatus;
PPAGEFAULT_HISTORYWorkingSetWatch;
HANDLEWin32WindowStation;
HANDLEInheritedFromUniqueProcessId;
ACCESS_MASKGrantedAccess;
ULONGDefaultHardErrorProcessing;
PVOIDLdtInformation;
PVOIDVadFreeHint;
PVOIDVdmObjects;
PVOIDDeviceMap;
ULONGSessionId;
LIST_ENTRYPhysicalVadList;
union{
HARDWARE_PTEPageDirectoryPte;
ULONGLONGFiller;
};
ULONGPaePageDirectoryPage;
UCHARImageFileName[16];
ULONGVmTrimFaultValue;
BOOLEANSetTimerResolution;
UCHARPriorityClass;
union{
struct{
UCHARSubSystemMinorVersion;
UCHARSubSystemMajorVersion;
};
USHORTSubSystemVersion;
};
PVOIDWin32Process;
struct_EJOB*Job;
ULONGJobStatus;
LIST_ENTRYJobLinks;
PVOIDLockedPagesList;
PVOIDSecurityPort;
PWOW64_PROCESSWow64Process;
LARGE_INTEGERReadOperationCount;
LARGE_INTEGERWriteOperationCount;
LARGE_INTEGEROtherOperationCount;
LARGE_INTEGERReadTransferCount;
LARGE_INTEGERWriteTransferCount;
LARGE_INTEGEROtherTransferCount;
SIZE_TCommitChargeLimit;
SIZE_TCommitChargePeak;
LIST_ENTRYThreadListHead;
PRTL_BITMAPVadPhysicalPagesBitMap;
ULONG_PTRVadPhysicalPages;
KSPIN_LOCKAweLock;
}EPROCESS;
从上面可以看到_EPROCESS结构几乎包括了进程的所有关键信息和重要资产。
如预调试密切相关的DebugPort和ExceptionPort字段。
我们将在后面逐步介绍其中的重要字段。
访问令牌
_EPROCESS的token字段记录着这个进程的TOCKEN结构的地址,进程的很多余安全有关的信息都保存在这个结构中。
本文不再介绍。
PEB
PEB是进程环境块的缩写。
它包含进程大多数的用户态信息。
但是它由内核创建之后,映射到用户空间中的。
同上面介绍的一样,同样可以使用dt_PEB来显示_PEB结构的各个字段。
也可以指定_PEB的地址,显示各个字段的取值。
除了使用此种方法外还可以使用扩展命令:
!
pebxxxx来观察进程环境块。
xxxx为PEB结构地址。
PEB结构如下:
[cpp]viewplaincopyprint?
1.typedefstruct_PEB{//Size:
0x1D8
2./*000*/UCHARInheritedAddressSpace;
3./*001*/UCHARReadImageFileExecOptions;
4./*002*/UCHARBeingDebugged;
5./*003*/UCHARSpareBool;//Allocationsize
6./*004*/HANDLEMutant;
7./*008*/HINSTANCEImageBaseAddress;//Instance
8./*00C*/VOID*DllList;
9./*010*/PPROCESS_PARAMETERS*ProcessParameters;
10./*014*/ULONGSubSystemData;
11./*018*/HANDLEDefaultHeap;
12./*01C*/KSPIN_LOCKFastPebLock;
13./*020*/ULONGFastPebLockRoutine;
14./*024*/ULONGFastPebUnlockRoutine;
15./*028*/ULONGEnvironmentUpdateCount;
16./*02C*/ULONGKernelCallbackTable;
17./*030*/LARGE_INTEGERSystemReserved;
18./*038*/ULONGFreeList;
19./*03C*/ULONGTlsExpansionCounter;
20./*040*/ULONGTlsBitmap;
21./*044*/LARGE_INTEGERTlsBitmapBits;
22./*04C*/ULONGReadOnlySharedMemoryBase;
23./*050*/ULONGReadOnlySharedMemoryHeap;
24./*054*/ULONGReadOnlyStaticServerData;
25./*058*/ULONGAnsiCodePageData;
26./*05C*/ULONGOemCodePageData;
27./*060*/ULONGUnicodeCaseTableData;
28./*064*/ULONGNumberOfProcessors;
29./*068*/LARGE_INTEGERNtGlobalFlag;//Addressofalocalcopy
30./*070*/LARGE_INTEGERCriticalSectionTimeout;
31./*078*/ULONGHeapSegmentReserve;
32./*07C*/ULONGHeapSegmentCommit;
33./*080*/ULONGHeapDeCommitTotalFreeThreshold;
34./*084*/ULONGHeapDeCommitFreeBlockThreshold;
35./*088*/ULONGNumberOfHeaps;
36./*08C*/ULONGMaximumNumberOfHeaps;
37./*090*/ULONGProcessHeaps;
38./*094*/ULONGGdiSharedHandleTable;
39./*098*/ULONGProcessStarterHelper;
40./*09C*/ULONGGdiDCAttributeList;
41./*0A0*/KSPIN_LOCKLoaderLock;
42./*0A4*/ULONGOSMajorVersion;
43./*0A8*/ULONGOSMinorVersion;
44./*0AC*/USHORTOSBuildNumber;
45./*0AE*/USHORTOSCSDVersion;
46./*0B0*/ULONGOSPlatformId;
47./*0B4*/ULONGImageSubsystem;
48./*0B8*/ULONGImageSubsystemMajorVersion;
49./*0BC*/ULONGImageSubsystemMinorVersion;
50./*0C0*/ULONGImageProcessAffinityMask;
51./*0C4*/ULONGGdiHandleBuffer[0x22];
52./*14C*/ULONGPostProcessInitRoutine;
53./*150*/ULONGTlsExpansionBitmap;
54./*154*/UCHARTlsExpansionBitmapBits[0x80];
55./*1D4*/ULONGSessionId;
56.}PEB,*PPEB;
typedefstruct_PEB{//Size:
0x1D8
/*000*/UCHARInheritedAddressSpace;
/*001*/UCHARReadImageFileExecOptions;
/*002*/UCHARBeingDebugged;
/*003*/UCHARSpareBool;//Allocationsize
/*004*/HANDLEMutant;
/*008*/HINSTANCEImageBaseAddress;//Instance
/*00C*/VOID*DllList;
/*010*/PPROCESS_PARAMETERS*ProcessParameters;
/*014*/ULONGSubSystemData;
/*018*/HANDLEDefaultHeap;
/*01C*/KSPIN_LOCKFastPebLock;
/*020*/ULONGFastPebLockRoutine;
/*024*/ULONGFastPebUnlockRoutine;
/*028*/ULONGEnvironmentUpdateCount;
/*02C*/ULONGKernelCallbackTable;
/*030*/LARGE_INTEGERSystemReserved;
/*038*/ULONGFreeList;
/*03C*/ULONGTlsExpansionCounter;
/*040*/ULONGTlsBitmap;
/*044*/LARGE_INTEGER