加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

DACL原理.控制文件的访问权限(文件,注册表.目录.等任何带有安全

发布时间:2021-02-26 00:37:03 所属栏目:站长百科 来源:网络整理
导读:目录 一丶简介 1.DACL是什么. 2.如何创建一个自己控制的文件. 3.SDDL是个什么鬼. 二丶 编写SDDL 控制的文件 一丶简介 1.DACL是什么. DACL称为自主访问的控制列表.是应用程序开发必要且重要的部分.由于空DACL 允许对所有用户进行类型的访问.所以一般程序开发
副标题[/!--empirenews.page--]

目录

  • 一丶简介
    • 1.DACL是什么.
    • 2.如何创建一个自己控制的文件.
    • 3.SDDL是个什么鬼.
    • 二丶 编写SDDL 控制的文件

一丶简介

1.DACL是什么.

DACL称为自主访问的控制列表.是应用程序开发必要且重要的部分.由于空DACL 允许对所有用户进行类型的访问.所以一般程序开发中都是传入NULL

比如创建文件
原型:

HANDLE CreateFileA(
  LPCSTR                lpFileName,DWORD                 dwDesiredAccess,DWORD                 dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,安全属性
  DWORD                 dwCreationDisposition,DWORD                 dwFlagsAndAttributes,HANDLE                hTemplateFile
);

一般安全属性都是传入NULL. 所以创建的文件所有人可以访问.
以文件举例.DACL是什么.
在刚开始自己研究MSDN的时候也是搞不懂 什么事DACL SDDL安全属性描述符.
ACE是什么.

这里简单说下.

DACL就是以自己的理解就是权限的集合. DACL有很多权限组成.这些权限成为ACE.

如下:

DACL原理.控制文件的访问权限(文件,注册表.目录.等任何带有安全


打开一个程序 右键->属性->安全则可以看到. DACL其实就是上图所说的那个组.自我理解.

那么ACE是什么.上面说了. ACE是 ACL链表里面的一个子选项. 上面的DACL也是ACL.

DACL原理.控制文件的访问权限(文件,注册表.目录.等任何带有安全

如上图.自我理解上面这些就是ACE选项.

2.如何创建一个自己控制的文件.

以MSDN举例子

1.首先创建一个 安全属性结构体.(比如创建文件.文件中一般传入NULL.现在不传NULL)
2.使用SDDL字符串对其进行初始化

3.使用 使用 ConvertStringSecurityDescriptorToSecurityDescriptor 函数将SDDL字符串转为安全描述符.(就是那个结构体) 那个结构体的->LpsecurityDscriptor成员.
而且使用这个函数.则将返回值发送到main函数.main函数使用
更新过后的SECURITY_ATTRIBUTES 结构来创建文件.
也就是说你使用函数.更改了安全属性.然后使用这个安全属性来创建文件.
4.使用过之后要使用 localFree函数释放 lpSecurityDescriptor 申请的内存.

PS: 要使用 Conver... 这种SDDL的函数.必须将 _WIN32_WINNT 常量定义为0x0500 或者更高.

问题:
根据上面MSDN所说.要使用SDDL字符串. 那么SDDL是个什么鬼.
下面说.

3.SDDL是个什么鬼.

SDDL上面说书 是 安全描述符字符串格式 也就是说这个字符串是存储安全描述符(那个结构体)所需要记录的文本格式.

还告诉我们两个函数

ConvertSecurityDescriptorToStringSecurityDescriptor
ConvertStringSecurityDescriptorToSecurityDescriptor

根据词义就是说.一个是安全属性转化为文本格式(SDDL)
两一个就是文本个数(SDDl)转化为安全属性描述.

这里简单说一下吧. SDDL 是一个 NULL-Terminated结尾的字符串.
主要分为四组:

1.O: owner_sid 代表对象的SID字符串
2.G: Group_sid 一个SID字符串.标识对象的主要组
3.dacl_flags(ACE......)DACL信息.由ACE组成
4.sacl_flags(ACE...) SACLxin

刚开始看这个SDDL字符串.把我搞晕了.后来就明白了

首先就是说SDDL 文本格式分为四组

对象的SID字符串:组sid的字符串:DACL信息(ACE....):Sacl信息(ACE...)

格式就如下:

以MSDN给的解析一下.MSDN的解析把握搞晕了.自己后来弄好了

"O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)"

O: 代表 owner_sid
AOG: 代表对象组的SID字符串
DAD:(XXX): 代表的是DACL信息.
Sacl没有.

O: 代表对象的SID.可以看一下这一篇连接
https://docs.microsoft.com/zh-tw/windows/win32/secauthz/sid-strings

DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)

这个字符串是什么意思
首先DAD 根据MSDN所说.让我们参考 SetSecurityDescripTorControl函数. 说是他的控制位.找了一圈没找到有用的信息.
暂且不管.其实主要的就是后面后括号里面的内容.
这些内容代表的是权限.是你访问的权限. 是ACE信息.

关于这个看一下 ACE Strings即可. 里面有说这个ACE是来组成SDDL的权限的.
而且还说了ACE Strings代表的字段是什么.

ace_type;ace_flags;rights;object_guid;inherit_object_guid;account_sid;(resource_attribute)

MSDNhttps://docs.microsoft.com/zh-tw/windows/win32/secauthz/ace-strings

截取一部分ACE String

DACL原理.控制文件的访问权限(文件,注册表.目录.等任何带有安全

暂时了解这些.看下如何编程

二丶 编写SDDL 控制的文件

SDDL可以转化为安全属性 使用这个安全属性来创建文件就可以生成你自己控制访问的文件了.

#include <windows.h>
#include <AclAPI.h>
#define _WIN32_WINNT 0x0500
#pragma comment(lib,"Advapi32.lib")



BOOL CreateMyDACL(SECURITY_ATTRIBUTES *);

void main()
{
    SECURITY_ATTRIBUTES  sa;

    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = FALSE;

    // Call function to set the DACL. The DACL
    // is set in the SECURITY_ATTRIBUTES 
    // lpSecurityDescriptor member.
    if (!CreateMyDACL(&sa))
    {
        // Error encountered; generate message and exit.
        printf("Failed CreateMyDACLn");
        exit(1);
    }

    // Use the updated SECURITY_ATTRIBUTES to specify
    // security attributes for securable objects.
    // This example uses security attributes during
    // creation of a new directory.
   
    HANDLE hFile = CreateFile(TEXT("D:1234.txt"),GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE | FILE_SHARE_READ,&sa,CREATE_NEW,NULL,NULL);
    // Free the memory allocated for the SECURITY_DESCRIPTOR.
    if (NULL != LocalFree(sa.lpSecurityDescriptor))
    {
        // Error encountered; generate message and exit.
        printf("Failed LocalFreen");
        exit(1);
    }
}


BOOL CreateMyDACL(SECURITY_ATTRIBUTES * pSA)
{
 
    TCHAR * szSD =(TCHAR*) TEXT("D:(D;OICI;GRGW;;;BA)");    
                                     

    if (NULL == pSA)
        return FALSE;

    return ConvertStringSecurityDescriptorToSecurityDescriptor(
        szSD,SDDL_REVISION_1,&(pSA->lpSecurityDescriptor),NULL);
}

这里主要是看 CreateMyDacl这个函数内部的SDDL安全属性描述符字符串.

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读