elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Renombrar una clave de registro usando c#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Renombrar una clave de registro usando c#  (Leído 933 veces)
Borito30


Desconectado Desconectado

Mensajes: 481


Ver Perfil
Renombrar una clave de registro usando c#
« en: 25 Marzo 2017, 21:28 »

Hola hago esto:
Código
  1. using Microsoft.Win32.SafeHandles;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Runtime.InteropServices;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace ConsoleApplication7
  10. {
  11.    class Program
  12.    {
  13.        private static readonly IntPtr HKEY_LOCAL_MACHINE = new IntPtr(-2147483646);
  14.        [DllImport("advapi32")]
  15.        public static extern int RegRenameKey(SafeRegistryHandle hKey, [MarshalAs(UnmanagedType.LPWStr)] string oldname,
  16.        [MarshalAs(UnmanagedType.LPWStr)] string newname);
  17.        static void Main(string[] args)
  18.        {
  19.  
  20.            SafeRegistryHandle hKey = null;
  21.            hKey = new SafeRegistryHandle(HKEY_LOCAL_MACHINE,true);
  22.            RegRenameKey(hKey, "\\SOFTWARE\\Company", "\\SOFTWARE\\Compa");
  23.            Console.ReadLine();
  24.  
  25.        }
  26.    }
  27. }

Pero no lo renombra no se porque.


« Última modificación: 26 Marzo 2017, 08:48 por Eleкtro » En línea

Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)
MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 4.852


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Renombrar una clave de registro usando c#
« Respuesta #1 en: 26 Marzo 2017, 00:56 »

Creo que debes abrir la clave antes de poder hacer algo con ella.

Saludos!


En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Renombrar una clave de registro usando c#
« Respuesta #2 en: 26 Marzo 2017, 08:46 »

Hola.

Mediante un pequeño ensayo y error no resulta nada complicado averiguar que es lo que está fallando, sin embargo no has especificado el código de error de Windows que te devuelve la función cuando la llamas, y como comprenderás esto sería el detalle más importante al estar hablando de una función indocumentada... muestra el valor de resultado de la función. De todas formas probablemente te esté devolviendo un código 161 (0xA1) ERROR_BAD_PATHNAME o 2 (0x2) ERROR_FILE_NOT_FOUND:

En primera instancia estás utilizando incorrectamente la función. Estas son las cosas a tener en cuenta:

1. El segundo parámetro de la función solamente acepta una ruta relativa (no absoluta), o también el nombre de la clave.
Es decir: "SOFTWARE\Company" o "Company"

2. El último parámetro de la función solamente acepta el (nuevo) nombre de la clave, no una ruta relativa ni tampoco absoluta.
Es decir: "Company"

3. El handle de la clave de registro debe apuntar al visor de registro adecuado (x86, x64) y hacia una clave abierta con permisos de lectura y escritura.

Aquí te muestro un ejemplo funcional (me he tomado la libertad de optimizar la firma de la función y de construir la documentación):

Código
  1. /// ----------------------------------------------------------------------------------------------------
  2. /// <summary>
  3. /// Renames a registry subkey.
  4. /// </summary>
  5. /// ----------------------------------------------------------------------------------------------------
  6. /// <remarks>
  7. /// This function is not documented, however it internaly calls <c>NtRenameKey</c> function:
  8. /// <para></para>
  9. /// <see href="https://msdn.microsoft.com/en-us/library/cc512138.aspx"/>
  10. /// </remarks>
  11. /// ----------------------------------------------------------------------------------------------------
  12. /// <param name="hkey">
  13. /// A handle to the source registry rootkey or subkey.
  14. /// </param>
  15. ///
  16. /// <param name="srcSubKeyPathOrName">
  17. /// The relative path or the name of the source subkey. (eg. "SOFTWARE\My Old SubKey" or "My Old SubKey")
  18. /// </param>
  19. ///
  20. /// <param name="dstSubkeyName">
  21. /// The destination name of the subkey. (eg. "My New SubKey")
  22. /// </param>
  23. /// ----------------------------------------------------------------------------------------------------
  24. /// <returns>
  25. /// Returns <c>0</c> (zero) if successful; otherwise, a Win32 system error code.
  26. /// </returns>
  27. /// ----------------------------------------------------------------------------------------------------
  28. [Obsolete]
  29. [DllImport("advapi32", EntryPoint = "RegRenameKey", SetLastError = false,
  30. CharSet = CharSet.Auto, BestFitMapping = false, ThrowOnUnmappableChar = true)]
  31. [return: MarshalAs(UnmanagedType.U4)]
  32. public static extern int RegRenameKey(SafeRegistryHandle hkey,
  33.                              string srcSubKeyPathOrName,
  34.                              string dstSubkeyName);

Código
  1. using System.ComponentModel;
  2. using System.Runtime.InteropServices;
  3. using Microsoft.Win32;
  4. using Microsoft.Win32.SafeHandles;
  5.  
  6. using (RegistryKey regKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).
  7.                                        OpenSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadWriteSubTree)) {
  8.  
  9.    int result = NativeMethods.RegRenameKey(regKey.Handle, "Old SubKey Name", "New SubKey Name");
  10.  
  11.    if ((result != 0)) {
  12.        throw new Win32Exception(result);
  13.    }
  14.  
  15. }

Una vez aclarado y resuelto el problema, cabe mencionar un par de cosas más:

1. Estás utilizando una función indocumentada la cual a su vez está llamando intérnamente a la función NtRenameKey la cual está marcada o es propensa a ser eliminada de la API de Windows:
...Por ende, esto que intentas hacer no sería recomendable hacerlo, vaya. Si hay funciones/exports "ocultas" o indocumentadas es por que el propósito de su uso suele estar reservado al sistema operativo, no al usuario final de la API.

2. Evidéntemente estando en una plataforma tan completa y sofisticada como es .NET y su librería de clases, no es necesario recurrir a la escritura de código no administrado e inseguro para poder renombrar una clave de registro; puedes utilizar los métodos que expone la clase Microsoft.Win32.RegistryKey para hacer un renombramiento (copiar el árbol de la subclave de origen a un lugar de destino, y posteriórmente eliminar la clave de origen). El código resultante quedará más tedioso (muchas más lineas de código), pero te aportará mucho mayor control y versatilidad que lo que estás haciendo ahora mismo.

¡Saludos!
« Última modificación: 27 Marzo 2017, 07:43 por Eleкtro » En línea


Borito30


Desconectado Desconectado

Mensajes: 481


Ver Perfil
Re: Renombrar una clave de registro usando c#
« Respuesta #3 en: 31 Marzo 2017, 23:39 »

Vale hice como dijistes y se creo correctamente.
En línea

Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines