<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SoftRCE.net &#187; GroupSid</title>
	<atom:link href="http://www.softrce.net/archives/tag/groupsid/feed" rel="self" type="application/rss+xml" />
	<link>http://www.softrce.net</link>
	<description>Software Reverse Code Engineering</description>
	<lastBuildDate>Tue, 13 Sep 2011 06:58:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>How to adjust the Ace of device object</title>
		<link>http://www.softrce.net/archives/217</link>
		<comments>http://www.softrce.net/archives/217#comments</comments>
		<pubDate>Wed, 10 Feb 2010 08:28:03 +0000</pubDate>
		<dc:creator>gz1x</dc:creator>
				<category><![CDATA[独孤九剑（Kernel）]]></category>
		<category><![CDATA[ACE]]></category>
		<category><![CDATA[GroupSid]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=217</guid>
		<description><![CDATA[一直想给以前弄的东西写点什么或者给KP贡献点代码文档什么的，但是苦于一直没有时间，换工作，换住处，换了很多东西，也就没闲的下来抛砖了，难得要过年了，扔一块试试水深。
直接扔关键代码，不想写太多的说明，本来这些代码也只是副产品,眼尖的应该能看出来这些代码的来处和用处。

PACCESS_ALLOWED_ACE
GetAceFromAcl(
    IN PACL Dacl,
    IN ULONG AceIndex
    )

<!--more--><!--more-->]]></description>
			<content:encoded><![CDATA[<p> <br />
直接扔关键代码，不想写太多的说明，本来这些代码也只是副产品，眼尖的应该能看出来这些代码的来处和去处。</p>
<p><span id="more-217"></span><!--more--><br />
===============</p>
<pre>PACCESS_ALLOWED_ACE
GetAceFromAcl(
    IN PACL Dacl,
    IN ULONG AceIndex
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

{
    USHORT i = 0;
    PACCESS_ALLOWED_ACE Ace = NULL;

    if (Dacl &amp;&amp; AceIndex &lt; Dacl-&gt;AceCount)
    {
        for (Ace = FirstAce(Dacl); i &lt; AceIndex; Ace = NextAce(Ace))
        {
            if (Ace &gt;= (PACCESS_ALLOWED_ACE)((PUCHAR)Dacl + Dacl-&gt;AclSize))
            {
                break;
            }

            ++ i;   
        }

        if (i == AceIndex)
        {
            return Ace;
        }
    }

    return NULL;
}

BOOLEAN
NmCheckDaclForGroupSid(
    IN PACL Dacl
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

{ 
    USHORT i = 0;
    USHORT gSidOffset, cSidOffset;
    BOOLEAN result = FALSE;
    PACCESS_ALLOWED_ACE pACE = NULL;
    SIZE_T retLong;

    if (g_GroupAce-&gt;Header.AceSize &gt;= (USHORT)(sizeof(ACCESS_ALLOWED_ACE)))
    {
        gSidOffset = g_GroupAce-&gt;Header.AceSize -
              (USHORT)(sizeof(ACCESS_ALLOWED_ACE));  

        if (Dacl-&gt;AceCount)
        {
            do
            {
                pACE = GetAceFromAcl(Dacl, i);

                if (pACE)
                {
                    cSidOffset = pACE-&gt;Header.AceSize -
                          (USHORT)(sizeof(ACCESS_ALLOWED_ACE));

                    if (gSidOffset == cSidOffset)
                    {
                        retLong = RtlCompareMemory(
                            &amp;(pACE-&gt;SidStart),
                            &amp;(g_GroupAce-&gt;SidStart),
                            cSidOffset
                            );

                        result = (cSidOffset == retLong);

                        if (result == TRUE)
                        {
                            return result;
                        }
                    }
                 }

                 ++ i;

            } while (i &lt; Dacl-&gt;AceCount);
        }
    }

    return result;
}

BOOLEAN
AddAceToAcl(
    IN PACL NewAcl,
    IN PACCESS_ALLOWED_ACE toAddAce
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

{ 
    USHORT i = 0;
    PACCESS_ALLOWED_ACE Ace = FirstAce(NewAcl);

    if (NewAcl &amp;&amp; toAddAce)
    {
        if (NewAcl-&gt;AceCount)
        {
            for (NOTHING; i &lt; NewAcl-&gt;AceCount; Ace = NextAce(Ace))
            {
                if (Ace &gt;= (PACCESS_ALLOWED_ACE)((PUCHAR)NewAcl + NewAcl-&gt;AclSize))
                {
                    break;
                }

                ++ i;
            }
         }

         if ((PACCESS_ALLOWED_ACE)((PUCHAR)Ace + toAddAce-&gt;Header.AceSize) &gt;
                        (PACCESS_ALLOWED_ACE)((PUCHAR)NewAcl + NewAcl-&gt;AclSize))
         {
             return FALSE;
         }
         else
         {
             NdisMoveMemory(
                 Ace,
                 toAddAce,
                 toAddAce-&gt;Header.AceSize
                 );

             NewAcl-&gt;AceCount = i + 1;
         }
    }

    return TRUE;
}

NDIS_STATUS
NmModifyDacl(
    IN PACL oldDacl,
    OUT PACL* NewDacl
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

{
    NDIS_STATUS result = NDIS_STATUS_SUCCESS;
    USHORT tSize;
    PACL tmpDacl = NULL;
    USHORT i = 0;
    PACCESS_DENIED_ACE pdACE = NULL;
    PACCESS_ALLOWED_ACE paACE = NULL;

    if (oldDacl)
    {
        tSize = oldDacl-&gt;AclSize + g_GroupAce-&gt;Header.AceSize;

        tmpDacl = (PACL)ExAllocatePoolWithTag(
            NonPagedPool,
            tSize,
            'dnTF'
            );
        if (tmpDacl)
        {
            tmpDacl-&gt;AclRevision = oldDacl-&gt;AclRevision;   
            tmpDacl-&gt;Sbz1 = oldDacl-&gt;Sbz1;
            tmpDacl-&gt;AceCount = 0;
            tmpDacl-&gt;AclSize = tSize;   
            tmpDacl-&gt;Sbz2 = oldDacl-&gt;Sbz2;

            if (oldDacl-&gt;AceCount)
            {
                do
                {
                    pdACE = (PACCESS_DENIED_ACE)GetAceFromAcl(
                        oldDacl,
                        i
                        );
                    if (pdACE-&gt;Header.AceType != ACCESS_DENIED_ACE_TYPE)
                    {
                        break;
                    }

                    AddAceToAcl(tmpDacl, (PACCESS_ALLOWED_ACE)pdACE);

                    ++ i;

                } while (i &lt; oldDacl-&gt;AceCount);    
             }

             AddAceToAcl(tmpDacl, g_GroupAce);

             while(i &lt; oldDacl-&gt;AceCount)
             {
                 paACE = GetAceFromAcl(oldDacl, i);

                 AddAceToAcl(tmpDacl, (PACCESS_ALLOWED_ACE)paACE);

                 ++ i;
             }

             *NewDacl= tmpDacl;
        }
    }   

    return result;
}

NDIS_STATUS
NmAddGroupAccessAce(
    IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

{
    NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
    PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
    PSECURITY_DESCRIPTOR NewSecurityDescriptor = NULL;

    ULONG csize = sizeof(SECURITY_DESCRIPTOR);
    PACL NewDdcl = NULL;
    HANDLE Handle = NULL;
    BOOLEAN DaclPresent, DaclDefaulted;
    PACL Dacl = NULL;

    if (DeviceObject &amp;&amp; g_GroupAce)
    {
        Status = ObOpenObjectByPointer(
            DeviceObject,
            OBJ_KERNEL_HANDLE,
            NULL,
            WRITE_DAC,
            0,
            0,
            &amp;Handle
            );
        if (Status == NDIS_STATUS_SUCCESS)
        {
            SecurityDescriptor = DeviceObject-&gt;SecurityDescriptor;

            Status = RtlGetDaclSecurityDescriptor(
                SecurityDescriptor,
                &amp;DaclPresent,
                &amp;Dacl,
                &amp;DaclDefaulted
                );
            if (Status == NDIS_STATUS_SUCCESS)
            {
                ASSERT(DaclPresent);
                ASSERT(Dacl != NULL);

                if (NmCheckDaclForGroupSid(Dacl) != TRUE)
                {
                    csize = RtlLengthSecurityDescriptor(SecurityDescriptor);

                    NewSecurityDescriptor = ExAllocatePoolWithTag(
                        NonPagedPool,
                        g_GroupAce-&gt;Header.AceSize + csize,
                        'dnTF'
                        );
                    if (NewSecurityDescriptor)
                    {
                        RtlCreateSecurityDescriptor(
                            NewSecurityDescriptor,
                            SECURITY_DESCRIPTOR_REVISION
                            );

                        Status = NmModifyDacl(
                            Dacl,
                            &amp;NewDdcl
                            );
                        if (Status == NDIS_STATUS_SUCCESS)
                        {
                            Status = RtlSetDaclSecurityDescriptor(
                                NewSecurityDescriptor,
                                TRUE,
                                NewDdcl,
                                FALSE
                                );
                            if (Status == NDIS_STATUS_SUCCESS)
                            {
                                Status = ZwSetSecurityObject(
                                    Handle,
                                    DACL_SECURITY_INFORMATION,
                                    NewSecurityDescriptor
                                    );
                            }
                        }
                    }
                }
            }
        }

        if (Handle)
        {
            ZwClose(Handle);
        }

        if (NewSecurityDescriptor)
        {
            ExFreePoolWithTag(NewSecurityDescriptor, 'dnTF');
        }

        if (NewDdcl)
        {
            ExFreePoolWithTag(NewDdcl, 'dnTF');
        }
    }

    return Status;
}</pre>
<p>===============</p>
<p>在RegisterDevice之后加上即可，对于g_GroupAce，这个查询注册表或者自己获取，这些都是因时而异。<br />
我这里是需要从注册表读过来的，然后加上去的：</p>
<p>===============</p>
<pre>PACCESS_ALLOWED_ACE g_GroupAce = NULL;

//...省略...

       InitializeObjectAttributes(
           &amp;ObjectAttributes,
           RegistryPath,
           OBJ_CASE_INSENSITIVE,
           NULL,
           NULL
           );

       Status = ZwOpenKey(
           &amp;hHandle,
           KEY_READ,
           &amp;ObjectAttributes
           );
       if (Status == STATUS_SUCCESS)
       {
           RtlInitUnicodeString(&amp;DestinationString, L"GroupSid");

           Status = ZwQueryValueKey(
               hHandle,
               &amp;DestinationString,
               KeyValueFullInformation,
               0,
               0,
               &amp;ResultLength
               );
           if (Status == STATUS_BUFFER_OVERFLOW ||
               Status == STATUS_BUFFER_TOO_SMALL)
           {
               pBuffer = (PKEY_VALUE_FULL_INFORMATION)ExAllocatePoolWithTag(
                   NonPagedPool,
                   ResultLength,
                   'dnTF'
                   );  
               if (pBuffer)
               {
                   Status = ZwQueryValueKey(
                       hHandle,
                       &amp;DestinationString,
                       KeyValueFullInformation,
                       pBuffer,
                       ResultLength,
                       &amp;ResultLength
                       );
                   if (Status == STATUS_SUCCESS)
                   {
                         g_GroupAce = (PACCESS_ALLOWED_ACE)ExAllocatePoolWithTag(
                              NonPagedPool,
                              pBuffer-&gt;DataLength + sizeof(ACCESS_ALLOWED_ACE),
                              'gamn'
                              );
                         if (g_GroupAce)
                         {
                              NdisZeroMemory(
                                  g_GroupAce,
                                  pBuffer-&gt;DataLength + sizeof(ACCESS_ALLOWED_ACE)
                                  );

                              g_GroupAce-&gt;Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
                              g_GroupAce-&gt;Header.AceFlags = 0;
                              g_GroupAce-&gt;Header.AceSize =
                                   (USHORT)(pBuffer-&gt;DataLength +
                                   sizeof(ACCESS_ALLOWED_ACE));

                              g_GroupAce-&gt;Mask = SYNCHRONIZE |
                                   READ_CONTROL | FILE_READ_ATTRIBUTES |
                                   FILE_READ_DATA | FILE_READ_EA;

                              NdisMoveMemory(
                                  (PVOID)&amp;(g_GroupAce-&gt;SidStart),
                                  (PVOID)((PUCHAR)pBuffer + pBuffer-&gt;DataOffset),
                                  pBuffer-&gt;DataLength
                                  );

//...省略...</pre>
<p>===============</p>
<p>PS: 排版很麻烦，我改了半天。下篇把这个工程的真正精华部分放上来大家探讨。</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/217">2010年10月11日</a>, Lewis writes: 你丫的，没下文了！</li></ul><hr /><h2>Related posts:</h2><ul><li><a href="http://www.softrce.net/archives/10" rel="bookmark" title="Permanent Link: [国庆礼]Exploiting Windows Device Drivers译文版">[国庆礼]Exploiting Windows Device Drivers译文版</a></li><li><a href="http://www.softrce.net/archives/9" rel="bookmark" title="Permanent Link: 文章预告：Exploiting Windows Device Drivers">文章预告：Exploiting Windows Device Drivers</a></li><li><a href="http://www.softrce.net/archives/14" rel="bookmark" title="Permanent Link: Vista Bootmgr/Winload使用的大部分选项ID">Vista Bootmgr/Winload使用的大部分选项ID</a></li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2010年05月12日 -- <a href="http://www.softrce.net/archives/312" title="RdpDr.sys Bug Check 0X7E{0xC0000005}">RdpDr.sys Bug Check 0X7E{0xC0000005}</a></li><li>2008年10月22日 -- <a href="http://www.softrce.net/archives/16" title="绕过主动防御的代码注入方法一点思考">绕过主动防御的代码注入方法一点思考</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/63" title="Native Application之键盘处理">Native Application之键盘处理</a></li><li>2009年12月27日 -- <a href="http://www.softrce.net/archives/210" title="Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debugger_Tutorial">Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debugger_Tutorial</a></li><li>2010年05月7日 -- <a href="http://www.softrce.net/archives/310" title="IoRegisterDriverReinitialization 和IoRegisterBootDriverReinitialization">IoRegisterDriverReinitialization 和IoRegisterBootDriverReinitialization</a></li><li>2009年04月26日 -- <a href="http://www.softrce.net/archives/1" title="SoftRCE再次回归上线">SoftRCE再次回归上线</a></li><li>2011年03月21日 -- <a href="http://www.softrce.net/archives/369" title="QQplayer Memory Corruption Vulnerability">QQplayer Memory Corruption Vulnerability</a></li><li>2010年01月12日 -- <a href="http://www.softrce.net/archives/213" title="MS07-014调试手记">MS07-014调试手记</a></li><li>2010年04月21日 -- <a href="http://www.softrce.net/archives/302" title="WinMount mou文件格式溢出漏洞分析">WinMount mou文件格式溢出漏洞分析</a></li><li>2009年05月15日 -- <a href="http://www.softrce.net/archives/136" title="ActiveX 控件组件的Fuzz和利用">ActiveX 控件组件的Fuzz和利用</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/217/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

