Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 15 Abril 2016, 15:53 pm



Título: Problema removiendo clave de registro
Publicado por: Kaxperday 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.


Título: Re: Problema removiendo clave de registro
Publicado por: ivancea96 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?


Título: Re: Problema removiendo clave de registro
Publicado por: HardForo en 15 Abril 2016, 18:06 pm
Estoy de acuerdo con que descartes cosas sino dificil


Título: Re: Problema removiendo clave de registro
Publicado por: Kaxperday 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


Título: Re: Problema removiendo clave de registro
Publicado por: ivancea96 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.


Título: Re: Problema removiendo clave de registro
Publicado por: Kaxperday 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


Título: Re: Problema removiendo clave de registro
Publicado por: ivancea96 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.


Título: Re: Problema removiendo clave de registro
Publicado por: Kaxperday 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


Título: Re: Problema removiendo clave de registro
Publicado por: ivancea96 en 16 Abril 2016, 12:19 pm
Si tal, prueba a borrar con RegDeleteTree.


Título: Re: Problema removiendo clave de registro
Publicado por: Kaxperday 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


Título: Re: Problema removiendo clave de registro
Publicado por: ivancea96 en 16 Abril 2016, 12:39 pm
¿Con regedit puedes?


Título: Re: Problema removiendo clave de registro
Publicado por: Kaxperday en 16 Abril 2016, 12:46 pm
¿Con regedit puedes?

Sí XD, pero solo directamente desde ella, desde su interfaz gráfica.

Código
  1. C:\WINDOWS\system32>reg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\pepito
  2. ¿Desea eliminar permanentemente la clave del Registro HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\pepito (Sí/No)? si
  3. ERROR: El sistema no ha podido encontrar la clave o el valor del Registro
  4. especificados.
  5.  

Es que es raro de cojones, porque si no la encuentra antes de pedirme confirmación me dice "ERROR: nombre de clave no válido."


Título: Re: Problema removiendo clave de registro
Publicado por: ivancea96 en 16 Abril 2016, 13:15 pm
¿Probaste con ambas opciones, KEY_WOW64_64KEY y KEY_WOW64_32KEY en RegDeleteKeyEx?
No vaya a ser una clave redirigida.


Título: Re: Problema removiendo clave de registro
Publicado por: Kaxperday en 16 Abril 2016, 16:25 pm
¿Probaste con ambas opciones, KEY_WOW64_64KEY y KEY_WOW64_32KEY en RegDeleteKeyEx?
No vaya a ser una clave redirigida.

También XD, ¿podéis probar vosotros a ver cual es el resultado, funciona o es cosa de mi ordenador? con mi funcion de escritura que he puesto y la de borrado bastará para hacer las pruebas. Luego es abrir regedit y comprobar el registro en cuestión, la función de escritura añadirá al registro el nombre del ejecutable que ejecuta el código, solo hay que pasarla un nombre para la clave, y privilegios ponedlos a false.

De todas maneras, seguiré indagando dónde puede estar el error, porque no hay explicación alguna para que falle, dice que "El sistema no puede encontrar el archivo especificado." WTF.

Saludos y gracias socio.


Título: Re: Problema removiendo clave de registro
Publicado por: ivancea96 en 16 Abril 2016, 16:58 pm
El único problema que tuve con el registro fue bucles infinitos al dumpear en C++ por las claves redirigidas.

Por lo demás...

¿Solo es <esa> sub-clave, o es cualquiera en Run?
Si es cualquier ane Run... ¿te funciona para claves en otros lugares?


Título: Re: Problema removiendo clave de registro
Publicado por: Kaxperday en 17 Abril 2016, 16:21 pm
El único problema que tuve con el registro fue bucles infinitos al dumpear en C++ por las claves redirigidas.

Por lo demás...

¿Solo es <esa> sub-clave, o es cualquiera en Run?
Si es cualquier ane Run... ¿te funciona para claves en otros lugares?

