<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Windows Process內存組織結構及重要域解析

      最近惡補操作系統和一些底層的知識。遂寫篇文章來說說從操作系統的角度來研究Process的一些結構,實現,Porcess的初始化,重要的結構體域的定義,代表的含義,如何組織起來的,等。還有在前段時間研究托管的static字段到底在內存中如何組織的時候,遇到的handle table不熟悉的問題。

             一個xp里面的Process,是由幾個Eprocess,執行體進程塊來表示的。這個Eprocess里面不僅包含了進程相關的一些重要的數據結構,同時還包含了進程一些重要的環境變量之內的東西。EPROCESS塊位于操作系統的進程空間里面。不過PEB塊是在用戶空間里面的。因為PEB塊包含了一些需要用戶來修改的數據,放在操作系統空間中會導致不安全和頻繁的操作模式的切換。

             從網上c了一個圖過來說明,這個圖是windows internal第六章里面的。一個完整的Process的東西分別放在了SYSTEM ADDRESSPROCESS ADDRESS里面。用來適應不同的操作模式。

             在內核調試模式下,可以dtProcess的內核執行塊的結構:

          



      lkd> dt nt!_eprocess

         +0x000 Pcb              : _KPROCESS

         +0x06c ProcessLock      : _EX_PUSH_LOCK

         +0x070 CreateTime       : _LARGE_INTEGER

         +0x078 ExitTime         : _LARGE_INTEGER

         +0x080 RundownProtect   : _EX_RUNDOWN_REF

         +0x084 UniqueProcessId  : Ptr32 Void

         +0x088 ActiveProcessLinks : _LIST_ENTRY

         +0x090 QuotaUsage       : [3] Uint4B

         +0x09c QuotaPeak        : [3] Uint4B

         +0x0a8 CommitCharge     : Uint4B

         +0x0ac PeakVirtualSize  : Uint4B

         +0x0b0 VirtualSize      : Uint4B

         +0x0b4 SessionProcessLinks : _LIST_ENTRY

         +0x0bc DebugPort        : Ptr32 Void

         +0x0c0 ExceptionPort    : Ptr32 Void

         +0x0c4 ObjectTable      : Ptr32 _HANDLE_TABLE

         +0x0c8 Token            : _EX_FAST_REF

         +0x0cc WorkingSetLock   : _FAST_MUTEX

         +0x0ec WorkingSetPage   : Uint4B

         +0x0f0 AddressCreationLock : _FAST_MUTEX

         +0x110 HyperSpaceLock   : Uint4B

         +0x114 ForkInProgress   : Ptr32 _ETHREAD

         +0x118 HardwareTrigger  : Uint4B

         +0x11c VadRoot          : Ptr32 Void

         +0x120 VadHint          : Ptr32 Void

         +0x124 CloneRoot        : Ptr32 Void

         +0x128 NumberOfPrivatePages : Uint4B

         +0x12c NumberOfLockedPages : Uint4B

         +0x130 Win32Process     : Ptr32 Void

         +0x134 Job              : Ptr32 _EJOB

         +0x138 SectionObject    : Ptr32 Void

         +0x13c SectionBaseAddress : Ptr32 Void

         +0x140 QuotaBlock       : Ptr32 _EPROCESS_QUOTA_BLOCK

         +0x144 WorkingSetWatch  : Ptr32 _PAGEFAULT_HISTORY

         +0x148 Win32WindowStation : Ptr32 Void

         +0x14c InheritedFromUniqueProcessId : Ptr32 Void

         +0x150 LdtInformation   : Ptr32 Void

         +0x154 VadFreeHint      : Ptr32 Void

         +0x158 VdmObjects       : Ptr32 Void

         +0x15c DeviceMap        : Ptr32 Void

         +0x160 PhysicalVadList  : _LIST_ENTRY

         +0x168 PageDirectoryPte : _HARDWARE_PTE

         +0x168 Filler           : Uint8B

         +0x170 Session          : Ptr32 Void

         +0x174 ImageFileName    : [16] UChar

         +0x184 JobLinks         : _LIST_ENTRY

         +0x18c LockedPagesList  : Ptr32 Void

         +0x190 ThreadListHead   : _LIST_ENTRY

         +0x198 SecurityPort     : Ptr32 Void

         +0x19c PaeTop           : Ptr32 Void

         +0x1a0 ActiveThreads    : Uint4B

         +0x1a4 GrantedAccess    : Uint4B

         +0x1a8 DefaultHardErrorProcessing : Uint4B

         +0x1ac LastThreadExitStatus : Int4B

         +0x1b0 Peb              : Ptr32 _PEB

         +0x1b4 PrefetchTrace    : _EX_FAST_REF

         +0x1b8 ReadOperationCount : _LARGE_INTEGER

         +0x1c0 WriteOperationCount : _LARGE_INTEGER

         +0x1c8 OtherOperationCount : _LARGE_INTEGER

         +0x1d0 ReadTransferCount : _LARGE_INTEGER

         +0x1d8 WriteTransferCount : _LARGE_INTEGER

         +0x1e0 OtherTransferCount : _LARGE_INTEGER

         +0x1e8 CommitChargeLimit : Uint4B

         +0x1ec CommitChargePeak : Uint4B

         +0x1f0 AweInfo          : Ptr32 Void

         +0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO

         +0x1f8 Vm               : _MMSUPPORT

         +0x238 LastFaultCount   : Uint4B

         +0x23c ModifiedPageCount : Uint4B

         +0x240 NumberOfVads     : Uint4B

         +0x244 JobStatus        : Uint4B

         +0x248 Flags            : Uint4B

         +0x248 CreateReported   : Pos 0, 1 Bit

         +0x248 NoDebugInherit   : Pos 1, 1 Bit

         +0x248 ProcessExiting   : Pos 2, 1 Bit

         +0x248 ProcessDelete    : Pos 3, 1 Bit

         +0x248 Wow64SplitPages  : Pos 4, 1 Bit

         +0x248 VmDeleted        : Pos 5, 1 Bit

         +0x248 OutswapEnabled   : Pos 6, 1 Bit

         +0x248 Outswapped       : Pos 7, 1 Bit

         +0x248 ForkFailed       : Pos 8, 1 Bit

         +0x248 HasPhysicalVad   : Pos 9, 1 Bit

         +0x248 AddressSpaceInitialized : Pos 10, 2 Bits

         +0x248 SetTimerResolution : Pos 12, 1 Bit

         +0x248 BreakOnTermination : Pos 13, 1 Bit

         +0x248 SessionCreationUnderway : Pos 14, 1 Bit

         +0x248 WriteWatch       : Pos 15, 1 Bit

         +0x248 ProcessInSession : Pos 16, 1 Bit

         +0x248 OverrideAddressSpace : Pos 17, 1 Bit

         +0x248 HasAddressSpace  : Pos 18, 1 Bit

         +0x248 LaunchPrefetched : Pos 19, 1 Bit

         +0x248 InjectInpageErrors : Pos 20, 1 Bit

         +0x248 VmTopDown        : Pos 21, 1 Bit

         +0x248 Unused3          : Pos 22, 1 Bit

         +0x248 Unused4          : Pos 23, 1 Bit

         +0x248 VdmAllowed       : Pos 24, 1 Bit

         +0x248 Unused           : Pos 25, 5 Bits

         +0x248 Unused1          : Pos 30, 1 Bit

         +0x248 Unused2          : Pos 31, 1 Bit

         +0x24c ExitStatus       : Int4B

         +0x250 NextPageColor    : Uint2B

         +0x252 SubSystemMinorVersion : UChar

         +0x253 SubSystemMajorVersion : UChar

         +0x252 SubSystemVersion : Uint2B

         +0x254 PriorityClass    : UChar

         +0x255 WorkingSetAcquiredUnsafe : UChar

         +0x258 Cookie           : Uint4B

            

             也可以用dt nt!_Kprocess –r1命令來展開成為一級的形式,在輸出中顯示結構體的定義。

       

             首先看看_LIST_ENTRY表示的幾個域:

      +0x160 PhysicalVadList  : _LIST_ENTRY

      +0x184 JobLinks         : _LIST_ENTRY

      +0x190 ThreadListHead   : _LIST_ENTRY

      +0x0b4 SessionProcessLinks : _LIST_ENTRY

      +0x088 ActiveProcessLinks : _LIST_ENTRY

       

      首先給看看_LIST_ENTRY的定義:
      typedef struct _LIST_ENTRY {

         struct _LIST_ENTRY *Flink;

         struct _LIST_ENTRY *Blink;

      } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;

       

      使用這個結構體,就可以把許多同類型的數據組成一個鏈表。譬如有一種隱藏進程的方法,就是通過截斷EPROCESSActiveProcessLinks鏈表來隱藏進程。

      具體的做法,就是通過PsGetCurrentProcess函數,來獲取當前的KPROCESS的地址,而KPROCESS就是進程執行體,就是上面的EPROCESS的第一項。然后根據不同的操作系統的版本的偏移位置的不同,來得到_LIST_ENTRY鏈表,然后通過修改鏈表來達到隱藏進程的目的。

      同時,根據PsGetCurrentProcess返回的KPROCESS的地址得到了EPROCESS執行體之后,具體分析不同版本操作系統的EPROCESS結構體的不同,還可以做很多事情。

       

             從給起的變量的名字上面,可以大致的知道這些鏈表都把啥東西鏈接了起來。

       

             整個EPROCESS的大小和包含的結構體的定義,可以使用!strct _EPROCESS這個命令來獲取到:

             lkd> !strct _eprocess

      struct _EPROCESS (sizeof=648)

      +000 struct   _KPROCESS Pcb

      +070 struct   _KEVENT LockEvent

      +090 union    _LARGE_INTEGER ExitTime

      +098 struct   _KTHREAD *LockOwner

      +0a0 struct   _LIST_ENTRY ActiveProcessLinks

      +0d0 struct   _MMSUPPORT Vm

      +118 struct   _LIST_ENTRY SessionProcessLinks

      +128 struct   _HANDLE_TABLE *ObjectTable

      +130 struct   _FAST_MUTEX WorkingSetLock

      +158 struct   _FAST_MUTEX AddressCreationLock

      +17c struct   _ETHREAD *ForkInProgress

      +184 struct   _KEVENT *VmOperationEvent

      +1b0 struct   _PEB *Peb

      +1b8 struct   _EPROCESS_QUOTA_BLOCK *QuotaBlock

      +1c0 struct   _PAGEFAULT_HISTORY *WorkingSetWatch

      +1e8 struct   _LIST_ENTRY PhysicalVadList

      +1f0 struct   _HARDWARE_PTE_X86 PageDirectoryPte

      +218 struct   _EJOB *Job

      +220 struct   _LIST_ENTRY JobLinks

      +230 struct   _WOW64_PROCESS *Wow64Process

      +238 union    _LARGE_INTEGER ReadOperationCount

      +240 union    _LARGE_INTEGER WriteOperationCount

      +248 union    _LARGE_INTEGER OtherOperationCount

      +250 union    _LARGE_INTEGER ReadTransferCount

      +258 union    _LARGE_INTEGER WriteTransferCount

      +260 union    _LARGE_INTEGER OtherTransferCount

      +270 struct   _LIST_ENTRY ThreadListHead

      +278 struct   _RTL_BITMAP *VadPhysicalPagesBitMap

      這里只留下structunion,區域的數據類型全部去掉了。

      每個EPROCESS的第一個域,都是一個KPROCESS域。KPROCESS包含了公共的分發器對象頭,指向進程頁面目錄的指針,KTHREAD的內核線程塊的列表,線程的內核時間和用戶時間等等。簡單的瞅瞅:

      lkd> dt _KPROCESS

      ntdll!_KPROCESS

         +0x000 Header           : _DISPATCHER_HEADER

         +0x010 ProfileListHead  : _LIST_ENTRY

      //進程的頁目錄

         +0x018 DirectoryTableBase : [2] Uint4B

         +0x020 LdtDescriptor    : _KGDTENTRY

             //GDT的入口

         +0x028 Int21Descriptor  : _KIDTENTRY

             //IDT的入口

         +0x030 IopmOffset       : Uint2B

         +0x032 Iopl             : UChar

         +0x033 Unused           : UChar

         +0x034 ActiveProcessors : Uint4B

         +0x038 KernelTime       : Uint4B

         +0x03c UserTime         : Uint4B

         +0x040 ReadyListHead    : _LIST_ENTRY

         +0x048 SwapListEntry    : _SINGLE_LIST_ENTRY

         +0x04c VdmTrapcHandler  : Ptr32 Void

         +0x050 ThreadListHead   : _LIST_ENTRY

             //KTHREAD的鏈

         +0x058 ProcessLock      : Uint4B

         +0x05c Affinity         : Uint4B

         +0x060 StackCount       : Uint2B

         +0x062 BasePriority     : Char

         +0x063 ThreadQuantum    : Char

         +0x064 AutoAlignment    : UChar

         +0x065 State            : UChar

         +0x066 ThreadSeed       : UChar

         +0x067 DisableBoost     : UChar

         +0x068 PowerState       : UChar

         +0x069 DisableQuantum   : UChar

         +0x06a IdealNode        : UChar

         +0x06b Flags            : _KEXECUTE_OPTIONS

             //運行的標識位

         +0x06b ExecuteOptions   : Uchar

            

             可以用!process 0 0來獲取系統里面正在運行的所有線程的EPROCESS的地址:

             lkd> !process 0 0

      PROCESS 821b77c0  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000

          DirBase: 02ac0020  ObjectTable: e1001e10  HandleCount: 277.

          Image: System

       

      PROCESS 8207c740  SessionId: none  Cid: 0180    Peb: 7ffd5000  ParentCid: 0004

          DirBase: 02ac0040  ObjectTable: e13ad948  HandleCount:  21.

          Image: SMSS.EXE

       

      PROCESS 820ee020  SessionId: 0  Cid: 027c    Peb: 7ffdf000  ParentCid: 0180

          DirBase: 02ac0060  ObjectTable: e1401eb0  HandleCount: 309.

      Image: CSRSS.EXE

       

      如果不帶參數的話,就直接獲取當前正在運行的進程的情況:

       

      lkd> !process

      PROCESS 81fe15c8  SessionId: 0  Cid: 0604    Peb: 7ffd4000  ParentCid: 05c4

          DirBase: 02ac0320  ObjectTable: e1ae43e8  HandleCount: 635.

          Image: windbg.exe

          VadRoot 81dc61b0 Vads 792 Clone 0 Private 43397. Modified 74582. Locked 1.

          DeviceMap e1a2c530

          Token                             e2343bd0

          ElapsedTime                       3 Days 00:51:45.656

          UserTime                          00:02:52.656

          KernelTime                        00:01:08.937

          QuotaPoolUsage[PagedPool]         140124

          QuotaPoolUsage[NonPagedPool]      32200

          Working Set Sizes (now,min,max)  (35983, 50, 345) (143932KB, 200KB, 1380KB)

          PeakWorkingSetSize                45310

          VirtualSize                       293 Mb

          PeakVirtualSize                   424 Mb

          PageFaultCount                    210305

          MemoryPriority                    BACKGROUND

          BasePriority                      8

          CommitCharge                      44348

       

      THREAD 81da02e8  Cid 0604.04fc  Teb: 7ffdf000 Win32Thread: e2329eb0 WAIT: (WrUserRequest) UserMode Non-Alertable

      82133d30  SynchronizationEvent

      略去幾條線程的信息。

       

      對比KPROCESS的結構和上面Process命令得到的輸出結果,可以看到,Process命令只是輸出了一部分的Process的信息。如果采用!Process 0 0來獲取到某特特定進程的Eprocess的地址做為Process命令的參數,就可以得到特定的Process的信息。

       

      同理,對PEB的查看也是一樣:

      lkd> !strct peb

      struct   _PEB (sizeof=488)

      +000 byte     InheritedAddressSpace

      +001 byte     ReadImageFileExecOptions

      +002 byte     BeingDebugged

      +003 byte     SpareBool

      +004 void     *Mutant

      +008 void     *ImageBaseAddress

      +00c struct   _PEB_LDR_DATA *Ldr

      +010 struct   _RTL_USER_PROCESS_PARAMETERS *ProcessParameters

      +014 void     *SubSystemData

      +018 void     *ProcessHeap

      +01c void     *FastPebLock

      +020 void     *FastPebLockRoutine

      +024 void     *FastPebUnlockRoutine

      +028 uint32   EnvironmentUpdateCount

      +02c void     *KernelCallbackTable

      +030 uint32   SystemReserved[2]

      +038 struct   _PEB_FREE_BLOCK *FreeList

      +03c uint32   TlsExpansionCounter

      +040 void     *TlsBitmap

      +044 uint32   TlsBitmapBits[2]

      +04c void     *ReadOnlySharedMemoryBase

      +050 void     *ReadOnlySharedMemoryHeap

      +054 void     **ReadOnlyStaticServerData

      +058 void     *AnsiCodePageData

      +05c void     *OemCodePageData

      +060 void     *UnicodeCaseTableData

      +064 uint32   NumberOfProcessors

      +068 uint32   NtGlobalFlag

      +070 union    _LARGE_INTEGER CriticalSectionTimeout

      +070    uint32   LowPart

      +074    int32    HighPart

      +070    struct   __unnamed3 u

      +070       uint32   LowPart

      +074       int32    HighPart

      +070    int64    QuadPart

      +078 uint32   HeapSegmentReserve

      +07c uint32   HeapSegmentCommit

      +080 uint32   HeapDeCommitTotalFreeThreshold

      +084 uint32   HeapDeCommitFreeBlockThreshold

      +088 uint32   NumberOfHeaps

      +08c uint32   MaximumNumberOfHeaps

      +090 void     **ProcessHeaps

      +094 void     *GdiSharedHandleTable

      +098 void     *ProcessStarterHelper

      +09c uint32   GdiDCAttributeList

      +0a0 void     *LoaderLock

      +0a4 uint32   OSMajorVersion

      +0a8 uint32   OSMinorVersion

      +0ac uint16   OSBuildNumber

      +0ae uint16   OSCSDVersion

      +0b0 uint32   OSPlatformId

      +0b4 uint32   ImageSubsystem

      +0b8 uint32   ImageSubsystemMajorVersion

      +0bc uint32   ImageSubsystemMinorVersion

      +0c0 uint32   ImageProcessAffinityMask

      +0c4 uint32   GdiHandleBuffer[34]

      +14c function *PostProcessInitRoutine

      +150 void     *TlsExpansionBitmap

      +154 uint32   TlsExpansionBitmapBits[32]

      +1d4 uint32   SessionId

      +1d8 void     *AppCompatInfo

      +1dc struct   _UNICODE_STRING CSDVersion

      +1dc    uint16   Length

      +1de    uint16   MaximumLength

      +1e0    uint16   *Buffer

       

      本來還準備說說handle table,上面的廢話太多了,下篇再說了。

       

      7/22/2008 2:35:05 PM   首發sscli.cnblogs.com   lbq1221119@jl

      posted on 2008-07-22 14:45  lbq1221119  閱讀(4480)  評論(11)    收藏  舉報

      導航

      主站蜘蛛池模板: 九九热视频在线观看一区| 欧美成人精品一区二区三区免费| 婷婷四虎东京热无码群交双飞视频 | 色 亚洲 日韩 国产 综合| 久久婷婷五月综合色和啪| 午夜福利国产盗摄久久性| 国产自拍偷拍视频在线观看| 欧美亚洲高清日韩成人| 欧美性猛交xxxx乱大交丰满| 亚洲午夜福利网在线观看 | 国产日韩一区二区四季| 熟妇人妻激情偷爽文| 女人香蕉久久毛毛片精品| 成全高清在线播放电视剧| 欧美精品国产一区二区三区| 国产亚洲精品第一综合| 国色天香成人一区二区| 国产精品无码v在线观看| 国产一区二区日韩在线| 在线观看成人永久免费网站| 亚洲全乱码精品一区二区| 亚洲日韩性欧美中文字幕| 晋城| 无套内谢少妇毛片aaaa片免费| 四虎国产精品成人免费久久| 午夜大尺度福利视频一区| 久久亚洲2019中文字幕| 亚洲 制服 丝袜 无码| 九九热在线这里只有精品| 午夜天堂一区人妻| 无遮挡高潮国产免费观看| 日韩av裸体在线播放| 亚洲女女女同性video| 黑色丝袜脚交视频麻豆 | 汕尾市| 国产福利片无码区在线观看| 国语精品国内自产视频| 色成人精品免费视频| 少妇精品无码一区二区免费视频| 日本免费人成视频在线观看| 岛国大片在线免费播放|