Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: byebye en 1 Noviembre 2003, 01:32 am



Título: Manejo basico del registro.
Publicado por: byebye en 1 Noviembre 2003, 01:32 am
Manejo basico del registro

Como muchas veces se preguntan como leer/borrar/crear valores del registro voy a explicar lo basico con pequeños ejemplos para que se entienda mejor.Antes de escribir/leer cualquier dato se tiene que conseguir un manejador (handle), RegOpenKey nos da este manejador.

LONG RegOpenKey(
    HKEY hKey,   
    LPCTSTR lpSubKey,   
    PHKEY phkResult );

hKey: identifica que sección queremos abrir, estos valores son:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

lpSubKey: sub clave. es decir si queremos abrir  HKEY_LOCAL_MACHINE/SOFTWARE/prueba, lpSubKey seria  SOFTWARE/Prueba.

phkResult: aqui se nos da el manejador para hacer referencia siempre a la clave abierta, hasta que la cerremos.

si la clave no existe se tiene que crear (como es logico jeje) con RegCreateKey, los parametros son igual que en la funcion anterior. un ejemplo podria ser esto:
Código:
Function crear() As Long
'si existe devuleve 1 de lo contrario 0
RegOpenKey HKEY_LOCAL_MACHINE, prueba, h
If h Then
crear = 1
Else
RegCreateKey HKEY_LOCAL_MACHINE, prueba, h
crear = 0
End If
End Function

como ya dice el comentario si existe devuleve 1 si no existe devuelve 0, que en este caso da lo mismo pq si no existe la crea y si existe la abre, no se toma el valor de la funcion para si existe hacer una cosa u otra pero bueno creo que se entiende. HKEY_LOCAL_MACHINE es una constante y prueba otra para hacer los ejemplos mas sencillos. en h tendremos el manejador.

Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const prueba = "SOFTWARE\Pruebas"      'esta es la clave sobre la que se escribira etc

Escribir un valor alfanumerico con RegSetValueEx:

LONG RegSetValueEx(
    HKEY hKey,   
    LPCTSTR lpValueName,   
    DWORD Reserved,   
    DWORD dwType,   
    CONST BYTE *lpData,   
    DWORD cbData  );

hKey: sera el manejador, en este caso el que tenemos en h
lpValueName: es el nombre del valor
Reserved: a 0
dwType: tipo de dato que se escribe/lee, para ver los diferentes tipos de datos darle un ojo a la ayuda.
lpData: los datos que queremos escribir.
cbData: el tamaño de los datos

una vez claros los parametros el ejemplo quedaria de esta forma:
Código:
Function valorS(nombre As String, valor As String) As Long
valorS = RegSetValueEx(h, nombre, 0, REG_SZ, ByVal valor, Len(valor))
End Function

nombre sera el nombre que contendra el valor, es decir si tenemos abierto HKEY_LOCAL_MACHINE/SOFTWARE/prueba y queremos escribir el valor "saludo" y que este contenga "hola", llamaremos a la funcion de esta forma. valorS("saludo","hola"). si la funcion devuleve 0 es que no hay ningun error, si no es 0 esta claro lo que pasa.

Los otros tipos de datos no voy a explicarlos, ya que es mas de lo mismo. con dar un ojo a la ayuda se aclaran las dudas y si no se preguntan en el foro.


Leer un dato alfanumerico con RegQueryValueEx:

LONG RegQueryValueEx(
    HKEY hKey,   
    LPTSTR lpValueName,   
    LPDWORD lpReserved,   
    LPDWORD lpType,   
    LPBYTE lpData,   
    LPDWORD lpcbData);

creo que no hace falta explicar los parametros, es lo msimo que la funcion anterior. el unico cambio es que antes lpData era lo que queriamos escribir y ahora sera el valor leido. ejemplo:

Código:
Function leerS(nombre As String) As Long
buffer = String(256, 0)
leerS = RegQueryValueEx(h, nombre, 0, REG_SZ, ByVal buffer, Len(buffer))
End Function

pues ya tenemos en buffer el contenido de la clave que queremos leer, el retorno es lo mismo que antes 0 si no hay error.

Borrar un valor con RegDeleteValue:

LONG RegDeleteValue(
    HKEY hKey,   
    LPCTSTR lpValueName);

Los parametros creo que estan claros, hKey ya esta mas que explicado y lpValueName sera el nombre del valor a borrar

Código:
Function borrarV(nombre As String) As Integer
borrarV = RegDeleteValue(h, nombre)
End Function

si queremos borrar el valor "saludo" que contenia "hola" usaremos la funcion de esta forma. borrarV("saludo").

