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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema removiendo clave de registro
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema removiendo clave de registro  (Leído 9,246 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Problema removiendo clave de registro
« en: 15 Abril 2016, 15:53 pm »

Código
  1. bool RemoveFromRegistry(bool privileges, LPCWSTR keyName)
  2. {
  3. HKEY hKeyOutput;
  4. HKEY hKeyInput;
  5. DWORD options;
  6. BOOL ret = FALSE;
  7.  
  8. hKeyInput = (privileges) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
  9. options = (arquitecturax64()) ? KEY_ALL_ACCESS | KEY_WOW64_64KEY : KEY_ALL_ACCESS | KEY_WOW64_32KEY;
  10.  
  11. if (RegOpenKeyEx(hKeyInput, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, options, &hKeyOutput) == NO_ERROR)
  12. {
  13. //options = (arquitecturax64()) ? KEY_WOW64_64KEY : KEY_WOW64_32KEY;
  14. if (RegDeleteKeyEx(hKeyOutput, keyName, options, NULL) == NO_ERROR)
  15. {
  16. ret = TRUE;
  17. }
  18. RegCloseKey(hKeyInput);
  19. RegCloseKey(hKeyOutput);
  20. }
  21. return ret;
  22. }
  23.  

La clave esta creada y el nombre es el mismo que cuando la creé "pepito", el caso que cuando la voy a eliminar falla el RegDeleteKeyEx y no se porqué, ¿qué puedo estar haciendo mal?.

Saludos.


En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema removiendo clave de registro
« Respuesta #1 en: 15 Abril 2016, 16:54 pm »

¿Qué parte falla?
-¿Entra al if del open?
-¿Comprobaste que la clave abierta es la correcta?
-¿Entra al if del delete?

-En caso de que haya algún error, ¿qué error da GetLastError?


En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Problema removiendo clave de registro
« Respuesta #2 en: 15 Abril 2016, 18:06 pm »

Estoy de acuerdo con que descartes cosas sino dificil
En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Problema removiendo clave de registro
« Respuesta #3 en: 15 Abril 2016, 18:12 pm »

¿Qué parte falla?
-¿Entra al if del open?
-¿Comprobaste que la clave abierta es la correcta?
-¿Entra al if del delete?

-En caso de que haya algún error, ¿qué error da GetLastError?

Lo probé todo lo que dijistes pero no lo puse en el código.

Entra en el if de RegOpenKeyEx pero no en el de RegDeleteKeyEx ya que da error.

También probé a llamar a GetLastError() pero returnaba 0, lo puse justo detrás del if del delete.

Y poco más, la dirección de la clave abierta debe de ser la misma ya que para crearla uso el mismo código para abrirla (el mismo open). No entiendo que puede fallar :/

Con permisos ocurre lo mismo.

Iré mirando, gracias por las respuestas, y a ver si lo encuentro solución.

Saludos.

Edito: Mejor os paso el código con el "debugger" XD:

Código
  1. bool RemoveFromRegistry(bool privileges, LPCWSTR keyName)
  2. {
  3. HKEY hKeyOutput;
  4. HKEY hKeyInput;
  5. DWORD options;
  6. BOOL ret = FALSE;
  7. //poner HKEY_USERS
  8. hKeyInput = (privileges) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
  9. options = (arquitecturax64()) ? KEY_ALL_ACCESS | KEY_WOW64_64KEY : KEY_ALL_ACCESS | KEY_WOW64_32KEY;
  10.  
  11. if (RegOpenKeyEx(hKeyInput, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, options, &hKeyOutput) == NO_ERROR)
  12. {
  13. cout << "hola1";
  14. options = (arquitecturax64()) ? KEY_WOW64_64KEY : KEY_WOW64_32KEY;
  15. if (RegDeleteKeyEx(hKeyOutput, keyName, options, NULL) == NO_ERROR)
  16. {
  17. cout << "hola2";
  18.  
  19. ret = TRUE;
  20. }
  21. RegCloseKey(hKeyInput);
  22. RegCloseKey(hKeyOutput);
  23. cout << GetLastError();
  24. }
  25. cout << "hola3";
  26. return ret;
  27. }
  28.  

Salida:

Citar
hola10hola3
« Última modificación: 15 Abril 2016, 18:14 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema removiendo clave de registro
« Respuesta #4 en: 15 Abril 2016, 21:31 pm »

Prueba a poner GetLastError después del RegDeleteKeyEx. Antes de los RegClsoeKey.
Si sale un error diferente de 0, mira su significado con FormatMessage.

Si sigues sin obtener error, asegúrate que la primera clave es la correcta: antes del Delete, enumera las sub-claves para asegurarte de que existe. Si no quieres enumerar, al menos trata de abrirla.

Abre como administrador, no vaya a ser un error trivial.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Problema removiendo clave de registro
« Respuesta #5 en: 16 Abril 2016, 11:43 am »

Prueba a poner GetLastError después del RegDeleteKeyEx. Antes de los RegClsoeKey.
Si sale un error diferente de 0, mira su significado con FormatMessage.

Si sigues sin obtener error, asegúrate que la primera clave es la correcta: antes del Delete, enumera las sub-claves para asegurarte de que existe. Si no quieres enumerar, al menos trata de abrirla.

Abre como administrador, no vaya a ser un error trivial.

Hola ivancea, gracias por la respuesta.

Se me olvidó mencionar anteriormente que no tiene privilegios la aplicación, pero es que no los debería de necesitar, para crear la clave y leerla en HKEY_CURRENT_USER no necesita privilegios, y para borrarla pues debería de ser igual (ya que también he probado a hacerlo intentandola borrar con privilegios y falla también, luego los privilegios no son el problema).

He probado como dijistes a listar el directorio (hacer un enum RegEnumKeyEx), en este caso para "HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Run" y ha mostrado las claves con éxito incluida la que quiero borrar "pepito" :)

