是否可以僅對某些進程訪問文件?

因此,我試圖使文件僅對某些進程可訪問,首先通過此函數查找它:

bool GetProcessSid(PSID* pSID)
{
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(snapshot, &entry) == TRUE)
    {
        while(Process32Next(snapshot, &entry) == TRUE)
        {
            const char* process_name = "testfileaccess2.exe";
            std::string t(process_name);
            std::wstring w_process_name(t.begin(), t.end());
            if (w_process_name.compare(entry.szExeFile)== 0)
            {
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
                //...
                GetSecurityInfo(hProcess,SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION,pSID,NULL,NULL,NULL,NULL);
                
                //getsecurityinfo(hprocess,SE_SERVICE) for service
                CloseHandle(hProcess);
                return TRUE;
            }
        }
    }
    return FALSE;
}

工作正常,如果進程處于活動狀態,則始終找到進程并返回pSID。然后我創建如下文件:

PACL pNewDACL = NULL;
    PSID process_with_access = NULL;
    PSID current_user = NULL;
    DWORD sid_size = SECURITY_MAX_SID_SIZE;
    SID everyone_sid;
    DWORD dwRes;
    if (CreateWellKnownSid(WinWorldSid, NULL, &everyone_sid, &sid_size) ==
        FALSE) {
        throw std::runtime_error("CreateWellKnownSid() failed: " +
            std::to_string(GetLastError()));
    }

    GetProcessSid(&process_with_access);
    GetCurrentUserSid(&current_user);
    EXPLICIT_ACCESSA ea[2];
    ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESSA));

    ea[0].grfAccessPermissions = ACCESS_SYSTEM_SECURITY | READ_CONTROL | WRITE_DAC | GENERIC_ALL;
    ea[0].grfAccessMode = DENY_ACCESS;
    ea[0].grfInheritance = NO_INHERITANCE;
    ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
    ea[0].Trustee.ptstrName = reinterpret_cast<char*>(process_with_access);

    ea[1].grfAccessPermissions = ACCESS_SYSTEM_SECURITY | READ_CONTROL | WRITE_DAC | GENERIC_ALL;
    ea[1].grfAccessMode = GRANT_ACCESS;
    ea[1].grfInheritance = NO_INHERITANCE;
    ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
    ea[1].Trustee.ptstrName = reinterpret_cast<char*>(current_user);

    dwRes = SetEntriesInAclA(2, ea, NULL, &pNewDACL);
    if (ERROR_SUCCESS != dwRes) {
        printf("SetEntriesInAcl Error %u\n", dwRes);
        //TODO: goto Cleanup;
    }

    PSECURITY_DESCRIPTOR pSD = NULL;

    // Initialize a security descriptor.  
    pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR,
        SECURITY_DESCRIPTOR_MIN_LENGTH);
    if (NULL == pSD)
    {
        printf("error");
    }

    if (!InitializeSecurityDescriptor(pSD,
        SECURITY_DESCRIPTOR_REVISION))
    {
        
        printf("error");
    }

    // Add the ACL to the security descriptor. 
    if (!SetSecurityDescriptorDacl(pSD,
        TRUE,     // bDaclPresent flag   
        pNewDACL,
        FALSE))   // not a default DACL
    {
        printf("error");
    }
    SECURITY_ATTRIBUTES sa;
    // Initialize a security attributes structure.
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = pSD;
    sa.bInheritHandle = FALSE;

    HANDLE hFile = CreateFileA(filename, GENERIC_ALL, 0, &sa, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
    CloseHandle(hFile);

目前,它只為進程的父進程設置訪問權限,而不是進程本身。那么,我想要實現的目標有可能實現嗎?

? 最佳回答:

不,Windows的安全性基于用戶/組訪問列表。可以設置一個進程,使其以某個特定用戶的身份運行,然后限制對該用戶的訪問,但任何以管理員或本地系統身份運行的程序都可以繞過該保護。

針對此類程序,您所能做的最好的事情是防止意外訪問,而不是惡意訪問。

主站蜘蛛池模板: 另类一区二区三区| 蜜桃臀无码内射一区二区三区| 国产免费无码一区二区| 国产伦精品一区二区三区不卡 | 熟女大屁股白浆一区二区| 亚洲av色香蕉一区二区三区蜜桃| 在线视频一区二区三区三区不卡 | 免费无码毛片一区二区APP| 亚洲国产精品一区二区三区久久| 国产一区二区三区小说| 无码av免费毛片一区二区| 久久久久99人妻一区二区三区| 中文字幕在线一区| 国产一区三区三区| 国产成人一区在线不卡| 小泽玛丽无码视频一区| 日本一区二区三区在线视频| 欧美日韩精品一区二区在线视频| 亚洲美女视频一区| 午夜性色一区二区三区免费不卡视频| 日韩免费无码视频一区二区三区| 久久se精品一区精品二区| 日本精品一区二区三区在线观看| 国产日韩一区二区三区在线观看 | 亚洲AV无码一区二区三区久久精品| 久久国产一区二区三区| 无码人妻精品一区二区三区东京热| 国产一区二区三区91| 日本精品一区二区三区在线观看| 无码人妻精品一区二区三区夜夜嗨 | 国产精品污WWW一区二区三区| 丰满岳乱妇一区二区三区| 国产另类ts人妖一区二区三区| 99久久精品国产高清一区二区| 亚洲一区二区三区香蕉| 2021国产精品一区二区在线| 伊人久久一区二区三区无码| 国产一区二区三区国产精品| 国产av福利一区二区三巨| 国产精品视频一区二区噜噜| 99无码人妻一区二区三区免费|