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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  No me lee el valor
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No me lee el valor  (Leído 795 veces)
Invader-X

Desconectado Desconectado

Mensajes: 4


Ver Perfil
No me lee el valor
« en: 16 Noviembre 2024, 19:29 pm »

Hola a todos,

Me inicié hace poco con C++ y estoy estudiando las lecturas del registro. Tengo el siguiente códio:

Código:
#include <iostream>
#include <windows.h>

int main() {
    HKEY Identificador;
    LPCWSTR subclave = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
    LPCWSTR valor = L"Probando";
    wchar_t buffer[300];
    DWORD bufferSize = sizeof(buffer);

 
    if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, subclave, 0, KEY_READ, &Identificador) == ERROR_SUCCESS) {

        if (RegQueryValueExW(Identificador, valor, NULL, NULL, (LPBYTE)buffer, &bufferSize) == ERROR_SUCCESS) {
            std::wcout << L"Datos Clave: " << buffer << std::endl;
        } else {
            std::cerr << "Error al leer el valor." << std::endl;
        }
        RegCloseKey(Identificador);
    } else {
        std::cerr << "Error al abrir la clave del registro." << std::endl;
    }
std::cin.get();
    return 0;
}

La clave Probando la he creado yo para investigar, conteniendo de datos una ruta. La ruta existe, el valor también y los datos también, además de que estoy ejecutando el programa como administrador. Sin Embargo, me pone que hay un error leyendo el valor, porque me lleva a la cláusula de "Error al leer el valor" (La tuve que poner porque no sabía dónde estaba el error). ¿Me podríais decir qué estoy haciendo mal?. También de paso preguntar cómo puedo pasarle un valor que no sea reg_sz, si no que pueda ser cualquiera y lo pueda leer igualmente, me gustaría poder identificar cualquier tipo que haya, ya sea reg_sz, regExpand_sz, Dowrd...

Muchas gracias por adelantado.


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.964


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: No me lee el valor
« Respuesta #1 en: 16 Noviembre 2024, 20:00 pm »

¿Estas ejecutando un programa de 32 bits en un S.O. de 64 bits por casualidad? Si es asi las claves estan redirigidas ...

https://learn.microsoft.com/en-us/windows/win32/winprog64/registry-redirector

Opciones: escribir el valor Probando en HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run, usar KEY_READ | KEY_WOW64_64KEY al abrir la clave o generar un ejecutable de 64 bits.

https://learn.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regqueryvalueexa

El cuarto parametro de RegQueryValueExW permite averiguar que tipo de valor es.


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Invader-X

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: No me lee el valor
« Respuesta #2 en: 16 Noviembre 2024, 20:19 pm »

¿Estas ejecutando un programa de 32 bits en un S.O. de 64 bits por casualidad? Si es asi las claves estan redirigidas ...

https://learn.microsoft.com/en-us/windows/win32/winprog64/registry-redirector

Opciones: escribir el valor Probando en HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run, usar KEY_READ | KEY_WOW64_64KEY al abrir la clave o generar un ejecutable de 64 bits.

https://learn.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regqueryvalueexa

El cuarto parametro de RegQueryValueExW permite averiguar que tipo de valor es.

Hola Eternal Idol,

Posiblemente estoy usando los bits intercambiados, nunca he probado C++, sólo he usado el visual studio para html y css. Comentarte que he puesto la ruta con el wow6432Node y me marca el mismo error, que no se puede acceder al valor.

Te paso el code aunque creo que da error una parte que me has dicho y que seguramente yo habré interpretado mal:

Código:
#include <iostream>
#include <windows.h>

int main() {
    HKEY Identificador;
    LPCWSTR subclave = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
    LPCWSTR valor = L"Probando";
    wchar_t buffer[600];
    DWORD bufferSize = sizeof(buffer);

  
    if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, subclave, 0, KEY_READ | KEY_WOW64_64KEY, &Identificador) == ERROR_SUCCESS) {

        if (RegQueryValueExW(Identificador, valor, NULL, NULL, (LPBYTE)buffer, &bufferSize) == ERROR_SUCCESS) {
            std::wcout << L"Datos Clave: " << buffer << std::endl;
        } else {
            std::cerr << "Error al leer el valor." << std::endl;
        }
        RegCloseKey(Identificador);
    } else {
        std::cerr << "Error al abrir la clave del registro." << std::endl;
    }
std::cin.get();
    return 0;
}

El error me lo marca aquí: KEY_WOW64_64KEY.

gracias por la paciencia y la molestia que te tomas en responder.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.964


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: No me lee el valor
« Respuesta #3 en: 16 Noviembre 2024, 20:37 pm »