Borrar la clave completamente con RegDeleteKey:

LONG RegDeleteKey(
    HKEY hKey,
    LPCTSTR lpSubKey);

Aqui no hay mucho mas que explicar, igual que al crearla nos pedia una sub clave ahora nos la pide para borrarla, siendo en este caso "prueba". ejemplo:

Código:
Function borrarC(nombre As String) As Long
RegOpenKey HKEY_LOCAL_MACHINE, "SOFTWARE", h
borrarC = RegDeleteKey(h, nombre)
End Function

ahora se abre simplemente "SOFTWARE" sin "prueba" pq va a ser esta la que borremos y tendremos que pasarla como sub clave.

despues de leer/escribir o lo que sea se cierra el manejador con RegCloseKey:

LONG RegCloseKey(
    HKEY hKey);

   y los paremtros no hace falta explicarlos. esta todo separado en pequeñas funciones para que se entienda bien y no hacer una solo funcion y marear la perdiz. todas las funciones estan probadas ya que antes de ponerme a escribir esto las he tenido que hacer y funcionan bien. si hay algun error duda o lo que sea pues para eso esta el foro.

constantes y demas usadas en los ejemplos:

Código:
Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long         ' Note that if you declare the lpData parameter as String, you must pass it By Value.
Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long         ' Note that if you declare the lpData parameter as String, you must pass it By Value.
Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const prueba = "SOFTWARE\Pruebas"
Public Const REG_SZ = 1



Título: Re:Manejo basico del registro.
Publicado por: ø:|The_hacker|:ø en 3 Diciembre 2003, 15:23 pm
 ;D Cuando reproduzco los ejemplos con HKEY_LOCAL_MACHINE sirve perfectamente pero cuando quiero cambiar de clave por ejemplo por HKEY_CURRENT_USER no hace nada en el registro,

¿HKEY_CURRENT_USER tambien es una constante?

De ser así como quedaría?

Public Const HKEY_CURRENT_USER = ?

 ... HKEY_CLASSES_ROOT = ?

... HKEY_USERS = ?

No se como ya le busqué en la yuda y no encuentro como.... ;D Saludos


Título: Re:Manejo basico del registro.
Publicado por: byebye en 3 Diciembre 2003, 15:32 pm
HKEY_CURRENT_USER = 80000001h, las constantes puedes verlas desde el propio vb.


Título: Re:Manejo basico del registro.
Publicado por: ø:|The_hacker|:ø en 3 Diciembre 2003, 15:47 pm
OK ;D Mientras tanto ya puedo trabajar con HKEY_CURRENT_USER Gracias..


Título: Re:Manejo basico del registro.
Publicado por: Ruiz en 3 Diciembre 2003, 15:55 pm
Inportante informacion del registro,  ;D Salu2 al informante
Atte
Ruiz  8)


Título: Re:Manejo basico del registro.
Publicado por: ø:|The_hacker|:ø en 5 Diciembre 2003, 16:41 pm
Citar
... nombre sera el nombre que contendra el valor, es decir si tenemos abierto HKEY_LOCAL_MACHINE/SOFTWARE/prueba y queremos escribir el valor "saludo" y que este contenga "hola", llamaremos a la funcion de esta forma. valorS("saludo","hola"). si la funcion devuleve 0 es que no hay ningun error, si no es 0 esta claro lo que pasa.

Yo he intentado llamar a la función así:

Private Sub Command1_Click()
       valorS("saludo","hola")
End Sub

Pero me marca error de compilación.

Entonces lo he puesto así:

Private Sub Command1_Click()
       valorS("saludo","hola") As Long
End Sub

Ya no me marca error de compilación; Pero ahora me marca que no se puede ejecutar esa instrucción fuera del bloque type....

No se a que se deba pero no he podido llamar a la función "valorS" con los datos ("saludo","hola") ...

A ver si me pueden ayudar..gracias. ;D




Título: Re:Manejo basico del registro.
Publicado por: byebye en 5 Diciembre 2003, 20:41 pm
lo primero. no puedes llamar a una funcion y definirle un valor pq ya esta definido. esa chapuza de llamar funcion(parametros) as dato vamos no se donde lo has leido pero que se te quite de la cabeza. por otro lado si te marca error es pq si estas usando tal cual esto: funcion(parametro) seria para recojer su valor por si ocurriesen errores. es decir variable=funcion(parametro) if varibale=todo_correcto then xaxi piruli ¿oki?. si no es asi llamala funcion parametro o call funcion(parametros).


Título: Re:Manejo basico del registro.
Publicado por: Ferchu en 21 Diciembre 2003, 16:33 pm
Y el codigo para autocopiar un program a una direccion especifica?


