Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: nhaalclkiemr en 22 Marzo 2007, 17:14 pm



Título: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: nhaalclkiemr en 22 Marzo 2007, 17:14 pm
Bien, como no hay sección Bath en este foro lo pongo aki pork servirá para troyanos...

He encontrado por internet una manera de hacer "if exist" a una clave del registro usando los comandos "reg export","find" y "for" en ese orden. Primero exporta el registro a un archivo, en ese archivo busca si existe un valor, si existe establece con el "for" la variable 1 o 0 segun sea falso o verdadero k existe...

Pues bien...yo quiero hacer algo parecido, en vez de buscar si una clave existe o no, lo que quiero es poder guardar en una variable el valor de una clave del registro.
Supongo que se podrá hacer de manera parecida a lo anterior...por eso lo pongo...sin embargo yo no se usar bien el comando "for" por eso quería que me ayudarais...

En otro lado me dieron este bath:

Código:
reg export "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" temp.tmp
type temp.tmp | find "shell" > cadena_encontrada.tmp
for /f %%A IN (cadena_encontrada.tmp) DO set VARIABLE=%%A

Pero a mi no me funcionó, si alguien pudiera corregirlo o sabe como hacerlo lo agradecería mucho.

Gracias y un saludo ;) ;) ;) ;)


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: sirdarckcat en 27 Marzo 2007, 02:35 am
escribe en la consola..
REG /?

eso saca todos los argumentos que acepta REG.. sino
www.computerhope.com/reg.htm