Comentarte que he puesto la ruta con el wow6432Node y me marca el mismo error, que no se puede acceder al valor.

¿Te referis a usar KEY_WOW64_64KEY?

El error me lo marca aquí: KEY_WOW64_64KEY.

A mi tu ultimo codigo me compila y me funciona bien, si te da un error al compilar vas a tener que mostrar el output del compilador.

Y si te compila, cambia el codigo para saber que valor retorna RegQueryValueExW, sabemos que no es ERROR_SUCCESS solamente.

PD. En el Adminstrador de tareas podes ver la arquitectura de tu programa (deberia ser x86 o x64).
« Última modificación: 16 Noviembre 2024, 20:39 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Invader-X

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: No me lee el valor
« Respuesta #4 en: 16 Noviembre 2024, 20:58 pm »

¿Te referis a usar KEY_WOW64_64KEY?

A mi tu ultimo codigo me compila y me funciona bien, si te da un error al compilar vas a tener que mostrar el output del compilador.

Y si te compila, cambia el codigo para saber que valor retorna RegQueryValueExW, sabemos que no es ERROR_SUCCESS solamente.

PD. En el Adminstrador de tareas podes ver la arquitectura de tu programa (deberia ser x86 o x64).

Hola de nuevo Eternal Idol,

Con respecto a tu primera pregunta, me refería a poner la ruta así:

Código:
LPCWSTR subclave = L"SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run";

Te muestro el error que me sale con el último código:

Código:
error: 'KEY_WOW64_64KEY' was not declared in this scope
     if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, subclave, 0, KEY_READ | KEY_WOW64_64KEY, &Identificador) == ERROR_SUCCESS) {
                                                                   ^~~~~~~~~~~~~~~

Y respondiendo a tu otra pregunta, sí, mi ordenador es de 64 bits.

Intentaría mostrarte la salida del error pero al marcarme el error ese que te escribí no puedo compilarlo y capturar la salida que me genera, así que no sé muy bien cómo proceder debido al error y ahora manejo el último código porque es con el que estamos trabajando, para no liar más el tema.

gracias nuevamente.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.964


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: No me lee el valor
« Respuesta #5 en: 16 Noviembre 2024, 21:09 pm »

Con respecto a tu primera pregunta, me refería a poner la ruta así:

Código:
LPCWSTR subclave = L"SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run";

Claro eso no tiene mucho sentido, ya estabas leyendo desde ahi, lo que podes hacer es ir al Editor del registro y crear el valor Probando en esa clave.

Te muestro el error que me sale con el último código:
Código:
error: 'KEY_WOW64_64KEY' was not declared in this scope
     if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, subclave, 0, KEY_READ | KEY_WOW64_64KEY, &Identificador) == ERROR_SUCCESS) {
                                                                   ^~~~~~~~~~~~~~~

¿Que compilador estas usando? Con el VC++ me compila bien ...



Podes cambiar KEY_WOW64_64KEY por 0x100 para salir del paso.
« Última modificación: 16 Noviembre 2024, 22:27 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Invader-X

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: No me lee el valor
« Respuesta #6 en: 17 Noviembre 2024, 16:35 pm »

Claro eso no tiene mucho sentido, ya estabas leyendo desde ahi, lo que podes hacer es ir al Editor del registro y crear el valor Probando en esa clave.

¿Que compilador estas usando? Con el VC++ me compila bien ...



Podes cambiar KEY_WOW64_64KEY por 0x100 para salir del paso.

Hola de nuevo,

He probado lo que dijiste y poner el valor "Probando" en wow6432Node, efectivamente, en esa clave funciona sin problemas y al quitarle el wow6432node y poner la clave sin ello sigue leyendo el mismo resultado. Intuyo que lo estoy compilando a 32 bits en un sistema de 64 y por eso no me está leyendo la normal sin el wow6432Node. Estoy usando Mingw (g++), esta versión: MinGW - Minimalist GNU for Windows. Imagino que si instalo otro compilador de 64 bits la ruta normal me la leerá y para leer la otra tendría que usar la otra clave.

Así que en teoría, ¿Lo que está fallando es el compilador y lo está compilando todo a 32 bits y por eso no lee la clave sin el wow6432node? ¿Me recomiendas alguno más actualizado y de 64 bits?.

gracias nuevamente.

En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.964


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: No me lee el valor
« Respuesta #7 en: 17 Noviembre 2024, 17:20 pm »

Siempre prefiero usar las herramientas del fabricante del S.O., ya sea Xcode para macOS o en este caso Visual Studio (Visual C++) para Windows.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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