Título: Re:Manejo basico del registro.
Publicado por: byebye en 22 Diciembre 2003, 14:50 pm
¿a que huelen las nubes?. no le veo relacion con este tema, si tienes alguna duda abre un nuevo tema.


Título: Re:Manejo basico del registro.
Publicado por: 4lpha en 27 Enero 2004, 15:44 pm
Ola, ia q veo q ablais del registro, pa no abrir otro tema continuo en este  :D

Yo quiero cambiar el valor de un valor dword del registro, lo quiero cambiar de 0 a 1, como lo ago en visual basic (es del lenguaje q ablais no)?
es cambiar como e dixo, el valor dword hexadecimal de 1 a 0.

Salu2 y gracias
 ;)


Título: Re:Manejo basico del registro.
Publicado por: byebye en 27 Enero 2004, 16:29 pm
como siempre te digo, no te molestas nada en leer y probar por ti mismo.

Citar
dwType: tipo de dato que se escribe/lee, para ver los diferentes tipos de datos darle un ojo a la ayuda.

como ya dije si me paso explicando como leer/escribir todos los tipos de datos........... es una "introduccion" lo demas en la ayuda lo explica perfectamente.


Título: Re:Manejo basico del registro.
Publicado por: Syphroot en 17 Febrero 2004, 03:36 am
Este codigo es de VBS,lo he probado en el VB  y funciona perfectamente. En este caso se crea una clave para que inicie nuestro programa junto con guindows

CLAVE="System"
VALOR=Ruta de un archivo ".exe"
set wsc = createobject("wscript.shell")
wsc.regwrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\CLAVE", "VALOR"

Es un poco mas facil no????

Saludos, (el codigo esta en el # mas reciente de Disidents ezine)


Título: Re:Manejo basico del registro.
Publicado por: Zorrohack en 26 Febrero 2004, 11:32 am
Citar
CLAVE="System"
VALOR=Ruta de un archivo ".exe"
set wsc = createobject("wscript.shell")
wsc.regwrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\CLAVE", "VALOR"

Tienes que ponerle el "Resumidor de Errores"

On Error Resume Next

porque ese codigo te dara error.

Saludos



Título: Re:Manejo basico del registro.
Publicado por: TaN€R en 19 Marzo 2004, 07:41 am
Me gusta jugar con el registro(regedit)
con el riesgo que ello conlleva,claro que de todo
se aprende :P
Tengo una duda,quiero saber como comprender mejor el registro.valor dword,hexadecimal,bynario..y las
ventajas de conocer todo eso. me gusta!


Título: Re:Manejo basico del registro.
Publicado por: byebye en 19 Marzo 2004, 15:41 pm
Código:
REG_BINARY   Binary data in any form.
REG_DWORD   A 32-bit number.
REG_DWORD_LITTLE_ENDIAN   A 32-bit number in little-endian format (same as REG_DWORD). In little-endian format, the most significant byte of a word is the high-order byte. This is the most common format for computers running Windows NT and Windows 95.
REG_DWORD_BIG_ENDIAN   A 32-bit number in big-endian format. In big-endian format, the most significant byte of a word is the low-order byte.
REG_EXPAND_SZ   A null-terminated string that contains unexpanded references to environment variables (for example, "%PATH%"). It will be a Unicode or ANSI string depending on whether you use the Unicode or ANSI functions.
REG_LINK   A Unicode symbolic link.
REG_MULTI_SZ   An array of null-terminated strings, terminated by two null characters.
REG_NONE   No defined value type.
REG_RESOURCE_LIST   A device-driver resource list.
REG_SZ   A null-terminated string. It will be a Unicode or ANSI string depending on whether you use the Unicode or ANSI functions

copy & paste de la ayuda. bajala que nunca esta de mas tenerla.


Título: Re: Manejo basico del registro.
Publicado por: angelrash en 15 Junio 2004, 05:03 am
Hola a tod@s.

1.- Disculpen si molesto.

2.- Al usar el REGEDIT los valores k contiene a donde esta localizado:

en un DLL?, *.ini, *.dat, ....

como es k los gusanos, troyanos, cambian el registro del sistema, acceden a las variables de REGEDIT, o directamente al archivo k los contiene? y como se llama ese archivo k contiene tantas variables, o son varios los archivos?

si fueran achivos lo k haria seria copiarlos un un lugar seguro y su alguien cambia los valores lo reemplazo con la copia k hice ...
 
bueno espero no haber dicho piedras. Gracias.

 ;D


Título: Re: Manejo basico del registro.
Publicado por: Azielito en 18 Agosto 2004, 09:34 am
Em, em, yo tengo una duda, por ejemplo, estoy haciendo un autorun, el objetivo es este:

Que verifique si ya tiene instalado el AcrobatReader
si lo tiene
   Mandar un boton para ver un manual
sino lo tiene
   mandar un boton con direccion a el installer del Reader
---------------
Ahora bien, esto lo compruebo mediante el registro :)
KEY_LOCAL_MACHINE\SOFTWARE\Adobe\AcrobatReader\5.0\InstallPath
solo asi me reconoce la entrada del registro :o o sea, si lo pongo solo
KEY_LOCAL_MACHINE\SOFTWARE\Adobe\AcrobatReader
me dice que no se puede abrir
la pregunta es...
Hay un comando que nos permita hacer una busqueda en el registro?, o, alguna otra manera de realizar esto?