Luego puedo escribir en HKEY_CURRENT_USER con RegSetValueEx y leer sus variables para comprobar si existen con RegGetValue, pero el RegDeleteEx... ni con privilegios ni sin ellos es capaz de borrar en HKEY_CURRENT_USER ni en HKEY_LOCAL_MACHINE.

He probado a llamarla de 3 maneras:

Citar
RegDeleteKeyEx(hKeyOutput, keyName, options, RRF_RT_REG_SZ)
RegDeleteKeyEx(hKeyOutput, keyName, options, REG_SZ)
RegDeleteKeyEx(hKeyOutput, keyName, options, NULL)

Todas sin éxito, la clave creada es de tipo REG_SZ.

Y es que no sé, mirad esta es la funcion que ancla al registro y crea la clave que luego procedemos a borrar, funciona perfectamente:

Código
  1. bool AttachToRegistry(bool privileges, LPCWSTR keyName)
  2. {
  3. WCHAR processPath[MAX_PATH];
  4. HKEY hKeyOutput;
  5. HKEY hKeyInput;
  6. DWORD options;
  7. BOOL ret = FALSE;
  8.  
  9. hKeyInput = (privileges) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
  10. options = (arquitecturax64()) ? KEY_ALL_ACCESS | KEY_WOW64_64KEY : KEY_ALL_ACCESS | KEY_WOW64_32KEY;
  11.  
  12. if (GetModuleFileName(NULL, processPath, MAX_PATH))
  13. {
  14. std::wstring p = L"\"" + std::wstring(processPath) + L"\"";
  15.  
  16. if (RegOpenKeyEx(hKeyInput, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, options, &hKeyOutput) == NO_ERROR)
  17. {
  18. if (RegSetValueEx(hKeyOutput, keyName, NULL, REG_SZ, (LPBYTE)p.c_str(), p.length()*2) == NO_ERROR)
  19. {
  20. ret = TRUE;
  21. }
  22. RegCloseKey(hKeyInput);
  23. RegCloseKey(hKeyOutput);
  24. }
  25. }
  26.  
  27. return ret;
  28. }
  29.  

Como la de borrar es una copia de la misma, ha diferencia de que en vez de llamar a RegSetValueEx llama a RegDeleteKeyEx, probaré con RegDeleteKey y os cuento.

Saludos.

Edito: Acabo de probar con RegDeleteKey el resultado es el mismo, no funciona ni con ni sin permisos, no hay manera de borrarla, ¿algún hook?.