Saludos!!


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: nhaalclkiemr en 30 Marzo 2007, 16:24 pm
No me entiendes, ya se usar el reg. Lo que quiero es ex`prtar el registro a un archivo, despues busco una clave en concreto, y almaceno en una variable  el valor de esa clave

esto lo hago pork no existe ningun parametro para reg que te permita exportar el valor de una clave.

un saludo ;)


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: sirdarckcat en 30 Marzo 2007, 23:10 pm
claro que si existe.. no te conteste en ese mmento porque no tenia tiempo, pero si te fijas en los links que puse, hubieras visto.. xD

reg export HKLM\Software\Microsoft\Windows\CurrentVersion\Run "c:\ex.reg"

eso funciona en WIN XP SP1, SP2 Pro y Home


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: ne0x en 31 Marzo 2007, 20:40 pm
Na, que sigues sin entender...

Es cojer el valor de una cadena y guardarlo en una variable.


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: sirdarckcat en 1 Abril 2007, 02:51 am
tu sigues sin entender..
de ahi con un for lo sacas..


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: ne0x en 1 Abril 2007, 12:00 pm
Si, con el FOR saco la variable:

"nombre_de_cadena"="valor_cadena"

Hago un set variable=%variable:"=%

Y sale asi:

nombre_de_cadena=valor_cadena

Ahhh !! se me acaba de ocurrir un metodo para sacar solo lo que hay a la derecha del igual.

En un bucle cojemos y quitamos el primer caracter, si el caracter que hemos quitado es un "=" paramos, y si no quitamos el segundo caracter y hacemos lo mismo.

Entonces sacamos solo la parte que hay a la derecha del " = "


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: nhaalclkiemr en 2 Abril 2007, 21:09 pm
A ver, la idea es esa:

Imaginaros que quiero guardar el valor de la clave "amd_dc_opt" que está en "HKLM\Software\Microsoft\Windows\CurrentVersion\Run". El valor es "C:\Archivos de programa\AMD\Dual-Core Optimizer\amd_dc_opt.exe"
Todo esto sin las comillas claro...

-Primero con reg export guardo en un archivo de texto plano las entradas por ejemplo de "HKLM\Software\Microsoft\Windows\CurrentVersion\Run"  Eso lo se hacer.

Código:
reg export "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" "temp.tmp"

-Ahora tengo un archivo así:

Código:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]
"nod32kui"="\"C:\\Archivos de programa\\Eset\\nod32kui.exe\" /WAITSERVICE"
"Gainward"="C:\\Archivos de programa\\XpertVision\\TBPanel.exe /A"
"NvCplDaemon"="RUNDLL32.EXE C:\\WINDOWS\\system32\\NvCpl.dll,NvStartup"
"NvMediaCenter"="RUNDLL32.EXE C:\\WINDOWS\\system32\\NvMcTray.dll,NvTaskbarInit"
"amd_dc_opt"="C:\\Archivos de programa\\AMD\\Dual-Core Optimizer\\amd_dc_opt.exe"

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\OptionalComponents]

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\OptionalComponents\IMAIL]
"Installed"="1"

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\OptionalComponents\MAPI]
"Installed"="1"
"NoChange"="1"

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\OptionalComponents\MSFS]
"Installed"="1"


-Ahora con el FOR, el TYPE y el FIND busco la linea llamada "amd_dc_opt"

Código:
type temp.tmp | find "amd_dc_opt" > cadena_encontrada.tmp
for /f %%A IN (cadena_encontrada.tmp) DO set VARIABLE=%%A
del /S /F /Q /A:- temp.tmp


-Pues ahora tengo la linea :

Código:
"amd_dc_opt"="C:\\Archivos de programa\\AMD\\Dual-Core Optimizer\\amd_dc_opt.exe"

Eso lo tengo en un archivo "cadena_encontrada.tmp" y en una variable %%A

Ahora habría que hacer lo que dice ne0x...quedarse solo con el valor y quitar el "amd_dc_opt"=



Ahora los principales problemas son:

-Aunke consigamos quedarnos solo con el valor, los simbolos \ aparecen como \\

-Si hay algun espacio, la variable solo coje hasta el espacio, prové a poner comillas pero no se donde las tengo que poner...

Por ejemplo, en el ejemplo anterior que puse yo la linea teorica que es %%A es:

Código:
"amd_dc_opt"="C:\\Archivos de programa\\AMD\\Dual-Core Optimizer\\amd_dc_opt.exe"

pero en la realidad la variable será:

Código:
"amd_dc_opt"="C:\\Archivos



Bueno, espero que me podais ayudar, gracias y un saludo ;) ;)


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: ne0x en 3 Abril 2007, 00:10 am
Y si ponemos "%%A" ??.


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: nhaalclkiemr en 4 Abril 2007, 16:00 pm
Ya lo prové pero no funciona...

Si pones "%%A" despues de FOR /F así:

Código:
reg export "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" "temp.tmp"
type temp.tmp | find "amd_dc_opt" > cadena_encontrada.tmp
for /f "%%A" IN (cadena_encontrada.tmp) DO set a=%%A
del /S /F /Q /A:- temp.tmp

da un error:

Código:
No se esperaba IN en este momento.


Si pones "%%A" en SET a="%%A" asi:

Código:
reg export "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" "temp.tmp"
type temp.tmp | find "amd_dc_opt" > cadena_encontrada.tmp
for /f %%A IN (cadena_encontrada.tmp) DO set a="%%A"
del /S /F /Q /A:- temp.tmp

lo que va a pasar es que la salida en vez de ser asi:

Código:
"amd_dc_opt"="C:\\Archivos

va a ser así:

Código:
""amd_dc_opt"="C:\\Archivos"

Yo pienso que usando delims, tokens, etc... que se podría hacer, pero no se utilizar esos parámetros del FOR



Pues aun nos queda pendiente el tema ese de los espacios y tambien el tema de transformar las barras dobles \\ en una barra sola \

Weno, pues haber si alguien me puede ayudar...

Un saludo ;) ;)


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: nhaalclkiemr en 9 Abril 2007, 22:31 pm
¿¿Alguien puede ayudar con el problema de convertir las barras dobles // en barras simples / y el problema de los espacios??
 :huh: :huh: :huh:

Venga, espero vuestra ayuda, quería resolver el tema principal de este post pronto...

Venga, saludos ;) ;)


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: sirdarckcat en 10 Abril 2007, 02:07 am
Código:
@echo off
FOR /F "tokens=2* delims==" %%I IN (reg.reg) DO (
call:PARSEA %%I
)
goto:EOF
:PARSEA
SET PP="%~1"
SET PP=%PP:\\=\%
SET PP=%PP:"=%
if "%PP:~-14%"=="amd_dc_opt.exe" (
echo La cadena encontrada fue: "%PP%"
)


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: nhaalclkiemr en 10 Abril 2007, 20:23 pm
Magnifico Sirdarckat, ahora solo me queda una pregunta...

¿A k viene este IF?:

Código:
if "%PP:~-14%"=="amd_dc_opt.exe" (
echo La cadena encontrada fue: "%PP%"
)

No se para que sirve...

He hecho este BATCH gracias a tu ayuda y pienso que funciona correctamente:

Código:
@echo off
reg export "RUTA_CLAVE" "temp.tmp"
if not %errorlevel%==0 goto error
type temp.tmp | find "NOMBRE_CLAVE" > cadena_encontrada.tmp
del /S /F /Q /A:- temp.tmp
FOR /F "tokens=2* delims==" %%I IN (cadena_encontrada.tmp) DO set var="%%I"
if "%var%"=="" goto error
FOR /F "tokens=2* delims==" %%I IN (cadena_encontrada.tmp) DO (
call:PARSEA %%I
)
goto :EOF
:PARSEA
del /S /F /Q /A:- cadena_encontrada.tmp
SET PP="%~1"
SET PP=%PP:\\=\%
SET PP=%PP:"=%
::aqui va el bat
exit
:error
::aqui va el bat de error en caso de que la RUTA_CLAVE o NOMBRE_CLAVE no exista
exit

El valor de "NOMBRE_CLAVE" queda perfectamente definido en la variable %PP% y ademas, le he añadido un control de errores que en caso de que "NOMBRE_CLAVE" o "RUTA_CLAVE" no existan te lleva a la etiqueta :error en la que puedes poner un BATCH diferente.

Por ejemplo, en nuestro caso sería:

Código:
@echo off
reg export "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" "temp.tmp"
if not %errorlevel%==0 goto error
type temp.tmp | find "amd_dc_opt" > cadena_encontrada.tmp
del /S /F /Q /A:- temp.tmp
FOR /F "tokens=2* delims==" %%I IN (cadena_encontrada.tmp) DO set var="%%I"
if "%var%"=="" goto error
FOR /F "tokens=2* delims==" %%I IN (cadena_encontrada.tmp) DO (
call:PARSEA %%I
)
goto :EOF
:PARSEA
del /S /F /Q /A:- cadena_encontrada.tmp
SET PP="%~1"
SET PP=%PP:\\=\%
SET PP=%PP:"=%
echo %PP%
exit
:error
del /S /F /Q /A:- cadena_encontrada.tmp
echo Error! La clave buscada no existe
exit

Ahora ya tenemos lo que queremos, pienso que el tema quedo zanjado, gracias ne0x y sobre todo Sirdarckat. :xD :xD

Un saludo ;) ;)


Título: Re: Bath - Guardar en una variable un valor de una clave de registro
Publicado por: sirdarckcat en 10 Abril 2007, 20:40 pm
ahh el if era para que el for parseara el .reg y no tuvieras que hacer el pipe al find..
pero es lo mismo :P

que bien que ya pudiste

Saludos!!