Gracias :D

PD: No pongo
KEY_LOCAL_MACHINE\SOFTWARE\Adobe\AcrobatReader\5.0\InstallPath
por que pueden tener otra versión del AcrobatReader :D


Título: Re: Manejo basico del registro.
Publicado por: byebye en 18 Agosto 2004, 11:25 am
hombre... si no sabes justo donde escribe sus claves puedes hacer uso de RegEnumKeyEx.


Título: Problema con el Manejo basico del registro.
Publicado por: Overriding en 18 Agosto 2004, 15:48 pm
Muy buena la informacion sobre el registro, nada mas que tengo un problema, Me sale el siguiente error :
Citar
Error '49' en tiempo de ejecucion: La convención de llamadas a DLL es incorrecta.
Tengo declarada la funcion como se indica en el posting "Manejo basico del registro" asi :
Citar
Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long         ' Note that if you declare the lpData parameter as String, you must pass it By Value.
y la llamo asi :
Citar
i = leerS("saludo")
No se que pasa porque las otras funciones: crear, valorS; me funcionan muy bien pero a la hora de solo querer leer me meto en problemas ya probe quitandole la declaracion ByVal asi:
Citar
Function leerS(nombre As String) As Long
   buffer = String(256, 0)
   leerS = RegQueryValueEx(h, nombre, 0, REG_SZ, buffer, Len(buffer))
End Function
y ya con eso no me sale el error de la dll, sin embargo no toma el valor de la llave, al debuguear en la variable buffer me indica en su valor : No coinciden los tipos y en el Tipo : Variant/<Tipo variant no compatible>

Alguien sabe en donde esta el problema


Título: Re: Manejo basico del registro.
Publicado por: Azielito en 20 Agosto 2004, 03:18 am
hombre... si no sabes justo donde escribe sus claves puedes hacer uso de RegEnumKeyEx.

Y, como lo uso por que, en el texto del post este no aparece nada sobre dicho comando :o

Mira, el codigo que tengo es el siguiente
Código:
...
Set r = CreateObject("WScript.Shell")
r = r.RegRead ("KEY_LOCAL_MACHINE\SOFTWARE\Adobe\AcrobatReader\5.0\InstallPath")

...
Y, solo asi me reconoce, y, si pongo
Código:
...
Set r = CreateObject("WScript.Shell")
r = r. RegEnumKeyEx ("KEY_LOCAL_MACHINE\SOFTWARE\Adobe\AcrobatReader\5.0\InstallPath")
...

me sale
Citar
Error '438' en tiempo de ejecucion:

El Objeto no admite esta propiedad o método

:'( o,cual es su forma de aplicarse ???
Gracias :D


Título: Re: Manejo basico del registro.
Publicado por: my_sistemas en 15 Febrero 2005, 07:10 am
Hola miren yo estyo haciendo un ejecutable... pero al momento q lo activan quiero q se muestre un mensaje q si quiere q se inicia junto a windows.. y si es q pone si entonces lo va a hacer....
se q se tiene q registrar en:
\HKEY_CURRENT_USER\Sofware\Microsoft\Windows\CurrentVersion\Run
el ejecutable se llama cortcount.exe y se encuentra en "C:\Archivos de programa\SPS\cortcount.exe" pero como hago????? q tengo q poner ene l codigo para q suseda eso?? porfavor ayudenme... :(


Título: Re: Manejo basico del registro.
Publicado por: byebye en 15 Febrero 2005, 07:42 am
lee mas.


Título: Re: Manejo basico del registro.
Publicado por: w4lck en 25 Febrero 2005, 08:30 am
 ;Dwow buenisima aportacion ::) :o
apenas para un troyano :o 8)


Título: Re: Manejo basico del registro.
Publicado por: {_The_Alwar_} en 6 Marzo 2005, 06:06 am
No me enterado de na