VirtualBox

Changeset 52438 in vbox


Ignore:
Timestamp:
Aug 21, 2014 11:25:51 AM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
95645
Message:

SUP: Some more confusing trickery.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/nt/nt.h

    r52364 r52438  
    11101110NTSYSAPI NTSTATUS NTAPI NtCreateSection(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PLARGE_INTEGER, ULONG, ULONG, HANDLE);
    11111111NTSYSAPI NTSTATUS NTAPI NtUnmapViewOfSection(HANDLE, PVOID);
     1112typedef enum _SECTION_INHERIT
     1113{
     1114    ViewShare = 1,
     1115    ViewUnmap
     1116} SECTION_INHERIT;
     1117NTSYSAPI NTSTATUS NTAPI NtMapViewOfSection(HANDLE, HANDLE, PVOID *, ULONG, SIZE_T, PLARGE_INTEGER, PSIZE_T, SECTION_INHERIT,
     1118                                           ULONG, ULONG);
     1119
    11121120
    11131121typedef struct _FILE_FS_ATTRIBUTE_INFORMATION
  • trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp

    r52433 r52438  
    27552755
    27562756
     2757static PVOID supR3HardNtPuChMapDllIntoChild(PSUPR3HARDNTPUCH pThis, PUNICODE_STRING pNtName, const char *pszShort)
     2758{
     2759    HANDLE              hFile  = RTNT_INVALID_HANDLE_VALUE;
     2760    IO_STATUS_BLOCK     Ios    = RTNT_IO_STATUS_BLOCK_INITIALIZER;
     2761    OBJECT_ATTRIBUTES   ObjAttr;
     2762    InitializeObjectAttributes(&ObjAttr, pNtName, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
     2763    NTSTATUS rcNt = NtCreateFile(&hFile,
     2764                                 GENERIC_READ | GENERIC_EXECUTE,
     2765                                 &ObjAttr,
     2766                                 &Ios,
     2767                                 NULL /* Allocation Size*/,
     2768                                 FILE_ATTRIBUTE_NORMAL,
     2769                                 FILE_SHARE_READ,
     2770                                 FILE_OPEN,
     2771                                 FILE_NON_DIRECTORY_FILE,
     2772                                 NULL /*EaBuffer*/,
     2773                                 0 /*EaLength*/);
     2774    if (NT_SUCCESS(rcNt))
     2775        rcNt = Ios.Status;
     2776    PVOID pvRet = NULL;
     2777    if (NT_SUCCESS(rcNt))
     2778    {
     2779        HANDLE hSection = RTNT_INVALID_HANDLE_VALUE;
     2780        rcNt = NtCreateSection(&hSection,
     2781                               SECTION_MAP_EXECUTE | SECTION_MAP_READ | SECTION_MAP_WRITE | SECTION_QUERY,
     2782                               NULL /* pObjAttr*/, NULL /*pMaxSize*/,
     2783                               PAGE_EXECUTE, SEC_IMAGE, hFile);
     2784        if (NT_SUCCESS(rcNt))
     2785        {
     2786            SIZE_T cbView = 0;
     2787            rcNt = NtMapViewOfSection(hSection, pThis->hProcess, &pvRet, 0 /*ZeroBits*/, 0 /*CommitSize*/,
     2788                                      NULL /*pOffSect*/, &cbView, ViewShare, 0 /*AllocationType*/, PAGE_READWRITE);
     2789            if (NT_SUCCESS(rcNt))
     2790                SUP_DPRINTF(("supR3HardNtPuChTriggerInitialImageEvents: %s mapped at %p LB %#x\n", pszShort, pvRet, cbView));
     2791            else
     2792            {
     2793                SUP_DPRINTF(("supR3HardNtPuChTriggerInitialImageEvents: NtMapViewOfSection failed on %s: %#x\n", pszShort, rcNt));
     2794                pvRet = NULL;
     2795            }
     2796            NtClose(hSection);
     2797        }
     2798        else
     2799            SUP_DPRINTF(("supR3HardNtPuChTriggerInitialImageEvents: NtCreateSection failed on %s: %#x\n", pszShort, rcNt));
     2800        NtClose(hFile);
     2801    }
     2802    else
     2803        SUP_DPRINTF(("supR3HardNtPuChTriggerInitialImageEvents: Error opening %s: %#x\n", pszShort, rcNt));
     2804    return pvRet;
     2805}
     2806
     2807
    27572808/**
    27582809 * Trigger the initial image events without actually initializing the process.
     
    28882939
    28892940    /*
     2941     * Map kernel32.dll and kernelbase.dll (if applicable) into the process.
     2942     * This triggers should image load events that may set of AV activities
     2943     * that we'd rather see early than later.
     2944     */
     2945    UNICODE_STRING NtName1 = RTNT_CONSTANT_UNISTR(L"\\SystemRoot\\System32\\kernel32.dll");
     2946    PVOID pvKernel32 = supR3HardNtPuChMapDllIntoChild(pThis, &NtName1, "kernel32.dll");
     2947
     2948    UNICODE_STRING NtName2 = RTNT_CONSTANT_UNISTR(L"\\SystemRoot\\System32\\KernelBase.dll");
     2949    PVOID pvKernelBase = g_uNtVerCombined >= SUP_NT_VER_VISTA
     2950                       ? supR3HardNtPuChMapDllIntoChild(pThis, &NtName2, "KernelBase.dll")
     2951                       : NULL;
     2952
     2953    /*
    28902954     * Fudge factor for letting kernel threads get a chance to mess up our
    28912955     * process asynchronously.
     
    29002964    NtYieldExecution();
    29012965    SUP_DPRINTF(("supR3HardNtPuChTriggerInitialImageEvents: Startup delay kludge #1: %u ms\n", GetTickCount() - dwStart));
     2966
     2967    /*
     2968     * Unmap kernel32 & kernelbase. Wonder how the AV stuff is gonna react to this...
     2969     */
     2970    if (pvKernel32)
     2971    {
     2972        rcNt = NtUnmapViewOfSection(pThis->hProcess, pvKernel32);
     2973        if (!NT_SUCCESS(!rcNt))
     2974            SUP_DPRINTF(("supR3HardNtPuChTriggerInitialImageEvents: NtUnmapViewOfSection failed on kernel32: %#x (%p)\n",
     2975                         rcNt, pvKernel32));
     2976    }
     2977    if (pvKernelBase)
     2978    {
     2979        rcNt = NtUnmapViewOfSection(pThis->hProcess, pvKernelBase);
     2980        if (!NT_SUCCESS(!rcNt))
     2981            SUP_DPRINTF(("supR3HardNtPuChTriggerInitialImageEvents: NtUnmapViewOfSection failed on KernelBase: %#x (%p)\n",
     2982                         rcNt, pvKernelBase));
     2983    }
    29022984
    29032985    return VINF_SUCCESS;
     
    34213503     * Open the driver object directory.
    34223504     */
    3423     UNICODE_STRING NtDirName;
    3424     NtDirName.Buffer = L"\\Driver";
    3425     NtDirName.MaximumLength = sizeof(L"\\Driver");
    3426     NtDirName.Length = NtDirName.MaximumLength - sizeof(WCHAR);
     3505    UNICODE_STRING NtDirName = RTNT_CONSTANT_UNISTR(L"\\Driver");
    34273506
    34283507    OBJECT_ATTRIBUTES ObjAttr;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette