#!/usr/local/bin/python #CHIPSEC: Platform Security Assessment Framework #Copyright (c) 2010-2014, Intel Corporation # #This program is free software; you can redistribute it and/or #modify it under the terms of the GNU General Public License #as published by the Free Software Foundation; Version 2. # #This program is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. # #You should have received a copy of the GNU General Public License #along with this program; if not, write to the Free Software #Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # #Contact information: #chipsec@intel.com # # ------------------------------------------------------------------------------- # # CHIPSEC: Platform Hardware Security Assessment Framework # (c) 2010-2012 Intel Corporation # # ------------------------------------------------------------------------------- ## \addtogroup helpers # __chipsec/helper/win/win32helper.py__ -- Management and communication with Windows kernel mode driver # which provides access to hardware resources # NOTE: on Windows you need to install pywin32 Python extension corresponding to your Python version: # http://sourceforge.net/projects/pywin32/ # # __version__ = '1.0' import os.path import struct import sys from ctypes import * from threading import Lock import platform import re from collections import namedtuple from chipsec.helper.oshelper import OsHelperError import errno import pywintypes import win32service #win32serviceutil, win32api, win32con import winerror from win32file import FILE_SHARE_READ, FILE_SHARE_WRITE, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, FILE_FLAG_OVERLAPPED, INVALID_HANDLE_VALUE import win32api, win32process, win32security, win32file from chipsec.logger import logger, print_buffer import chipsec.file class PCI_BDF(Structure): _fields_ = [("BUS", c_ushort, 16), # Bus ("DEV", c_ushort, 16), # Device ("FUNC", c_ushort, 16), # Function ("OFF", c_ushort, 16)] # Offset kernel32 = windll.kernel32 drv_hndl_error_msg = "Cannot open chipsec driver handle. Make sure chipsec driver is installed and started if you are using option -e (see README)" DRIVER_FILE_NAME = "chipsec_hlpr.sys" DEVICE_FILE = "\\\\.\\chipsec_hlpr" SERVICE_NAME = "chipsec" DISPLAY_NAME = "CHIPSEC Service" CHIPSEC_INSTALL_PATH = os.path.join(sys.prefix, "Lib\site-packages\chipsec") # Defines for Win32 API Calls GENERIC_READ = 0x80000000 GENERIC_WRITE = 0x40000000 OPEN_EXISTING = 0x3 FILE_DEVICE_UNKNOWN = 0x00000022 METHOD_BUFFERED = 0 METHOD_IN_DIRECT = 1 METHOD_OUT_DIRECT = 2 METHOD_NEITHER = 3 FILE_ANY_ACCESS = 0 FILE_SPECIAL_ACCESS = (FILE_ANY_ACCESS) FILE_READ_ACCESS = ( 0x0001 ) FILE_WRITE_ACCESS = ( 0x0002 ) def CTL_CODE( DeviceType, Function, Method, Access ): return ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) # # chipsec driver IOCTL codes # CHIPSEC_CTL_ACCESS = (FILE_READ_ACCESS | FILE_WRITE_ACCESS) CLOSE_DRIVER = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) READ_PCI_CFG_REGISTER = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x807, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) WRITE_PCI_CFG_REGISTER = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x808, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) IOCTL_READ_PHYSMEM = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x809, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) IOCTL_WRITE_PHYSMEM = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80a, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) IOCTL_ALLOC_PHYSMEM = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) IOCTL_LOAD_UCODE_PATCH = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80b, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) IOCTL_WRMSR = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80c, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) IOCTL_RDMSR = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80d, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) IOCTL_READ_IO_PORT = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80e, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) IOCTL_WRITE_IO_PORT = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80f, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) IOCTL_GET_CPU_DESCRIPTOR_TABLE = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) IOCTL_SWSMI = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, CHIPSEC_CTL_ACCESS) # # NT Errors # # Defined in WinDDK\7600.16385.1\inc\api\ntstatus.h # # # UEFI constants # # Default buffer size for EFI variables #EFI_VAR_MAX_BUFFER_SIZE = 128*1024 EFI_VAR_MAX_BUFFER_SIZE = 1024*1024 attributes = { "EFI_VARIABLE_NON_VOLATILE" : 0x00000001, "EFI_VARIABLE_BOOTSERVICE_ACCESS" : 0x00000002, "EFI_VARIABLE_RUNTIME_ACCESS" : 0x00000004, "EFI_VARIABLE_HARDWARE_ERROR_RECORD" : 0x00000008, "EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS" : 0x00000010, "EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS" : 0x00000020, "EFI_VARIABLE_APPEND_WRITE" : 0x00000040 } PyLong_AsByteArray = pythonapi._PyLong_AsByteArray PyLong_AsByteArray.argtypes = [py_object, c_char_p, c_size_t, c_int, c_int] def packl_ctypes( lnum, bitlength ): length = (bitlength + 7)/8 a = create_string_buffer( length ) PyLong_AsByteArray(lnum, a, len(a), 1, 1) # 4th param is for endianness 0 - big, non 0 - little return a.raw # # Windows 8 NtEnumerateSystemEnvironmentValuesEx (infcls = 2) # def guid_str(guid0, guid1, guid2, guid3): return ( "%08X-%04X-%04X-%04s-%06s" % (guid0, guid1, guid2, guid3[:2].encode('hex').upper(), guid3[-6::].encode('hex').upper()) ) class EFI_HDR_WIN( namedtuple('EFI_HDR_WIN', 'Size DataOffset DataSize Attributes guid0 guid1 guid2 guid3') ): __slots__ = () def __str__(self): return """ Header (Windows) ---------------- VendorGuid= {%08X-%04X-%04X-%04s-%06s} Size = 0x%08X DataOffset= 0x%08X DataSize = 0x%08X Attributes= 0x%08X """ % ( self.guid0, self.guid1, self.guid2, self.guid3[:2].encode('hex').upper(), self.guid3[-6::].encode('hex').upper(), self.Size, self.DataOffset, self.DataSize, self.Attributes ) def getEFIvariables_NtEnumerateSystemEnvironmentValuesEx2( nvram_buf ): start = 0 buffer = nvram_buf bsize = len(buffer) header_fmt = "