En el main mismo:

Código
  1. if (RegDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run\\pepito") == ERROR_SUCCESS)
  2. {
  3. cout << "Borrado";
  4. }
  5. cout << GetLastError();
  6.  

Muestra 0, es decir no borra ni entra en el if y no detecta error.

Probaré con un tercer método que si espero que funcione, con "system", ahora os digo.

Con batch da error:, con y sin permisos:

Código:
Código
  1. system("REG DELETE HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\pepito");

"¿Desea eliminar permanentemente la clave del Registro HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\pepito (Sí/No)? si
ERROR: El sistema no ha podido encontrar la clave o el valor del Registro
especificados."

Me dice que no la encuentra, pero bien que aparece en regedit y al hacer el enum. :"DDD
« Última modificación: 16 Abril 2016, 11:54 am por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema removiendo clave de registro
« Respuesta #6 en: 16 Abril 2016, 11:51 am »

Utiliza FormatMessage para ver el error que lanza. Guarda el retorno en una variable en vez de ponerlo directamente en wl if.

Y recuerda que el último parámetro de RegDeleteKeyEx es reservado y debe ser NULL.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Problema removiendo clave de registro
« Respuesta #7 en: 16 Abril 2016, 12:05 pm »

Utiliza FormatMessage para ver el error que lanza. Guarda el retorno en una variable en vez de ponerlo directamente en wl if.

Y recuerda que el último parámetro de RegDeleteKeyEx es reservado y debe ser NULL.

Wow sorprendente resultado, desconocía la función FormatMessage.

Código
  1. LSTATUS l = RegDeleteKeyW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run\\pepito");
  2. LPTSTR errorText = NULL;
  3.  
  4. FormatMessageW(
  5. // use system message tables to retrieve error text
  6. FORMAT_MESSAGE_FROM_SYSTEM
  7. // allocate buffer on local heap for error text
  8. | FORMAT_MESSAGE_ALLOCATE_BUFFER
  9. // Important! will fail otherwise, since we're not
  10. // (and CANNOT) pass insertion parameters
  11. | FORMAT_MESSAGE_IGNORE_INSERTS,
  12. NULL,    // unused with FORMAT_MESSAGE_FROM_SYSTEM
  13. l,
  14. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  15. (LPTSTR)&errorText,  // output
  16. 0, // minimum size for output buffer
  17. NULL);   // arguments - see note
  18.  
  19. if (NULL != errorText)
  20. {
  21. // ... do something with the string `errorText` - log it, display it to the user, etc.
  22. wcout << errorText;
  23. // release memory allocated by FormatMessage()
  24. LocalFree(errorText);
  25. errorText = NULL;
  26. }
  27.  

Salida: "El sistema no puede encontrar el archivo especificado." Con y sin permisos no lo encuentra. Y yo me pregunto, ¿como no lo encuentra si esta todo bien? ¿quizás porque use unicode?, he probado también a eliminar otra clave del mismo directorio "Spotify", y el resultado ha sido el mismo, que no lo encuentra. :"D
« Última modificación: 16 Abril 2016, 12:12 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema removiendo clave de registro
« Respuesta #8 en: 16 Abril 2016, 12:19 pm »

Si tal, prueba a borrar con RegDeleteTree.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Problema removiendo clave de registro
« Respuesta #9 en: 16 Abril 2016, 12:33 pm »

Si tal, prueba a borrar con RegDeleteTree.

Mismo resultado:

Código
  1. if (RegDeleteTree(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run\\pepito") == NO_ERROR){
  2. cout << "conseguido";
  3. return true;
  4. }
  5.  

Caso perdido, que se quede con el registro, se le regalo :"D
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
intruducir clave en el registro « 1 2 »
Programación Visual Basic
d(-_-)b 12 4,842 Último mensaje 9 Julio 2007, 20:52 pm
por fitu
Ver clave de registro desde el CMD
Scripting
Dany3j 7 11,646 Último mensaje 15 Agosto 2011, 21:34 pm
por Dany3j
Modificar clave de registro.-
Windows
Edunet98 4 4,630 Último mensaje 14 Octubre 2012, 14:19 pm
por Edunet98
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines