diff options
Diffstat (limited to 'ReverseEngineering/Get-NtSystemInformation.ps1')
-rw-r--r-- | ReverseEngineering/Get-NtSystemInformation.ps1 | 1082 |
1 files changed, 0 insertions, 1082 deletions
diff --git a/ReverseEngineering/Get-NtSystemInformation.ps1 b/ReverseEngineering/Get-NtSystemInformation.ps1 deleted file mode 100644 index 2bde8f6..0000000 --- a/ReverseEngineering/Get-NtSystemInformation.ps1 +++ /dev/null @@ -1,1082 +0,0 @@ -function Get-NtSystemInformation -{ -<# -.SYNOPSIS - - Returns various forms of internal OS information. - - PowerSploit Function: Get-NtSystemInformation - Author: Matthew Graeber (@mattifestation) - License: BSD 3-Clause - Required Dependencies: None - Optional Dependencies: None - -.DESCRIPTION - - Get-NtSystemInformation is a utility that calls and parses the output of the - ntdll!NtQuerySystemInformation function. This utility can be used to query - internal OS information that is typically not made visible to a user. - -.PARAMETER PoolTagInformation - - Returns information on tagged kernel pool allocations. - -.PARAMETER ModuleInformation - - Returns loaded kernel module information. - -.PARAMETER HandleInformation - - Returns handle information about user-mode handles and their respective - address in the kernel. - -.PARAMETER ObjectType - - Specifies the object type to be returned when listing handles. The following - types are permitted: - - Adapter, ALPC Port, Callback, CompositionSurface, Controller, DebugObject, - Desktop, Device, Directory, Driver, DxgkSharedResource, DxgkSharedSyncObject, - EtwConsumer, EtwRegistration, Event, EventPair, File, FilterCommunicationPort, - FilterConnectionPort, IoCompletion, IoCompletionReserve, IRTimer, Job, Key, - KeyedEvent, Mutant, PcwObject, Port, PowerRequest, Process, Profile, Section, - Semaphore, Session, SymbolicLink, Thread, Timer, TmEn, TmRm, TmTm, TmTx, Token, - TpWorkerFactory, Type, UserApcReserve, WaitablePort, WaitCompletionPacket, - WindowStation, WmiGuid - -.PARAMETER ObjectInformation - - Returns information about user-mode objects and their respective kernel pool - allocations. - -.PARAMETER CodeIntegrityInformation - - Returns user-mode code integrity flags. - -.PARAMETER GlobalFlags - - Returns a list of all enabled global flags. - -.EXAMPLE - - C:\PS> Get-NtSystemInformation -PoolTagInformation - - Description - ----------- - Returns information on tagged kernel pool allocations. The output is similar - to that of poolmon.exe. The output is the result of parsing _SYSTEM_POOLTAG - structures. - -.EXAMPLE - - C:\PS> Get-NtSystemInformation -ModuleInformation - - Description - ----------- - Returns loaded kernel module information including the base address of - loaded kernel modules. The output is the result of parsing the - undocumented _SYSTEM_MODULE_INFORMATION structure. - -.EXAMPLE - - C:\PS> Get-NtSystemInformation -HandleInformation - - Description - ----------- - Returns handle information about user-mode handles and their respective - address in the kernel. The output is similar to that of handle.exe but - doesn't require an elevated prompt. handle.exe also doesn't display the - kernel address of the object that the handle represents. The output is the - result of parsing _SYSTEM_HANDLE_TABLE_ENTRY_INFO structures. - -.EXAMPLE - - C:\PS> Get-NtSystemInformation -ObjectInformation - - Description - ----------- - Returns information about user-mode objects and their respective kernel pool - allocations. The output is the result of parsing - _SYSTEM_OBJECTTYPE_INFORMATION and _SYSTEM_OBJECT_INFORMATION structures. - - Note: FLG_MAINTAIN_OBJECT_TYPELIST (0x4000), FLG_ENABLE_HANDLE_TYPE_TAGGING - (0x01000000) global flags must be set in order to retrieve the output of this - command. - -.EXAMPLE - - C:\PS> Get-NtSystemInformation -GlobalFlags - - Description - ----------- - Returns a list of all enabled global flags. This is similar to running - gflags.exe /r - -.LINK - - http://www.exploit-monday.com/ -#> - - [CmdletBinding()] Param ( - [Parameter( ParameterSetName = 'PoolTagInformation' )] - [Switch] - $PoolTagInformation, - - [Parameter( ParameterSetName = 'ModuleInformation' )] - [Switch] - $ModuleInformation, - - [Parameter( ParameterSetName = 'HandleInformation' )] - [Switch] - $HandleInformation, - - [Parameter( ParameterSetName = 'HandleInformation' )] - [ValidateSet('Adapter', 'ALPC Port', 'Callback', 'CompositionSurface', 'Controller', 'DebugObject', 'Desktop', 'Device', 'Directory', 'Driver', 'DxgkSharedResource', 'DxgkSharedSyncObject', 'EtwConsumer', 'EtwRegistration', 'Event', 'EventPair', 'File', 'FilterCommunicationPort', 'FilterConnectionPort', 'IoCompletion', 'IoCompletionReserve', 'IRTimer', 'Job', 'Key', 'KeyedEvent', 'Mutant', 'PcwObject', 'Port', 'PowerRequest', 'Process', 'Profile', 'Section', 'Semaphore', 'Session', 'SymbolicLink', 'Thread', 'Timer', 'TmEn', 'TmRm', 'TmTm', 'TmTx', 'Token', 'TpWorkerFactory', 'Type', 'UserApcReserve', 'WaitablePort', 'WaitCompletionPacket', 'WindowStation', 'WmiGuid')] - [String] - $ObjectType, - - [Parameter( ParameterSetName = 'ObjectInformation' )] - [Switch] - $ObjectInformation, - - [Parameter( ParameterSetName = 'LockInformation' )] - [Switch] - $LockInformation, - - [Parameter( ParameterSetName = 'CodeIntegrityInformation' )] - [Switch] - $CodeIntegrityInformation, - - [Parameter( ParameterSetName = 'GlobalFlags' )] - [Switch] - $GlobalFlags - ) - -#region Define the assembly/module that will hold all of our dynamic types. - try { $ntdll = [ntdll] } catch [Management.Automation.RuntimeException] - { - $DynAssembly = New-Object System.Reflection.AssemblyName('SysUtils') - $AssemblyBuilder = [AppDomain]::CurrentDomain.DefineDynamicAssembly($DynAssembly, [Reflection.Emit.AssemblyBuilderAccess]::Run) - $ModuleBuilder = $AssemblyBuilder.DefineDynamicModule('SysUtils', $False) - - # Define [ntdll]::NtQuerySystemInformation method - $TypeBuilder = $ModuleBuilder.DefineType('ntdll', 'Public, Class') - $PInvokeMethod = $TypeBuilder.DefinePInvokeMethod('NtQuerySystemInformation', 'ntdll.dll', ([Reflection.MethodAttributes]::Public -bor [Reflection.MethodAttributes]::Static), [Reflection.CallingConventions]::Standard, [Int32], [Type[]]@([UInt32], [IntPtr], [UInt32], [UInt32].MakeByRefType()), [Runtime.InteropServices.CallingConvention]::Winapi, [Runtime.InteropServices.CharSet]::Auto) - $DllImportConstructor = [Runtime.InteropServices.DllImportAttribute].GetConstructor(@([String])) - $SetLastError = [Runtime.InteropServices.DllImportAttribute].GetField('SetLastError') - $SetLastErrorCustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($DllImportConstructor, @('ntdll.dll'), [Reflection.FieldInfo[]]@($SetLastError), @($true)) - $PInvokeMethod.SetCustomAttribute($SetLastErrorCustomAttribute) - $ntdll = $TypeBuilder.CreateType() - } -#endregion - -#region Define global custom attributes - $LayoutConstructor = [Runtime.InteropServices.StructLayoutAttribute].GetConstructor([Runtime.InteropServices.LayoutKind]) - $CharsetField = [Runtime.InteropServices.StructLayoutAttribute].GetField('CharSet') - $StructLayoutCustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($LayoutConstructor, @([Runtime.InteropServices.LayoutKind]::Explicit), $CharsetField, @([Runtime.InteropServices.CharSet]::Ansi)) - - $FlagsConstructor = [FlagsAttribute].GetConstructor(@()) - $FlagsCustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($FlagsConstructor, @()) - - $MarshalAsConstructor = [Runtime.InteropServices.MarshalAsAttribute].GetConstructor([Runtime.InteropServices.UnmanagedType]) - $SizeConst = [Runtime.InteropServices.MarshalAsAttribute].GetField('SizeConst') - - $StructAttributes = 'AutoLayout, AnsiClass, Class, Public, SequentialLayout, Sealed, BeforeFieldInit' -#endregion - -#region Define enum types - try { $SystemInformationClass = [SYSTEM_INFORMATION_CLASS] } catch [Management.Automation.RuntimeException] - { - # The entries that are commented out I'll get around to when I feel like it. - - $EnumBuilder = $ModuleBuilder.DefineEnum('SYSTEM_INFORMATION_CLASS', 'Public', [Int32]) - #$EnumBuilder.DefineLiteral('SystemBasicInformation', [Int32] 0x00000000) | Out-Null - #$EnumBuilder.DefineLiteral('SystemProcessorInformation', [Int32] 0x00000001) | Out-Null - #$EnumBuilder.DefineLiteral('SystemPerformanceInformation', [Int32] 0x00000002) | Out-Null - #$EnumBuilder.DefineLiteral('SystemTimeOfDayInformation', [Int32] 0x00000003) | Out-Null - #$EnumBuilder.DefineLiteral('SystemProcessInformation', [Int32] 0x00000005) | Out-Null - #$EnumBuilder.DefineLiteral('SystemCallCounts', [Int32] 0x00000006) | Out-Null - #$EnumBuilder.DefineLiteral('SystemConfigurationInformation', [Int32] 0x00000007) | Out-Null - #$EnumBuilder.DefineLiteral('SystemProcessorPerformanceInformation', [Int32] 0x00000008) | Out-Null - $EnumBuilder.DefineLiteral('SystemGlobalFlag', [Int32] 0x00000009) | Out-Null - $EnumBuilder.DefineLiteral('SystemModuleInformation', [Int32] 0x0000000B) | Out-Null - $EnumBuilder.DefineLiteral('SystemLockInformation', [Int32] 0x0000000C) | Out-Null - $EnumBuilder.DefineLiteral('SystemHandleInformation', [Int32] 0x00000010) | Out-Null - $EnumBuilder.DefineLiteral('SystemObjectInformation', [Int32] 0x00000011) | Out-Null - #$EnumBuilder.DefineLiteral('SystemPagefileInformation', [Int32] 0x00000012) | Out-Null - #$EnumBuilder.DefineLiteral('SystemInstructionEmulationCounts', [Int32] 0x00000013) | Out-Null - $EnumBuilder.DefineLiteral('SystemPoolTagInformation', [Int32] 0x00000016) | Out-Null - #$EnumBuilder.DefineLiteral('SystemInterruptInformation', [Int32] 0x00000017) | Out-Null - #$EnumBuilder.DefineLiteral('SystemExceptionInformation', [Int32] 0x00000021) | Out-Null - #$EnumBuilder.DefineLiteral('SystemRegistryQuotaInformation', [Int32] 0x00000025) | Out-Null - #$EnumBuilder.DefineLiteral('SystemLookasideInformation', [Int32] 0x0000002D) | Out-Null - $EnumBuilder.DefineLiteral('SystemCodeIntegrityInformation', [Int32] 0x00000067) | Out-Null - $SystemInformationClass = $EnumBuilder.CreateType() - } - - try { $NtStatus = [NTSTATUS] } catch [Management.Automation.RuntimeException] - { - $EnumBuilder = $ModuleBuilder.DefineEnum('NTSTATUS', 'Public', [Int32]) - $EnumBuilder.DefineLiteral('STATUS_SUCCESS', [Int32] 0x00000000) | Out-Null - $EnumBuilder.DefineLiteral('STATUS_INFO_LENGTH_MISMATCH', [Int32] 0xC0000004) | Out-Null - $NtStatus = $EnumBuilder.CreateType() - } - - try { $LockdownState = [LOCKDOWN_STATE] } catch [Management.Automation.RuntimeException] - { - $EnumBuilder = $ModuleBuilder.DefineEnum('LOCKDOWN_STATE', 'Public', [Int32]) - $EnumBuilder.DefineLiteral('UMCINONE', [Int32] 0x00000000) | Out-Null - $EnumBuilder.DefineLiteral('UMCIENFORCE', [Int32] 0x00000004) | Out-Null - $EnumBuilder.DefineLiteral('UMCIAUDIT', [Int32] 0xC0000008) | Out-Null - $LockdownState = $EnumBuilder.CreateType() - } - - try { $PoolType = [POOL_TYPE] } catch [Management.Automation.RuntimeException] - { - $EnumBuilder = $ModuleBuilder.DefineEnum('POOL_TYPE', 'Public', [UInt32]) - $EnumBuilder.DefineLiteral('NonPagedPoolExecute', [UInt32] 0x00000000) | Out-Null - $EnumBuilder.DefineLiteral('PagedPool', [UInt32] 0x00000001) | Out-Null - $EnumBuilder.DefineLiteral('NonPagedPoolMustSucceed', [UInt32] 0x00000002) | Out-Null - $EnumBuilder.DefineLiteral('DontUseThisType', [UInt32] 0x00000003) | Out-Null - $EnumBuilder.DefineLiteral('NonPagedPoolCacheAligned', [UInt32] 0x00000004) | Out-Null - $EnumBuilder.DefineLiteral('PagedPoolCacheAligned', [UInt32] 0x00000005) | Out-Null - $EnumBuilder.DefineLiteral('NonPagedPoolCacheAlignedMustS', [UInt32] 0x00000006) | Out-Null - $EnumBuilder.DefineLiteral('MaxPoolType', [UInt32] 0x00000007) | Out-Null - $EnumBuilder.DefineLiteral('NonPagedPoolSession', [UInt32] 0x00000020) | Out-Null - $EnumBuilder.DefineLiteral('PagedPoolSession', [UInt32] 0x00000021) | Out-Null - $EnumBuilder.DefineLiteral('NonPagedPoolMustSucceedSession', [UInt32] 0x00000022) | Out-Null - $EnumBuilder.DefineLiteral('DontUseThisTypeSession', [UInt32] 0x00000023) | Out-Null - $EnumBuilder.DefineLiteral('NonPagedPoolCacheAlignedSession', [UInt32] 0x00000024) | Out-Null - $EnumBuilder.DefineLiteral('PagedPoolCacheAlignedSession', [UInt32] 0x00000025) | Out-Null - $EnumBuilder.DefineLiteral('NonPagedPoolCacheAlignedMustSSession', [UInt32] 0x00000026) | Out-Null - $EnumBuilder.DefineLiteral('NonPagedPoolNx', [UInt32] 0x00000200) | Out-Null - $EnumBuilder.DefineLiteral('NonPagedPoolNxCacheAligned', [UInt32] 0x00000204) | Out-Null - $EnumBuilder.DefineLiteral('NonPagedPoolSessionNx', [UInt32] 0x00000220) | Out-Null - $PoolType = $EnumBuilder.CreateType() - } - - try { $HandleFlags = [HANDLE_FLAGS] } catch [Management.Automation.RuntimeException] - { - $EnumBuilder = $ModuleBuilder.DefineEnum('HANDLE_FLAGS', 'Public', [Byte]) - $EnumBuilder.DefineLiteral('PROTECT_FROM_CLOSE', [Byte] 1) | Out-Null - $EnumBuilder.DefineLiteral('INHERIT', [Byte] 2) | Out-Null - $EnumBuilder.SetCustomAttribute($FlagsCustomAttribute) - $HandleFlags = $EnumBuilder.CreateType() - } - - try { $ObjectAttributes = [OBJECT_ATTRIBUTES] } catch [Management.Automation.RuntimeException] - { - $EnumBuilder = $ModuleBuilder.DefineEnum('OBJECT_ATTRIBUTES', 'Public', [Int32]) - $EnumBuilder.DefineLiteral('OBJ_INHERIT', [Int32] 0x00000002) | Out-Null - $EnumBuilder.DefineLiteral('OBJ_PERMANENT', [Int32] 0x00000010) | Out-Null - $EnumBuilder.DefineLiteral('OBJ_EXCLUSIVE', [Int32] 0x00000020) | Out-Null - $EnumBuilder.DefineLiteral('OBJ_CASE_INSENSITIVE', [Int32] 0x00000040) | Out-Null - $EnumBuilder.DefineLiteral('OBJ_OPENIF', [Int32] 0x00000080) | Out-Null - $EnumBuilder.DefineLiteral('OBJ_OPENLINK', [Int32] 0x00000100) | Out-Null - $EnumBuilder.SetCustomAttribute($FlagsCustomAttribute) - $ObjectAttributes = $EnumBuilder.CreateType() - } - - try { $ObjectFlags = [OBJECT_FLAGS] } catch [Management.Automation.RuntimeException] - { - $EnumBuilder = $ModuleBuilder.DefineEnum('OBJECT_FLAGS', 'Public', [UInt16]) - $EnumBuilder.DefineLiteral('SINGLE_HANDLE_ENTRY', [UInt16] 0x0040) | Out-Null - $EnumBuilder.DefineLiteral('DEFAULT_SECURITY_QUOTA', [UInt16] 0x0020) | Out-Null - $EnumBuilder.DefineLiteral('PERMANENT', [UInt16] 0x0010) | Out-Null - $EnumBuilder.DefineLiteral('EXCLUSIVE', [UInt16] 0x0008) | Out-Null - $EnumBuilder.DefineLiteral('CREATOR_INFO', [UInt16] 0x0004) | Out-Null - $EnumBuilder.DefineLiteral('KERNEL_MODE', [UInt16] 0x0002) | Out-Null - $EnumBuilder.SetCustomAttribute($FlagsCustomAttribute) - $ObjectFlags = $EnumBuilder.CreateType() - } - - try { $AccessMask = [ACCESS_MASK] } catch [Management.Automation.RuntimeException] - { - $EnumBuilder = $ModuleBuilder.DefineEnum('ACCESS_MASK', 'Public', [Int32]) - $EnumBuilder.DefineLiteral('DELETE', [Int32] 0x00010000) | Out-Null - $EnumBuilder.DefineLiteral('READ_CONTROL', [Int32] 0x00020000) | Out-Null - $EnumBuilder.DefineLiteral('WRITE_DAC', [Int32] 0x00040000) | Out-Null - $EnumBuilder.DefineLiteral('WRITE_OWNER', [Int32] 0x00080000) | Out-Null - $EnumBuilder.DefineLiteral('SYNCHRONIZE', [Int32] 0x00100000) | Out-Null - $EnumBuilder.DefineLiteral('STANDARD_RIGHTS_REQUIRED', [Int32] 0x000F0000) | Out-Null - $EnumBuilder.DefineLiteral('STANDARD_RIGHTS_READ', [Int32] 0x00020000) | Out-Null - $EnumBuilder.DefineLiteral('STANDARD_RIGHTS_WRITE', [Int32] 0x00020000) | Out-Null - $EnumBuilder.DefineLiteral('STANDARD_RIGHTS_EXECUTE', [Int32] 0x00020000) | Out-Null - $EnumBuilder.DefineLiteral('STANDARD_RIGHTS_ALL', [Int32] 0x001F0000) | Out-Null - $EnumBuilder.DefineLiteral('ACCESS_SYSTEM_SECURITY', [Int32] 0x01000000) | Out-Null - $EnumBuilder.DefineLiteral('GENERIC_READ', [Int32] 0x80000000) | Out-Null - $EnumBuilder.DefineLiteral('GENERIC_WRITE', [Int32] 0x40000000) | Out-Null - $EnumBuilder.DefineLiteral('GENERIC_EXECUTE', [Int32] 0x20000000) | Out-Null - $EnumBuilder.DefineLiteral('GENERIC_ALL', [Int32] 0x10000000) | Out-Null - $EnumBuilder.SetCustomAttribute($FlagsCustomAttribute) - $AccessMask = $EnumBuilder.CreateType() - } - - try { $GFlagsEnum = [GLOBAL_FLAGS] } catch [Management.Automation.RuntimeException] - { - $EnumBuilder = $ModuleBuilder.DefineEnum('GLOBAL_FLAGS', 'Public', [Int32]) - $EnumBuilder.DefineLiteral('FLG_DISABLE_DBGPRINT', [Int32] 0x08000000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_KERNEL_STACK_TRACE_DB', [Int32] 0x00002000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_USER_STACK_TRACE_DB', [Int32] 0x00001000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_DEBUG_INITIAL_COMMAND', [Int32] 0x00000004) | Out-Null - $EnumBuilder.DefineLiteral('FLG_DEBUG_INITIAL_COMMAND_EX', [Int32] 0x04000000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_HEAP_DISABLE_COALESCING', [Int32] 0x00200000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_DISABLE_PAGE_KERNEL_STACKS', [Int32] 0x00080000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_DISABLE_PROTDLLS', [Int32] 0x80000000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_DISABLE_STACK_EXTENSION', [Int32] 0x00010000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_CRITSEC_EVENT_CREATION', [Int32] 0x10000000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_APPLICATION_VERIFIER', [Int32] 0x00000100) | Out-Null - $EnumBuilder.DefineLiteral('FLG_ENABLE_HANDLE_EXCEPTIONS', [Int32] 0x40000000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_ENABLE_CLOSE_EXCEPTIONS', [Int32] 0x00400000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_ENABLE_CSRDEBUG', [Int32] 0x00020000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_ENABLE_EXCEPTION_LOGGING', [Int32] 0x00800000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_HEAP_ENABLE_FREE_CHECK', [Int32] 0x00000020) | Out-Null - $EnumBuilder.DefineLiteral('FLG_HEAP_VALIDATE_PARAMETERS', [Int32] 0x00000040) | Out-Null - $EnumBuilder.DefineLiteral('FLG_HEAP_ENABLE_TAGGING', [Int32] 0x00000800) | Out-Null - $EnumBuilder.DefineLiteral('FLG_HEAP_ENABLE_TAG_BY_DLL', [Int32] 0x00008000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_HEAP_ENABLE_TAIL_CHECK', [Int32] 0x00000010) | Out-Null - $EnumBuilder.DefineLiteral('FLG_HEAP_VALIDATE_ALL', [Int32] 0x00000080) | Out-Null - $EnumBuilder.DefineLiteral('FLG_ENABLE_KDEBUG_SYMBOL_LOAD', [Int32] 0x00040000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_ENABLE_HANDLE_TYPE_TAGGING', [Int32] 0x01000000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_HEAP_PAGE_ALLOCS', [Int32] 0x02000000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_POOL_ENABLE_TAGGING', [Int32] 0x00000400) | Out-Null - $EnumBuilder.DefineLiteral('FLG_ENABLE_SYSTEM_CRIT_BREAKS', [Int32] 0x00100000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_MAINTAIN_OBJECT_TYPELIST', [Int32] 0x00004000) | Out-Null - $EnumBuilder.DefineLiteral('FLG_MONITOR_SILENT_PROCESS_EXIT', [Int32] 0x00000200) | Out-Null - $EnumBuilder.DefineLiteral('FLG_SHOW_LDR_SNAPS', [Int32] 0x00000002) | Out-Null - $EnumBuilder.DefineLiteral('FLG_STOP_ON_EXCEPTION', [Int32] 0x00000001) | Out-Null - $EnumBuilder.DefineLiteral('FLG_STOP_ON_HUNG_GUI', [Int32] 0x00000008) | Out-Null - $EnumBuilder.SetCustomAttribute($FlagsCustomAttribute) - $GFlagsEnum = $EnumBuilder.CreateType() - } -#endregion - -#region Define structs for each respective SYSTEM_INFORMATION_CLASS - if ([IntPtr]::Size -eq 8) - { - $Size_SYSTEM_MODULE = 296 - $Size_SYSTEM_POOL_TAG_INFORMATION = 40 - $Size_SYSTEM_HANDLE_INFORMATION = 24 - $Size_SYSTEM_OBJECTTYPE_INFORMATION = 64 - $Size_SYSTEM_OBJECT_INFORMATION = 80 - $Size_SYSTEM_LOCK_INFORMATION = 40 - } - else - { - $Size_SYSTEM_MODULE = 284 - $Size_SYSTEM_POOL_TAG_INFORMATION = 28 - $Size_SYSTEM_HANDLE_INFORMATION = 16 - $Size_SYSTEM_OBJECTTYPE_INFORMATION = 56 - $Size_SYSTEM_OBJECT_INFORMATION = 48 - $Size_SYSTEM_LOCK_INFORMATION = 36 - } - - try { $UnicodeStringClass = [_UNICODE_STRING] } catch [Management.Automation.RuntimeException] - { - $MarshalAsCustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($MarshalAsConstructor, @([Runtime.InteropServices.UnmanagedType]::LPWStr)) - - if ([IntPtr]::Size -eq 8) - { - $TypeBuilder = $ModuleBuilder.DefineType('_UNICODE_STRING', $StructAttributes, [ValueType], 2, 16) - $TypeBuilder.SetCustomAttribute($StructLayoutCustomAttribute) - - $TypeBuilder.DefineField('Length', [UInt16], 'Public').SetOffset(0) - $TypeBuilder.DefineField('MaximumLength', [UInt16], 'Public').SetOffset(2) - $BufferField = $TypeBuilder.DefineField('Buffer', [String], 'Public, HasFieldMarshal') - $BufferField.SetCustomAttribute($MarshalAsCustomAttribute) - $BufferField.SetOffset(8) - } - else - { - $TypeBuilder = $ModuleBuilder.DefineType('_UNICODE_STRING', $StructAttributes, [ValueType], 2, 8) - $TypeBuilder.SetCustomAttribute($StructLayoutCustomAttribute) - - $TypeBuilder.DefineField('Length', [UInt16], 'Public').SetOffset(0) - $TypeBuilder.DefineField('MaximumLength', [UInt16], 'Public').SetOffset(2) - $BufferField = $TypeBuilder.DefineField('Buffer', [String], 'Public, HasFieldMarshal') - $BufferField.SetCustomAttribute($MarshalAsCustomAttribute) - $BufferField.SetOffset(4) - } - - $UnicodeStringClass = $TypeBuilder.CreateType() - } - - try { $GenericMappingClass = [_GENERIC_MAPPING] } catch [Management.Automation.RuntimeException] - { - $TypeBuilder = $ModuleBuilder.DefineType('_GENERIC_MAPPING', $StructAttributes, [ValueType], 4, 16) - - $TypeBuilder.DefineField('GenericRead', [UInt32], 'Public') | Out-Null - $TypeBuilder.DefineField('GenericWrite', [UInt32], 'Public') | Out-Null - $TypeBuilder.DefineField('GenericExecute', [UInt32], 'Public') | Out-Null - $TypeBuilder.DefineField('GenericAll', [UInt32], 'Public') | Out-Null - - $GenericMappingClass = $TypeBuilder.CreateType() - } - - try { $HandleInfoClass = [_SYSTEM_HANDLE_INFORMATION] } catch [Management.Automation.RuntimeException] - { - $TypeBuilder = $ModuleBuilder.DefineType('_SYSTEM_HANDLE_INFORMATION', $StructAttributes, [ValueType], 1, $Size_SYSTEM_HANDLE_INFORMATION) - - $TypeBuilder.DefineField('UniqueProcessId', [UInt16], 'Public') | Out-Null - $TypeBuilder.DefineField('CreatorBackTraceIndex', [UInt16], 'Public') | Out-Null - $TypeBuilder.DefineField('ObjectTypeIndex', [Byte], 'Public') | Out-Null - $TypeBuilder.DefineField('HandleAttribute', [Byte], 'Public') | Out-Null - $TypeBuilder.DefineField('HandleValue', [UInt16], 'Public') | Out-Null - $TypeBuilder.DefineField('Object', [IntPtr], 'Public') | Out-Null - $TypeBuilder.DefineField('GrantedAccess', [UInt32], 'Public') | Out-Null - - $HandleInfoClass = $TypeBuilder.CreateType() - } - - try { $ModuleInfoClass = [_SYSTEM_MODULE] } catch [Management.Automation.RuntimeException] - { - $MarshalAsCustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($MarshalAsConstructor, @([Runtime.InteropServices.UnmanagedType]::ByValTStr), [Reflection.FieldInfo[]]@($SizeConst), @(256)) - - if ([IntPtr]::Size -eq 8) - { - $TypeBuilder = $ModuleBuilder.DefineType('_SYSTEM_MODULE', $StructAttributes, [ValueType], 1, $Size_SYSTEM_MODULE) - - $TypeBuilder.DefineField('Reserved1', [UInt32], 'Public') | Out-Null - $TypeBuilder.DefineField('Reserved2', [UInt32], 'Public') | Out-Null - $TypeBuilder.DefineField('ImageBaseAddress', [UInt64], 'Public') | Out-Null - $TypeBuilder.DefineField('ImageSize', [UInt32], 'Public') | Out-Null - $TypeBuilder.DefineField('Flags', [UInt32], 'Public') | Out-Null - $TypeBuilder.DefineField('Index', [UInt16], 'Public') | Out-Null - $TypeBuilder.DefineField('Rank', [UInt16], 'Public') | Out-Null - $TypeBuilder.DefineField('LoadCount', [UInt16], 'Public') | Out-Null - $TypeBuilder.DefineField('NameOffset', [UInt16], 'Public') | Out-Null - $NameField = $TypeBuilder.DefineField('Name', [String], 'Public, HasFieldMarshal') - } - else - { - $TypeBuilder = $ModuleBuilder.DefineType('_SYSTEM_MODULE', $StructAttributes, [ValueType], 1, $Size_SYSTEM_MODULE) - - $TypeBuilder.DefineField('Reserved1', [UInt16], 'Public') | Out-Null - $TypeBuilder.DefineField('Reserved2', [UInt16], 'Public') | Out-Null - $TypeBuilder.DefineField('ImageBaseAddress', [UInt32], 'Public') | Out-Null - $TypeBuilder.DefineField('ImageSize', [UInt32], 'Public') | Out-Null - $TypeBuilder.DefineField('Flags', [UInt32], 'Public') | Out-Null - $TypeBuilder.DefineField('Index', [UInt16], 'Public') | Out-Null - $TypeBuilder.DefineField('Rank', [UInt16], 'Public') | Out-Null - $TypeBuilder.DefineField('LoadCount', [UInt16], 'Public') | Out-Null - $TypeBuilder.DefineField('NameOffset', [UInt16], 'Public') | Out-Null - $NameField = $TypeBuilder.DefineField('Name', [String], 'Public, HasFieldMarshal') - } - - $NameField.SetCustomAttribute($MarshalAsCustomAttribute) - $ModuleInfoClass = $TypeBuilder.CreateType() - } - - try { $LockInfoClass = [_SYSTEM_LOCK_INFORMATION] } catch [Management.Automation.RuntimeException] - { - $TypeBuilder = $ModuleBuilder.DefineType('_SYSTEM_LOCK_INFORMATION', $StructAttributes, [ValueType], 1, $Size_SYSTEM_LOCK_INFORMATION) - $TypeBuilder.SetCustomAttribute($StructLayoutCustomAttribute) - - if ([IntPtr]::Size -eq 8) - { - $TypeBuilder.DefineField('Address', [IntPtr], 'Public').SetOffset(0) - $TypeBuilder.DefineField('Type', [UInt16], 'Public').SetOffset(8) - $TypeBuilder.DefineField('Reserved1', [UInt16], 'Public').SetOffset(10) - $TypeBuilder.DefineField('ExclusiveOwnerThreadId', [UInt32], 'Public').SetOffset(16) - $TypeBuilder.DefineField('ActiveCount', [UInt32], 'Public').SetOffset(24) - $TypeBuilder.DefineField('ContentionCount', [UInt32], 'Public').SetOffset(28) - $TypeBuilder.DefineField('Reserved2', [UInt32], 'Public').SetOffset(32) - $TypeBuilder.DefineField('Reserved3', [UInt32], 'Public').SetOffset(36) - $TypeBuilder.DefineField('NumberOfSharedWaiters', [UInt32], 'Public').SetOffset(40) - $TypeBuilder.DefineField('NumberOfExclusiveWaiters', [UInt32], 'Public').SetOffset(44) - } - else - { - $TypeBuilder.DefineField('Address', [IntPtr], 'Public').SetOffset(0) - $TypeBuilder.DefineField('Type', [UInt16], 'Public').SetOffset(4) - $TypeBuilder.DefineField('Reserved1', [UInt16], 'Public').SetOffset(6) - $TypeBuilder.DefineField('ExclusiveOwnerThreadId', [UInt32], 'Public').SetOffset(8) - $TypeBuilder.DefineField('ActiveCount', [UInt32], 'Public').SetOffset(12) - $TypeBuilder.DefineField('ContentionCount', [UInt32], 'Public').SetOffset(16) - $TypeBuilder.DefineField('Reserved2', [UInt32], 'Public').SetOffset(20) - $TypeBuilder.DefineField('Reserved3', [UInt32], 'Public').SetOffset(24) - $TypeBuilder.DefineField('NumberOfSharedWaiters', [UInt32], 'Public').SetOffset(28) - $TypeBuilder.DefineField('NumberOfExclusiveWaiters', [UInt32], 'Public').SetOffset(32) - } - - $LockInfoClass = $TypeBuilder.CreateType() - } - - try { $PoolTagInfoClass = [_SYSTEM_POOL_TAG_INFORMATION] } catch [Management.Automation.RuntimeException] - { - $TypeBuilder = $ModuleBuilder.DefineType('_SYSTEM_POOL_TAG_INFORMATION', $StructAttributes, [ValueType], 4, $Size_SYSTEM_POOL_TAG_INFORMATION) - $TypeBuilder.SetCustomAttribute($StructLayoutCustomAttribute) - - if ([IntPtr]::Size -eq 8) - { - $TypeBuilder.DefineField('TagValue', [UInt32], 'Public, HasFieldMarshal').SetOffset(0) - $TypeBuilder.DefineField('PagedPoolAllocs', [UInt32], 'Public').SetOffset(4) - $TypeBuilder.DefineField('PagedPoolFrees', [UInt32], 'Public').SetOffset(8) - $TypeBuilder.DefineField('PagedPoolUsage', [UInt32], 'Public').SetOffset(16) - $TypeBuilder.DefineField('NonPagedPoolAllocs', [UInt32], 'Public').SetOffset(24) - $TypeBuilder.DefineField('NonPagedPoolFrees', [UInt32], 'Public').SetOffset(28) - $TypeBuilder.DefineField('NonPagedPoolUsage', [UInt32], 'Public').SetOffset(32) - } - else - { - $TypeBuilder.DefineField('TagValue', [UInt32], 'Public, HasFieldMarshal').SetOffset(0) - $TypeBuilder.DefineField('PagedPoolAllocs', [UInt32], 'Public').SetOffset(4) - $TypeBuilder.DefineField('PagedPoolFrees', [UInt32], 'Public').SetOffset(8) - $TypeBuilder.DefineField('PagedPoolUsage', [UInt32], 'Public').SetOffset(12) - $TypeBuilder.DefineField('NonPagedPoolAllocs', [UInt32], 'Public').SetOffset(16) - $TypeBuilder.DefineField('NonPagedPoolFrees', [UInt32], 'Public').SetOffset(20) - $TypeBuilder.DefineField('NonPagedPoolUsage', [UInt32], 'Public').SetOffset(24) - } - - $PoolTagInfoClass = $TypeBuilder.CreateType() - } - - try { $ObjectTypeClass = [_SYSTEM_OBJECTTYPE_INFORMATION] } catch [Management.Automation.RuntimeException] - { - $TypeBuilder = $ModuleBuilder.DefineType('_SYSTEM_OBJECTTYPE_INFORMATION', $StructAttributes, [ValueType], 1, $Size_SYSTEM_OBJECTTYPE_INFORMATION) - $TypeBuilder.SetCustomAttribute($StructLayoutCustomAttribute) - - $TypeBuilder.DefineField('NextEntryOffset', [UInt32], 'Public').SetOffset(0x00) - $TypeBuilder.DefineField('NumberOfObjects', [UInt32], 'Public').SetOffset(0x04) - $TypeBuilder.DefineField('NumberOfHandles', [UInt32], 'Public').SetOffset(0x08) - $TypeBuilder.DefineField('TypeIndex', [UInt32], 'Public').SetOffset(0x0C) - $TypeBuilder.DefineField('InvalidAttributes', [UInt32], 'Public').SetOffset(0x10) - $TypeBuilder.DefineField('GenericMapping', $GenericMappingClass, 'Public').SetOffset(0x14) - $TypeBuilder.DefineField('ValidAccessMask', [UInt32], 'Public').SetOffset(0x24) - $TypeBuilder.DefineField('PoolType', $PoolType, 'Public').SetOffset(0x28) - $TypeBuilder.DefineField('SecurityRequired', [Byte], 'Public').SetOffset(0x2C) - $TypeBuilder.DefineField('WaitableObject', [Byte], 'Public').SetOffset(0x2D) - $TypeBuilder.DefineField('TypeName', $UnicodeStringClass, 'Public').SetOffset(0x30) - - $ObjectTypeClass = $TypeBuilder.CreateType() - } - - try { $ObjectTypeClass = [_SYSTEM_OBJECT_INFORMATION] } catch [Management.Automation.RuntimeException] - { - $TypeBuilder = $ModuleBuilder.DefineType('_SYSTEM_OBJECT_INFORMATION', $StructAttributes, [ValueType], 1, $Size_SYSTEM_OBJECT_INFORMATION) - $TypeBuilder.SetCustomAttribute($StructLayoutCustomAttribute) - - if ([IntPtr]::Size -eq 8) - { - $TypeBuilder.DefineField('NextEntryOffset', [UInt32], 'Public').SetOffset(0x00) - $TypeBuilder.DefineField('Object', [IntPtr], 'Public').SetOffset(0x08) - $TypeBuilder.DefineField('CreatorUniqueProcess', [IntPtr], 'Public').SetOffset(0x10) - $TypeBuilder.DefineField('CreatorBackTraceIndex', [UInt16], 'Public').SetOffset(0x018) - $TypeBuilder.DefineField('Flags', [UInt16], 'Public').SetOffset(0x1A) - $TypeBuilder.DefineField('PointerCount', [Int32], 'Public').SetOffset(0x1C) - $TypeBuilder.DefineField('HandleCount', [Int32], 'Public').SetOffset(0x20) - $TypeBuilder.DefineField('PagedPoolCharge', [UInt32], 'Public').SetOffset(0x24) - $TypeBuilder.DefineField('NonPagedPoolCharge', [UInt32], 'Public').SetOffset(0x28) - $TypeBuilder.DefineField('ExclusiveProcessId', [IntPtr], 'Public').SetOffset(0x30) - $TypeBuilder.DefineField('SecurityDescriptor', [IntPtr], 'Public').SetOffset(0x38) - $TypeBuilder.DefineField('NameInfo', $UnicodeStringClass, 'Public').SetOffset(0x40) - } - else - { - $TypeBuilder.DefineField('NextEntryOffset', [UInt32], 'Public').SetOffset(0x00) - $TypeBuilder.DefineField('Object', [IntPtr], 'Public').SetOffset(0x04) - $TypeBuilder.DefineField('CreatorUniqueProcess', [IntPtr], 'Public').SetOffset(0x08) - $TypeBuilder.DefineField('CreatorBackTraceIndex', [UInt16], 'Public').SetOffset(0x0C) - $TypeBuilder.DefineField('Flags', [UInt16], 'Public').SetOffset(0x0E) - $TypeBuilder.DefineField('PointerCount', [Int32], 'Public').SetOffset(0x10) - $TypeBuilder.DefineField('HandleCount', [Int32], 'Public').SetOffset(0x14) - $TypeBuilder.DefineField('PagedPoolCharge', [UInt32], 'Public').SetOffset(0x18) - $TypeBuilder.DefineField('NonPagedPoolCharge', [UInt32], 'Public').SetOffset(0x1C) - $TypeBuilder.DefineField('ExclusiveProcessId', [IntPtr], 'Public').SetOffset(0x20) - $TypeBuilder.DefineField('SecurityDescriptor', [IntPtr], 'Public').SetOffset(0x24) - $TypeBuilder.DefineField('NameInfo', $UnicodeStringClass, 'Public').SetOffset(0x28) - } - - $ObjectClass = $TypeBuilder.CreateType() - } -#endregion - - # Local helper function for parsing structures returned by NtQuerySystemInformation that begin with a 'Count' field - function Local:Get-Struct($InformationClass, $StructType, $X86Size, $X64Size, $OffsetMultiplier, $ErrorText) - { - $TotalLength = 0 - $ReturnedLength = 0 - - if ([IntPtr]::Size -eq 8) - { - $StructSize = $X64Size - } - else - { - $StructSize = $X86Size - } - - if ((($ntdll::NtQuerySystemInformation($InformationClass, [IntPtr]::Zero, 0, [Ref] $TotalLength) -as $NtStatus) -ne $NtStatus::STATUS_INFO_LENGTH_MISMATCH) -and ($TotalLength -gt 0)) - { - Write-Error "Unable to obtain $($ErrorText) information." - return - } - - $PtrData = [Runtime.InteropServices.Marshal]::AllocHGlobal($TotalLength) - $ntdll::NtQuerySystemInformation($InformationClass, $PtrData, $TotalLength, [Ref] $ReturnedLength) | Out-Null - [Runtime.InteropServices.Marshal]::FreeHGlobal($PtrData) - - $PtrData2 = [Runtime.InteropServices.Marshal]::AllocHGlobal($ReturnedLength) - - if (($ntdll::NtQuerySystemInformation($InformationClass, $PtrData2, $ReturnedLength, [Ref] 0) -as $NtStatus) -ne $NtStatus::STATUS_SUCCESS) - { - [Runtime.InteropServices.Marshal]::FreeHGlobal($PtrData2) - Write-Error "Unable to obtain $($ErrorText) information." - return - } - - # Retrieve the structure count - $Count = [Runtime.InteropServices.Marshal]::ReadInt32($PtrData2) - - # Point to the first structure - $StructAddress = ([IntPtr]($PtrData2.ToInt64() + ([IntPtr]::Size * $OffsetMultiplier))) - - foreach ($i in 0..($Count-1)) - { - [Runtime.InteropServices.Marshal]::PtrToStructure($StructAddress, [Type] $StructType) - $StructAddress = ([IntPtr]($StructAddress.ToInt64() + $StructSize)) - } - - [Runtime.InteropServices.Marshal]::FreeHGlobal($PtrData2) - } - -#region Main program logic - switch ($PsCmdlet.ParameterSetName) - { - 'ModuleInformation' { - $Arguments = @{ - InformationClass = $SystemInformationClass::SystemModuleInformation - StructType = $ModuleInfoClass - X86Size = 284 - X64Size = 296 - OffsetMultiplier = 2 - ErrorText = 'system module' - } - - Get-Struct @Arguments - } - - 'PoolTagInformation' { - $Arguments = @{ - InformationClass = $SystemInformationClass::SystemPoolTagInformation - StructType = $PoolTagInfoClass - X86Size = 28 - X64Size = 40 - OffsetMultiplier = 1 - ErrorText = 'system pool tag' - } - - Get-Struct @Arguments | % { - $Result = @{ - Tag = [Text.Encoding]::ASCII.GetString([BitConverter]::GetBytes($_.TagValue)) - PagedPoolAllocs = $_.PagedPoolAllocs - PagedPoolFrees = $_.PagedPoolFrees - PagedPoolUsage = $_.PagedPoolUsage - NonPagedPoolAllocs = $_.NonPagedPoolAllocs - NonPagedPoolFrees = $_.NonPagedPoolFrees - NonPagedPoolUsage = $_.NonPagedPoolUsage - } - - $PoolTag = New-Object PSObject -Property $Result - $PoolTag.PSObject.TypeNames.Insert(0, '_SYSTEM_POOL_TAG_INFORMATION') - - Write-Output $PoolTag - } - } - - 'HandleInformation' { - # Get OS version info. This will be used to resolve object type index values - $OSVersion = [Version](Get-WmiObject Win32_OperatingSystem).Version - $OSMajorMinor = "$($OSVersion.Major).$($OSVersion.Minor)" - - # Type indexes differ according to OS. These values were obtained via some KD-fu - switch ($OSMajorMinor) - { - '6.2' # Windows 8 and Windows Server 2012 - { - $IndexTable = @{ - 0x02 = 'Type' - 0x03 = 'Directory' - 0x04 = 'SymbolicLink' - 0x05 = 'Token' - 0x06 = 'Job' - 0x07 = 'Process' - 0x08 = 'Thread' - 0x09 = 'UserApcReserve' - 0x0A = 'IoCompletionReserve' - 0x0B = 'DebugObject' - 0x0C = 'Event' - 0x0D = 'EventPair' - 0x0E = 'Mutant' - 0x0F = 'Callback' - 0x10 = 'Semaphore' - 0x11 = 'Timer' - 0x12 = 'IRTimer' - 0x13 = 'Profile' - 0x14 = 'KeyedEvent' - 0x15 = 'WindowStation' - 0x16 = 'Desktop' - 0x17 = 'CompositionSurface' - 0x18 = 'TpWorkerFactory' - 0x19 = 'Adapter' - 0x1A = 'Controller' - 0x1B = 'Device' - 0x1C = 'Driver' - 0x1D = 'IoCompletion' - 0x1E = 'WaitCompletionPacket' - 0x1F = 'File' - 0x20 = 'TmTm' - 0x21 = 'TmTx' - 0x22 = 'TmRm' - 0x23 = 'TmEn' - 0x24 = 'Section' - 0x25 = 'Session' - 0x26 = 'Key' - 0x27 = 'ALPC Port' - 0x28 = 'PowerRequest' - 0x29 = 'WmiGuid' - 0x2A = 'EtwRegistration' - 0x2B = 'EtwConsumer' - 0x2C = 'FilterConnectionPort' - 0x2D = 'FilterCommunicationPort' - 0x2E = 'PcwObject' - 0x2F = 'DxgkSharedResource' - 0x30 = 'DxgkSharedSyncObject' - } - } - - '6.1' # Windows 7 and Window Server 2008 R2 - { - $IndexTable = @{ - 0x02 = 'Type' - 0x03 = 'Directory' - 0x04 = 'SymbolicLink' - 0x05 = 'Token' - 0x06 = 'Job' - 0x07 = 'Process' - 0x08 = 'Thread' - 0x09 = 'UserApcReserve' - 0x0a = 'IoCompletionReserve' - 0x0b = 'DebugObject' - 0x0c = 'Event' - 0x0d = 'EventPair' - 0x0e = 'Mutant' - 0x0f = 'Callback' - 0x10 = 'Semaphore' - 0x11 = 'Timer' - 0x12 = 'Profile' - 0x13 = 'KeyedEvent' - 0x14 = 'WindowStation' - 0x15 = 'Desktop' - 0x16 = 'TpWorkerFactory' - 0x17 = 'Adapter' - 0x18 = 'Controller' - 0x19 = 'Device' - 0x1a = 'Driver' - 0x1b = 'IoCompletion' - 0x1c = 'File' - 0x1d = 'TmTm' - 0x1e = 'TmTx' - 0x1f = 'TmRm' - 0x20 = 'TmEn' - 0x21 = 'Section' - 0x22 = 'Session' - 0x23 = 'Key' - 0x24 = 'ALPC Port' - 0x25 = 'PowerRequest' - 0x26 = 'WmiGuid' - 0x27 = 'EtwRegistration' - 0x28 = 'EtwConsumer' - 0x29 = 'FilterConnectionPort' - 0x2a = 'FilterCommunicationPort' - 0x2b = 'PcwObject' - } - } - - '6.0' # Windows Vista and Windows Server 2008 - { - $IndexTable = @{ - 0x01 = 'Type' - 0x02 = 'Directory' - 0x03 = 'SymbolicLink' - 0x04 = 'Token' - 0x05 = 'Job' - 0x06 = 'Process' - 0x07 = 'Thread' - 0x08 = 'DebugObject' - 0x09 = 'Event' - 0x0a = 'EventPair' - 0x0b = 'Mutant' - 0x0c = 'Callback' - 0x0d = 'Semaphore' - 0x0e = 'Timer' - 0x0f = 'Profile' - 0x10 = 'KeyedEvent' - 0x11 = 'WindowStation' - 0x12 = 'Desktop' - 0x13 = 'TpWorkerFactory' - 0x14 = 'Adapter' - 0x15 = 'Controller' - 0x16 = 'Device' - 0x17 = 'Driver' - 0x18 = 'IoCompletion' - 0x19 = 'File' - 0x1a = 'TmTm' - 0x1b = 'TmTx' - 0x1c = 'TmRm' - 0x1d = 'TmEn' - 0x1e = 'Section' - 0x1f = 'Session' - 0x20 = 'Key' - 0x21 = 'ALPC Port' - 0x22 = 'WmiGuid' - 0x23 = 'EtwRegistration' - 0x24 = 'FilterConnectionPort' - 0x25 = 'FilterCommunicationPort' - } - } - - '5.1' # Windows XP - { - $IndexTable = @{ - 0x01 = 'Type' - 0x02 = 'Directory' - 0x03 = 'SymbolicLink' - 0x04 = 'Token' - 0x05 = 'Process' - 0x06 = 'Thread' - 0x07 = 'Job' - 0x08 = 'DebugObject' - 0x09 = 'Event' - 0x0a = 'EventPair' - 0x0b = 'Mutant' - 0x0c = 'Callback' - 0x0d = 'Semaphore' - 0x0e = 'Timer' - 0x0f = 'Profile' - 0x10 = 'KeyedEvent' - 0x11 = 'WindowStation' - 0x12 = 'Desktop' - 0x13 = 'Section' - 0x14 = 'Key' - 0x15 = 'Port' - 0x16 = 'WaitablePort' - 0x17 = 'Adapter' - 0x18 = 'Controller' - 0x19 = 'Device' - 0x1a = 'Driver' - 0x1b = 'IoCompletion' - 0x1c = 'File' - 0x1d = 'WmiGuid' - 0x1e = 'FilterConnectionPort' - 0x1f = 'FilterCommunicationPort' - } - } - - default # I didn't feel like resolving the values for Server 2003 - { - $IndexTable = @{} - } - } - - $Arguments = @{ - InformationClass = $SystemInformationClass::SystemHandleInformation - StructType = $HandleInfoClass - X86Size = 16 - X64Size = 24 - OffsetMultiplier = 1 - ErrorText = 'system handle' - } - - Get-Struct @Arguments | % { - $Handle = $_.HandleAttribute -as $HandleFlags - if ($Handle -eq 0) {$HandleValue = $null} else {$HandleValue = $Handle} - - $Access = ( ($_.GrantedAccess -band 0xFFFF0000) -as $AccessMask ) - if ($Access -eq 0) {$AccessValue = $null} else {$AccessValue = $Access} - - $Result = @{ - UniqueProcessId = $_.UniqueProcessId - CreatorBackTraceIndex = $_.CreatorBackTraceIndex - ObjectTypeIndex = $_.ObjectTypeIndex - ObjectType = $IndexTable[([Int32]$_.ObjectTypeIndex)] - HandleAttribute = $HandleValue - HandleValue = $_.HandleValue - Object = $_.Object - GrantedAccess = $AccessValue - } - - $Handle = New-Object PSObject -Property $Result - $Handle.PSObject.TypeNames.Insert(0, '_SYSTEM_HANDLE_INFORMATION') - - if ($PSBoundParameters['ObjectType']) - { - if ($Result['ObjectType'] -eq $ObjectType) - { - Write-Output $Handle - } - } - else - { - Write-Output $Handle - } - } - } - - 'ObjectInformation' { - # Get system global flags first to ensure the correct flags are set - $Flags = Get-NtSystemInformation -GlobalFlags - - $RequiredFlags = [GLOBAL_FLAGS] 'FLG_MAINTAIN_OBJECT_TYPELIST, FLG_ENABLE_HANDLE_TYPE_TAGGING' - - if (($Flags -band $RequiredFlags) -ne $RequiredFlags) - { - Write-Error 'Global flags FLG_MAINTAIN_OBJECT_TYPELIST and FLG_ENABLE_HANDLE_TYPE_TAGGING have not been set. They must be set in gflags.exe (i.e. `gflags.exe -r +otl +eot`) or in the registry.' - return - } - - Write-Warning 'It can take over a minute to return object information. Please be patient.' - - $TotalLength = 1 - $ReturnedLength = 0 - $PtrData = [Runtime.InteropServices.Marshal]::AllocHGlobal($TotalLength) - - while ((($ntdll::NtQuerySystemInformation($SystemInformationClass::SystemObjectInformation, $PtrData, $TotalLength, [Ref] $ReturnedLength) -as [NTSTATUS]) -eq [NTSTATUS]::STATUS_INFO_LENGTH_MISMATCH)) - { - if ($TotalLength -ne $ReturnedLength) - { - [Runtime.InteropServices.Marshal]::FreeHGlobal($PtrData) - $TotalLength = $ReturnedLength - $PtrData = [Runtime.InteropServices.Marshal]::AllocHGlobal($TotalLength) - } - } - - $NextTypeOffset = 0 - - do - { - # Base address of the _SYSTEM_OBJECTTYPE_INFORMATION struct - $ObjectTypeAbsoluteAddress = [IntPtr]($PtrData.ToInt64() + $NextTypeOffset) - - $Result = [Runtime.InteropServices.Marshal]::PtrToStructure($ObjectTypeAbsoluteAddress, [Type] $ObjectTypeClass) - - if ($Result.NumberOfObjects -gt 0) - { - # Calculate the offset to the first _SYSTEM_OBJECT_INFORMATION structure - $NextObjectOffset = $Size_SYSTEM_OBJECTTYPE_INFORMATION + $Result.TypeName.MaximumLength - $ObjectBaseAddr = $ObjectTypeAbsoluteAddress - - $ObjectArray = @() - - do - { - $ObjectResult = [Runtime.InteropServices.Marshal]::PtrToStructure(( [IntPtr]($ObjectBaseAddr.ToInt64() + $NextObjectOffset) ), [Type] $ObjectClass) - - $ResultHashTable2 = @{ - Object = $ObjectResult.Object - CreatorUniqueProcess = $ObjectResult.CreatorUniqueProcess - CreatorBackTraceIndex = $ObjectResult.CreatorBackTraceIndex - Flags = ($ObjectResult.Flags -as $ObjectFlags) - PointerCount = $ObjectResult.PointerCount - HandleCount = $ObjectResult.HandleCount - PagedPoolCharge = $ObjectResult.PagedPoolCharge - NonPagedPoolCharge = $ObjectResult.NonPagedPoolCharge - ExclusiveProcessId = $ObjectResult.ExclusiveProcessId - SecurityDescriptor = $ObjectResult.SecurityDescriptor - NameInfo = $ObjectResult.NameInfo.Buffer - } - - $Object = New-Object PSObject -Property $ResultHashTable2 - $Object.PSObject.TypeNames.Insert(0, '_SYSTEM_OBJECT_INFORMATION') - - $ObjectArray += $Object - - $NextObjectOffset = $ObjectResult.NextEntryOffset - $ObjectBaseAddr = $PtrData - } while ($ObjectResult.NextEntryOffset -ne 0) - } - - $Access = ( ($_.ValidAccessMask -band 0xFFFF0000) -as $AccessMask ) - if ($Access -eq 0) {$AccessValue = $null} else {$AccessValue = $Access} - - $ResultHashTable = @{ - NumberOfObjects = $Result.NumberOfObjects - NumberOfHandles = $Result.NumberOfHandles - TypeIndex = $Result.TypeIndex - InvalidAttributes = ($Result.InvalidAttributes -as $ObjectAttributes) - GenericMapping = $Result.GenericMapping - ValidAccessMask = $AccessValue - PoolType = $Result.PoolType - SecurityRequired = $Result.SecurityRequired - WaitableObject = $Result.WaitableObject - TypeName = $Result.TypeName.Buffer - Objects = $ObjectArray - } - - $ObjectType = New-Object PSObject -Property $ResultHashTable - $ObjectType.PSObject.TypeNames.Insert(0, '_SYSTEM_OBJECTTYPE_INFORMATION') - - Write-Output $ObjectType - - $NextTypeOffset = $Result.NextEntryOffset - } while ($NextTypeOffset -ne 0) - - [Runtime.InteropServices.Marshal]::FreeHGlobal($PtrData) - } - - 'LockInformation' { - $Arguments = @{ - InformationClass = $SystemInformationClass::SystemLockInformation - StructType = $LockInfoClass - X86Size = 36 - X64Size = 48 - OffsetMultiplier = 1 - ErrorText = 'system lock' - } - - Get-Struct @Arguments - } - - 'CodeIntegrityInformation' { - $CIStructLength = 8 - $PtrData = [Runtime.InteropServices.Marshal]::AllocHGlobal($CIStructLength) - [Runtime.InteropServices.Marshal]::WriteInt64($PtrData, 0) - [Runtime.InteropServices.Marshal]::WriteByte($PtrData, 8) # The length field in SYSTEM_CODEINTEGRITY_INFORMATION must be set to 8 - $ntdll::NtQuerySystemInformation($SystemInformationClass::SystemCodeIntegrityInformation, $PtrData, $CIStructLength, [Ref] 0) | Out-Null - $CIInfo = [Runtime.InteropServices.Marshal]::ReadInt32(([IntPtr]($PtrData.ToInt64() + 4))) - [Runtime.InteropServices.Marshal]::FreeHGlobal($PtrData) - - $ResultHashTable = @{ - CodeIntegrityOptions = $CIInfo - LockdownState = ($CIInfo -band 0x1C) -as $LockdownState - } - - $CodeIntegrityType = New-Object PSObject -Property $ResultHashTable - $CodeIntegrityType.PSObject.TypeNames.Insert(0, '_SYSTEM_CODEINTEGRITY_INFORMATION') - - Write-Output $CodeIntegrityType - } - - 'GlobalFlags' { - $TotalLength = 0 - $ReturnedLength = 0 - - if ((($ntdll::NtQuerySystemInformation($SystemInformationClass::SystemGlobalFlag, [IntPtr]::Zero, 0, [Ref] $TotalLength) -as [NTSTATUS]) -ne [NTSTATUS]::STATUS_INFO_LENGTH_MISMATCH) -and ($TotalLength -gt 0)) - { - Write-Error 'Unable to obtain global flags information information.' - } - else - { - $PtrData = [Runtime.InteropServices.Marshal]::AllocHGlobal($TotalLength) - $ntdll::NtQuerySystemInformation($SystemInformationClass::SystemGlobalFlag, $PtrData, $TotalLength, [Ref] $ReturnedLength) | Out-Null - $Gflags = [Runtime.InteropServices.Marshal]::ReadInt32($PtrData) -as $GFlagsEnum - [Runtime.InteropServices.Marshal]::FreeHGlobal($PtrData) - - Write-Output $Gflags - } - } - - default { return } - } -} -#endregion |