Hola ivancea gracias por la respuesta y ayuda como siempre ;)

Pues pasa para todas las de Run y a las de otros directorios también parece, incluso desde la terminal da errores al borrar para otros directorios:

Citar
C:\Users\Usuario>reg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\Spotify
¿Desea eliminar permanentemente la clave del Registro HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\Spotify (Sí/No)? si
ERROR: El sistema no ha podido encontrar la clave o el valor del Registro
especificados.

Citar
C:\Users\Usuario>reg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SettingSync\UpgradedProfile
¿Desea eliminar permanentemente la clave del Registro HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SettingSync\UpgradedProfile (Sí/No)? si
ERROR: El sistema no ha podido encontrar la clave o el valor del Registro
especificados.

Incluso como administrador no me deja borrar las de otros directorios:

Citar
C:\WINDOWS\system32>reg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SettingSync\UpgradedProfile
¿Desea eliminar permanentemente la clave del Registro HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SettingSync\UpgradedProfile (Sí/No)? si
ERROR: El sistema no ha podido encontrar la clave o el valor del Registro
especificados.

Citar
C:\WINDOWS\System32>reg delete HKEY_CURRENT_USER\Environment\PT6HOME
¿Desea eliminar permanentemente la clave del Registro HKEY_CURRENT_USER\Environment\PT6HOME (Sí/No)? SI
ERROR: El sistema no ha podido encontrar la clave o el valor del Registro
especificados.

Incluso fuera de HKCU:

Citar
C:\WINDOWS\system32>reg delete HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip\Path
¿Desea eliminar permanentemente la clave del Registro HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip\Path (Sí/No)? si
ERROR: El sistema no ha podido encontrar la clave o el valor del Registro
especificados.

Resumen: No puedo borrar aparentemente NINGUN registro desde terminal, ni desde el programa, ni con privilegios ni sin ellos, recibo siempre el mismo error:

"ERROR: El sistema no ha podido encontrar la clave o el valor del Registro
especificados."

Eso si escribir en el registro siempre deja con y sin permisos sin problema con el terminal y con el programa.

Citar
....>REG ADD HKEY_CURRENT_USER\SOFTWARE\7-Zip /f /v EnableLUA /t REG_SZ /d 0
Operacion realizada correctamente.

Será cosa del ordenador viruses y demás seguramente..

El unico programa que es capaz de cerrarlo es regedit con permisos de administrador, me pregunto si al poner "REG" en el terminal estoy llamando a regedit, porque sino es así quizás ejecutandolo con los parametros de borrado y con privilegios sea capaz de borrarlo el desde el programa, pero vamos.

Saludos.


Título: Re: Problema removiendo clave de registro
Publicado por: HardForo en 17 Abril 2016, 16:33 pm
Quizas... podrias probar en una maquina virtual con otra version de Windows con un registro mas pequeño "de prueba" a ver si te pasa lo mismo (por si tu registro tiene alguna cosa "rara")


Título: Re: Problema removiendo clave de registro
Publicado por: Kaxperday en 18 Abril 2016, 00:32 am
Quizas... podrias probar en una maquina virtual con otra version de Windows con un registro mas pequeño "de prueba" a ver si te pasa lo mismo (por si tu registro tiene alguna cosa "rara")

Eso tenía pensado hacer, y lo he hecho.

En la máquina virtual con otro windows 10 (ya que el win7 en la virtualbox me va petadísimo).

Y el resultado para mi sorpresa ES EL MISMO.

Te deja crear claves pero no eliminarlas, y eso tiene sentido pues si vamos a el administrador de tareas en la pestaña "inicio" podemos deshabilitar un programa del inicio, pero sin embargo su clave persiste y no se borra. Para poder reestablecernos, debemos eliminar la clave y luego crearla, de esa manera nuestro programa estará habilitado de nuevo, luego creo que es por seguridad.

Saludos.