Changeset 52795 in vbox for trunk/src/VBox/HostDrivers/Support
- Timestamp:
- Sep 19, 2014 3:02:04 PM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 96187
- Location:
- trunk/src/VBox/HostDrivers/Support
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/SUPLibInternal.h
r52632 r52795 437 437 DECLHIDDEN(void) supR3HardenedWinInitVersion(void); 438 438 DECLHIDDEN(void) supR3HardenedWinInitImports(void); 439 DECLHIDDEN(PFNRT) supR3HardenedWinGetRealDllSymbol(const char *pszDll, const char *pszProcedure); 439 440 DECLHIDDEN(void) supR3HardenedWinVerifyProcess(void); 440 441 DECLHIDDEN(void) supR3HardenedWinEnableThreadCreation(void); -
trunk/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyImage-win.cpp
r52690 r52795 2161 2161 switch (hrc) 2162 2162 { 2163 case TRUST_E_SYSTEM_ERROR: pszErrConst = "TRUST_E_SYSTEM_ERROR"; break; 2164 case TRUST_E_NO_SIGNER_CERT: pszErrConst = "TRUST_E_NO_SIGNER_CERT"; break; 2165 case TRUST_E_COUNTER_SIGNER: pszErrConst = "TRUST_E_COUNTER_SIGNER"; break; 2166 case TRUST_E_CERT_SIGNATURE: pszErrConst = "TRUST_E_CERT_SIGNATURE"; break; 2167 case TRUST_E_TIME_STAMP: pszErrConst = "TRUST_E_TIME_STAMP"; break; 2168 case TRUST_E_BAD_DIGEST: pszErrConst = "TRUST_E_BAD_DIGEST"; break; 2169 case TRUST_E_BASIC_CONSTRAINTS: pszErrConst = "TRUST_E_BASIC_CONSTRAINTS"; break; 2170 case TRUST_E_FINANCIAL_CRITERIA: pszErrConst = "TRUST_E_FINANCIAL_CRITERIA"; break; 2171 case TRUST_E_PROVIDER_UNKNOWN: pszErrConst = "TRUST_E_PROVIDER_UNKNOWN"; break; 2172 case TRUST_E_ACTION_UNKNOWN: pszErrConst = "TRUST_E_ACTION_UNKNOWN"; break; 2173 case TRUST_E_SUBJECT_FORM_UNKNOWN: pszErrConst = "TRUST_E_SUBJECT_FORM_UNKNOWN"; break; 2174 case TRUST_E_SUBJECT_NOT_TRUSTED: pszErrConst = "TRUST_E_SUBJECT_NOT_TRUSTED"; break; 2175 case TRUST_E_NOSIGNATURE: pszErrConst = "TRUST_E_NOSIGNATURE"; break; 2176 case TRUST_E_FAIL: pszErrConst = "TRUST_E_FAIL"; break; 2177 case TRUST_E_EXPLICIT_DISTRUST: pszErrConst = "TRUST_E_EXPLICIT_DISTRUST"; break; 2178 case CERT_E_CHAINING: pszErrConst = "CERT_E_CHAINING"; break; 2179 case CERT_E_REVOCATION_FAILURE: pszErrConst = "CERT_E_REVOCATION_FAILURE"; break; 2163 case TRUST_E_SYSTEM_ERROR: pszErrConst = "TRUST_E_SYSTEM_ERROR"; break; 2164 case TRUST_E_NO_SIGNER_CERT: pszErrConst = "TRUST_E_NO_SIGNER_CERT"; break; 2165 case TRUST_E_COUNTER_SIGNER: pszErrConst = "TRUST_E_COUNTER_SIGNER"; break; 2166 case TRUST_E_CERT_SIGNATURE: pszErrConst = "TRUST_E_CERT_SIGNATURE"; break; 2167 case TRUST_E_TIME_STAMP: pszErrConst = "TRUST_E_TIME_STAMP"; break; 2168 case TRUST_E_BAD_DIGEST: pszErrConst = "TRUST_E_BAD_DIGEST"; break; 2169 case TRUST_E_BASIC_CONSTRAINTS: pszErrConst = "TRUST_E_BASIC_CONSTRAINTS"; break; 2170 case TRUST_E_FINANCIAL_CRITERIA: pszErrConst = "TRUST_E_FINANCIAL_CRITERIA"; break; 2171 case TRUST_E_PROVIDER_UNKNOWN: pszErrConst = "TRUST_E_PROVIDER_UNKNOWN"; break; 2172 case TRUST_E_ACTION_UNKNOWN: pszErrConst = "TRUST_E_ACTION_UNKNOWN"; break; 2173 case TRUST_E_SUBJECT_FORM_UNKNOWN: pszErrConst = "TRUST_E_SUBJECT_FORM_UNKNOWN"; break; 2174 case TRUST_E_SUBJECT_NOT_TRUSTED: pszErrConst = "TRUST_E_SUBJECT_NOT_TRUSTED"; break; 2175 case TRUST_E_NOSIGNATURE: pszErrConst = "TRUST_E_NOSIGNATURE"; break; 2176 case TRUST_E_FAIL: pszErrConst = "TRUST_E_FAIL"; break; 2177 case TRUST_E_EXPLICIT_DISTRUST: pszErrConst = "TRUST_E_EXPLICIT_DISTRUST"; break; 2178 case CERT_E_CHAINING: pszErrConst = "CERT_E_CHAINING"; break; 2179 case CERT_E_REVOCATION_FAILURE: pszErrConst = "CERT_E_REVOCATION_FAILURE"; break; 2180 case CRYPT_E_FILE_ERROR: pszErrConst = "CRYPT_E_FILE_ERROR"; break; 2181 case CRYPT_E_REVOKED: pszErrConst = "CRYPT_E_REVOKED"; break; 2180 2182 } 2181 2183 if (pszErrConst) -
trunk/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp
r52634 r52795 1787 1787 */ 1788 1788 uint32_t i = 0; 1789 while ( i < RT_ELEMENTS(g_apszSupNtVpAllowedDlls))1790 if (!strcmp(pszName, g_apszSupNtVpAllowedDlls[i]))1791 break;1789 while ( i < RT_ELEMENTS(g_apszSupNtVpAllowedDlls) 1790 && strcmp(pszName, g_apszSupNtVpAllowedDlls[i])) 1791 i++; 1792 1792 if (i >= RT_ELEMENTS(g_apszSupNtVpAllowedDlls)) 1793 1793 return VERR_FILE_NOT_FOUND; -
trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp
r52744 r52795 253 253 /** Microsoft Security Essentials. */ 254 254 #define SUPHARDNT_ADVERSARY_MSE RT_BIT_32(9) 255 /** Comodo. */ 256 #define SUPHARDNT_ADVERSARY_COMODO RT_BIT_32(10) 255 257 /** Unknown adversary detected while waiting on child. */ 256 258 #define SUPHARDNT_ADVERSARY_UNKNOWN RT_BIT_32(31) … … 2207 2209 * Locate the routines first so we can allocate memory that's near enough. 2208 2210 */ 2209 HMODULE hmodNtDll = GetModuleHandleW(L"NTDLL"); 2210 SUPR3HARDENED_ASSERT(hmodNtDll != NULL); 2211 2212 FARPROC pfnNtCreateSection = GetProcAddress(hmodNtDll, "NtCreateSection"); 2211 PFNRT pfnNtCreateSection = supR3HardenedWinGetRealDllSymbol("ntdll.dll", "NtCreateSection"); 2213 2212 SUPR3HARDENED_ASSERT(pfnNtCreateSection != NULL); 2214 2213 //SUPR3HARDENED_ASSERT(pfnNtCreateSection == (FARPROC)NtCreateSection); 2215 2214 2216 FARPROC pfnLdrLoadDll = GetProcAddress(hmodNtDll, "LdrLoadDll");2215 PFNRT pfnLdrLoadDll = supR3HardenedWinGetRealDllSymbol("ntdll.dll", "LdrLoadDll"); 2217 2216 SUPR3HARDENED_ASSERT(pfnLdrLoadDll != NULL); 2218 2217 //SUPR3HARDENED_ASSERT(pfnLdrLoadDll == (FARPROC)LdrLoadDll); … … 3190 3189 /* Cannot use the imported NtTerminateThread as it's pointing to our own 3191 3190 syscall assembly code. */ 3192 FARPROC pfnNtTerminateThread = GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "NtTerminateThread"); 3193 SUPR3HARDENED_ASSERT(pfnNtTerminateThread); 3191 static PFNRT s_pfnNtTerminateThread = NULL; 3192 if (s_pfnNtTerminateThread == NULL) 3193 s_pfnNtTerminateThread = supR3HardenedWinGetRealDllSymbol("ntdll.dll", "NtTerminateThread"); 3194 SUPR3HARDENED_ASSERT(s_pfnNtTerminateThread); 3194 3195 3195 3196 int rc = supR3HardNtDisableThreadCreationEx(NtCurrentProcess(), 3196 3197 (void *)(uintptr_t)&LdrInitializeThunk, 3197 (void *)(uintptr_t) pfnNtTerminateThread,3198 (void *)(uintptr_t)s_pfnNtTerminateThread, 3198 3199 g_abLdrInitThunkSelfBackup, sizeof(g_abLdrInitThunkSelfBackup), 3199 3200 NULL /* pErrInfo*/); … … 4849 4850 4850 4851 { SUPHARDNT_ADVERSARY_MSE, "NisDrv" }, 4852 4853 /*{ SUPHARDNT_ADVERSARY_COMODO, "cmdguard" }, file system */ 4854 { SUPHARDNT_ADVERSARY_COMODO, "inspect" }, 4855 { SUPHARDNT_ADVERSARY_COMODO, "cmdHlp" }, 4856 4851 4857 }; 4852 4858 … … 4944 4950 { SUPHARDNT_ADVERSARY_MSE, L"\\SystemRoot\\System32\\drivers\\MpFilter.sys" }, 4945 4951 { SUPHARDNT_ADVERSARY_MSE, L"\\SystemRoot\\System32\\drivers\\NisDrvWFP.sys" }, 4952 4953 { SUPHARDNT_ADVERSARY_COMODO, L"\\SystemRoot\\System32\\drivers\\cmdguard.sys" }, 4954 { SUPHARDNT_ADVERSARY_COMODO, L"\\SystemRoot\\System32\\drivers\\cmderd.sys" }, 4955 { SUPHARDNT_ADVERSARY_COMODO, L"\\SystemRoot\\System32\\drivers\\inspect.sys" }, 4956 { SUPHARDNT_ADVERSARY_COMODO, L"\\SystemRoot\\System32\\drivers\\cmdhlp.sys" }, 4957 { SUPHARDNT_ADVERSARY_COMODO, L"\\SystemRoot\\System32\\drivers\\cfrmd.sys" }, 4958 { SUPHARDNT_ADVERSARY_COMODO, L"\\SystemRoot\\System32\\drivers\\hmd.sys" }, 4959 { SUPHARDNT_ADVERSARY_COMODO, L"\\SystemRoot\\System32\\guard64.dll" }, 4960 { SUPHARDNT_ADVERSARY_COMODO, L"\\SystemRoot\\System32\\cmdvrt64.dll" }, 4961 { SUPHARDNT_ADVERSARY_COMODO, L"\\SystemRoot\\System32\\cmdkbd64.dll" }, 4962 { SUPHARDNT_ADVERSARY_COMODO, L"\\SystemRoot\\System32\\cmdcsr.dll" }, 4946 4963 }; 4947 4964 -
trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMainImports-win.cpp
r52416 r52795 139 139 uint16_t const *pau16NameOrdinals; 140 140 141 /** Number of patched export table entries. */ 142 uint32_t cPatchedExports; 143 141 144 } SUPHNTIMPDLL; 142 145 /** Pointer to an import DLL entry. */ … … 365 368 { 366 369 uint32_t offExport = pDll->paoffExports[iExpOrdinal]; 367 if (offExport < pDll->cbImage) 370 371 /* detect export table patching. */ 372 if (offExport >= pDll->cbImage) 373 pDll->cPatchedExports++; 374 375 if (offExport - pDll->offExportDir >= pDll->cbExportDir) 368 376 { 369 if (offExport - pDll->offExportDir >= pDll->cbExportDir) 370 { 371 *pImport->ppfnImport = (PFNRT)&pDll->pbImageBase[offExport]; 372 return NULL; 373 } 374 375 /* Forwarder. */ 376 return (const char *)&pDll->pbImageBase[offExport]; 377 *pImport->ppfnImport = (PFNRT)&pDll->pbImageBase[offExport]; 378 return NULL; 377 379 } 378 SUPHNTIMP_ERROR(13, "supR3HardenedResolveImport", kSupInitOp_Misc, VERR_BAD_EXE_FORMAT, 379 "%ls: The export RVA for '%s' is out of bounds: %#x (SizeOfImage %#x)",380 pDll->pwszName, offExport, pDll->cbImage);380 381 /* Forwarder. */ 382 return (const char *)&pDll->pbImageBase[offExport]; 381 383 } 382 384 SUPHNTIMP_ERROR(14, "supR3HardenedResolveImport", kSupInitOp_Misc, VERR_BAD_EXE_FORMAT, … … 601 603 } 602 604 605 /* 606 * Use the on disk image to avoid export table patching. Currently 607 * ignoring errors here as can live normally without this step. 608 */ 609 for (uint32_t iDll = 0; iDll < RT_ELEMENTS(g_aSupNtImpDlls); iDll++) 610 if (g_aSupNtImpDlls[iDll].cPatchedExports > 0) 611 { 612 PSUPHNTLDRCACHEENTRY pLdrEntry; 613 int rc = supHardNtLdrCacheOpen(g_aSupNtImpDlls[iDll].pszName, &pLdrEntry); 614 if (RT_SUCCESS(rc)) 615 { 616 uint8_t *pbBits; 617 rc = supHardNtLdrCacheEntryAllocBits(pLdrEntry, &pbBits, NULL); 618 if (RT_SUCCESS(rc)) 619 for (uint32_t i = 0; i < g_aSupNtImpDlls[iDll].cImports; i++) 620 { 621 RTLDRADDR uValue; 622 rc = RTLdrGetSymbolEx(pLdrEntry->hLdrMod, pbBits, (uintptr_t)g_aSupNtImpDlls[iDll].pbImageBase, 623 UINT32_MAX, g_aSupNtImpDlls[iDll].paImports[i].pszName, &uValue); 624 if (RT_SUCCESS(rc)) 625 *g_aSupNtImpDlls[iDll].paImports[i].ppfnImport = (PFNRT)(uintptr_t)uValue; 626 } 627 } 628 } 629 630 603 631 #if 0 /* Win7/32 ntdll!LdrpDebugFlags. */ 604 632 *(uint8_t *)&g_aSupNtImpDlls[0].pbImageBase[0xdd770] = 0x3; … … 606 634 } 607 635 636 637 /** 638 * Gets the address of a procedure in a DLL, ignoring our own syscall 639 * implementations. 640 * 641 * Currently restricted to NTDLL and KERNEL32 642 * 643 * @returns The procedure address. 644 * @param pszDll The DLL name. 645 * @param pszProcedure The procedure name. 646 */ 647 DECLHIDDEN(PFNRT) supR3HardenedWinGetRealDllSymbol(const char *pszDll, const char *pszProcedure) 648 { 649 /* 650 * Look the DLL up in the import DLL table. 651 */ 652 for (uint32_t iDll = 0; iDll < RT_ELEMENTS(g_aSupNtImpDlls); iDll++) 653 if (RTStrICmp(g_aSupNtImpDlls[iDll].pszName, pszDll) == 0) 654 { 655 PSUPHNTLDRCACHEENTRY pLdrEntry; 656 int rc = supHardNtLdrCacheOpen(g_aSupNtImpDlls[iDll].pszName, &pLdrEntry); 657 if (RT_SUCCESS(rc)) 658 { 659 uint8_t *pbBits; 660 rc = supHardNtLdrCacheEntryAllocBits(pLdrEntry, &pbBits, NULL); 661 if (RT_SUCCESS(rc)) 662 { 663 RTLDRADDR uValue; 664 rc = RTLdrGetSymbolEx(pLdrEntry->hLdrMod, pbBits, (uintptr_t)g_aSupNtImpDlls[iDll].pbImageBase, 665 UINT32_MAX, pszProcedure, &uValue); 666 if (RT_SUCCESS(rc)) 667 return (PFNRT)(uintptr_t)uValue; 668 SUP_DPRINTF(("supR3HardenedWinGetRealDllSymbol: Error getting %s in %s -> %Rrc\n", pszProcedure, pszDll, rc)); 669 } 670 else 671 SUP_DPRINTF(("supR3HardenedWinGetRealDllSymbol: supHardNtLdrCacheEntryAllocBits failed on %s: %Rrc\n", 672 pszDll, rc)); 673 } 674 else 675 SUP_DPRINTF(("supR3HardenedWinGetRealDllSymbol: supHardNtLdrCacheOpen failed on %s: %Rrc\n", 676 pszDll, rc)); 677 678 /* Complications, just call GetProcAddress. */ 679 return (PFNRT)GetProcAddress(GetModuleHandleW(g_aSupNtImpDlls[iDll].pwszName), pszProcedure); 680 } 681 682 supR3HardenedFatal("supR3HardenedWinGetRealDllSymbol: Unknown DLL %s (proc: %s)\n", pszDll, pszProcedure); 683 return NULL; 684 } 685
Note:
See TracChangeset
for help on using the changeset viewer.