es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo eliminar una clave de enlace simbólico del registro desde C#: “Un error está impidiendo que esta clave se abra. Detalles: Acceso denegado”

Creé una clave de registro simbólica utilizando la biblioteca NtObjectManager de Google Project Zero de la siguiente manera:

“`c#
using NtApiDotNet;
using System;

namespace poc
{
class Program
{
const string SrcKey = @"HKEY_CURRENT_USER\SOFTWARE\ABC";
const string TargetKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\XYZ";

<pre><code> static NtKey CreateSymbolicLink(string name, string target)
{
name = NtKeyUtils.Win32KeyNameToNt(name);
target = NtKeyUtils.Win32KeyNameToNt(target);
return NtKey.CreateSymbolicLink(name, null, target);
}

static void Main(string[] args)
{
var link = CreateSymbolicLink(SrcKey, TargetKey);
}
}
</code></pre>

}

<pre><code><br />Cuando intenté borrar la clave del Registro (Regedit.exe), falló con el siguiente error:

> No se puede abrir ABC. Hay un error que impide que esta clave se abra. Detalles: Acceso denegado.

Intenté borrarlo incluso con permisos de SYSTEM (usando psexec para ejecutar un cmd con permisos de SYSTEM), pero aún así recibí el mismo error.

La función NtKey.CreateSymbolicLink está llamando a SetSymbolicLinkTarget que, eventualmente, llama a SetValue de la siguiente manera:

</code></pre>

SetValue(SymbolicLinkValueName, RegistryValueType.Link, Encoding.Unicode.GetBytes(target), throw_on_error);
“`

Todavía no encuentro cómo borrarlo. Encontré una respuesta sobre cómo borrar una clave de registro simbólica con C++, pero solo llama a lpfnZwDeleteKey y no sé cuál es el equivalente en C#.

También intenté utilizar la función NtKey.UnloadKey, pensé que podría ayudar, pero no funcionó.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el enlace simbólico creado utilizando la biblioteca NtObjectManager no se puede eliminar mediante métodos convencionales como Regedit.exe o la función NtKey.DeleteKey(). Una posible solución es utilizar la misma biblioteca NtObjectManager para eliminar el enlace simbólico.

    Aquí te mostramos cómo se puede hacer:

    “`c#
    using NtApiDotNet;

    namespace poc
    {
    class Program
    {
    const string SrcKey = @”HKEY_CURRENT_USER\SOFTWARE\ABC”;

        static void Main(string[] args)
        {
            using (var obj_attr = new ObjectAttributes(SrcKey))
            {
                using (var key = NtKey.Open(obj_attr, KeyAccessRights.MaximumAllowed))
                {
                    key.Delete();
                }
            }
        }
    }
    

    }
    “`

    En el código anterior, estamos abriendo la clave del enlace simbólico utilizando la función NtKey.Open y luego llamando a la función Delete en el objeto de la clave para eliminarla.

    Ten en cuenta que estamos utilizando KeyAccessRights.MaximumAllowed para asegurarnos de tener los permisos necesarios para eliminar la clave.

    Esto debería eliminar correctamente la clave del enlace simbólico creada con la biblioteca NtObjectManager.

Comments are closed.