GetSecurityInfo и SetEntriesInAclA

Тема в разделе "WASM.WIN32", создана пользователем FashiST, 3 авг 2006.

  1. FashiST

    FashiST New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2006
    Сообщения:
    12
    HANDLE OpenPhysicalMemory(DWORD mAccess)
    {
    UNICODE_STRING PhysMemString;
    OBJECT_ATTRIBUTES Attr;
    PACL OldAcl, NewAcl;
    PSECURITY_DESCRIPTOR SD;
    PEXPLICIT_ACCESS_A Access;
    HANDLE mHandle;
    HANDLE Result;
    NTSTATUS ntStatus;
    DWORD dStatus;
    HRESULT hStatus;
    HLOCAL hlStatus;

    hntdll = LoadLibrary(TEXT("ntdll.dll"));
    MyRtlInitUnicodeString = (void (__stdcall *) ( OUT PUNICODE_STRING, IN PCWSTR))GetProcAddress( hntdll,"RtlInitUnicodeString");
    MyRtlInitUnicodeString(&PhysMemString, L"\\Device\\PhysicalMemory");

    InitializeObjectAttributes(&Attr, &PhysMemString, OBJ_CASE_INSENSITIVE , NULL, NULL);
    ZwOpenSection = (tag_ZwOpenSection) GetProcAddress( hntdll, "ZwOpenSection" );
    ntStatus = ZwOpenSection(&mHandle, READ_CONTROL | WRITE_DAC, &Attr);
    if(ntStatus != STATUS_SUCCESS)
    return 0;

    OldAcl = (PACL)VirtualAlloc(NULL,
    sizeof(ACL),
    MEM_COMMIT|MEM_RESERVE,
    PAGE_READWRITE);

    NewAcl = (PACL)VirtualAlloc(NULL,
    sizeof(ACL),
    MEM_COMMIT|MEM_RESERVE,
    PAGE_READWRITE);
    SD = (PSECURITY_DESCRIPTOR)VirtualAlloc(NULL,
    sizeof(SECURITY_DESCRIPTOR),
    MEM_COMMIT|MEM_RESERVE,
    PAGE_READWRITE);

    dStatus = GetSecurityInfo(mHandle, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &OldAcl, NULL, &SD);
    DWORD dLastError = GetLastError(); //error dLastError = 0x0000007a

    //вот здесь ошибка, хотя dStatus = 0;


    if(dStatus != ERROR_SUCCESS)
    return 0;
    Access = (PEXPLICIT_ACCESS_A)VirtualAlloc(NULL,
    sizeof(EXPLICIT_ACCESS_A),
    MEM_COMMIT|MEM_RESERVE,
    PAGE_READWRITE);
    Access->grfAccessPermissions = mAccess;
    Access->grfAccessMode = GRANT_ACCESS;
    Access->grfInheritance = NO_INHERITANCE;
    Access->Trustee.pMultipleTrustee = NULL;
    Access->Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
    Access->Trustee.TrusteeForm = TRUSTEE_IS_NAME;
    Access->Trustee.TrusteeType = TRUSTEE_IS_USER;
    Access->Trustee.ptstrName = "CURRENT_USER";

    dStatus = SetEntriesInAclA(1, Access, OldAcl, &NewAcl); //error dLastError = 0x000003f0

    //и здесь ошибка, хотя dStatus тоже = 0;
    dLastError = GetLastError();
    dStatus = SetSecurityInfo(mHandle , SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, NewAcl, NULL);
    ntStatus = ZwOpenSection(&Result, mAccess, &Attr);
    dStatus = SetSecurityInfo(mHandle , SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, OldAcl, NULL);
    hStatus = CloseHandle(mHandle);
    hlStatus = LocalFree(NewAcl);
    hlStatus = LocalFree(SD);
    return Result;
    }

    Я не понимаю почему возникают ошибки, хотя возвращаемое значение dStatus = 0
    Может дело в ZwOpenSection??? в mHandle она возвращает 0x00000fc0.


    Кстати. Использовал вариант с драйвером. Драйвер загружается нормально. Создаю устройство с помощью CreateFile(). При попытке записи чего-нить в устройство, система падает.

    Может кто чего-нить подскажет???
     
  2. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Драйверы обычно падают при
    Код (Text):
    1. xor eax, eas
    2. mov ebx, dword ptr [eax]
    Прототипчик как-то так
    Код (Text):
    1. DWORD WINAPI GetSecurityInfo(
    2.   __in       HANDLE handle,
    3.   __in       SE_OBJECT_TYPE ObjectType,
    4.   __in       SECURITY_INFORMATION SecurityInfo,
    5.   __out_opt  PSID *ppsidOwner,
    6.   __out_opt  PSID *ppsidGroup,
    7.   __out_opt  PACL *ppDacl,
    8.   __out_opt  PACL *ppSacl,
    9.   __out_opt  PSECURITY_DESCRIPTOR *ppSecurityDescriptor //Не хочет собака писать по нулевому адресу
    10. );
    Тему раскопали, закрыли, и закопали :derisive: