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ó.
davy.ai
Parece que el enlace simbólico creado utilizando la biblioteca
NtObjectManager
no se puede eliminar mediante métodos convencionales comoRegedit.exe
o la funciónNtKey.DeleteKey()
. Una posible solución es utilizar la misma bibliotecaNtObjectManager
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”;
}
“`
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ónDelete
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
.