Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: noele1995 en 13 Marzo 2012, 17:25 pm



Título: Leet el registro de windows
Publicado por: noele1995 en 13 Marzo 2012, 17:25 pm
Hola en el proyecto actual que estoy haciendo estoy con el registro de windows, tengo algun que otro problemilla al leer los valores, cuando los valores son DWORD, no consigo leer su valor, les pongo el codigo:

Código
  1. Public Function ValueData(Key As Long, strValueName As String, sType As Long) As String
  2. Dim lResult As Long, RetornoData As Long, strData As String, lngData As Currency, binData() As Byte, sTmp As String
  3. Dim i As Integer
  4. Select Case sType
  5.    Case REG_NONE
  6.        ValueData = vbNullString
  7.  
  8.    Case REG_SZ, REG_EXPAND_SZ, REG_LINK
  9.        lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal 0, RetornoData)
  10.  
  11.        If lResult = 0 Then
  12.            strData = String(RetornoData, Chr$(0))
  13.            lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal strData, RetornoData)
  14.  
  15.            If lResult = 0 Then
  16.                ValueData = Left$(strData, InStr(1, strData, Chr$(0)) - 1)
  17.            End If
  18.        End If
  19.  
  20.    Case REG_MULTI_SZ
  21.        lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal 0, RetornoData)
  22.  
  23.        If lResult = 0 Then
  24.            strData = String(RetornoData, Chr$(0))
  25.            lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal strData, RetornoData)
  26.  
  27.            If lResult = 0 Then
  28.                For i = Len(strData) To 1 Step -1
  29.                    If Mid$(strData, i, 1) = Chr$(0) Then
  30.                    strData = Left$(strData, i - 1)
  31.                    Exit For
  32.                End If
  33.                Next
  34.                For i = 1 To Len(strData)
  35.                    If Mid$(strData, i, 1) = Chr$(0) Then
  36.                    Mid$(strData, i, 1) = " "
  37.                    End If
  38.                Next
  39.  
  40.                ValueData = Left$(strData, InStr(1, strData, Chr$(0)) - 1)
  41.            End If
  42.        End If
  43.        For i = Len(strData) To 1 Step -1
  44.            If Mid$(strData, i, 1) = Chr$(0) Then
  45.                strData = Left$(strData, i - 1)
  46.                Exit For
  47.            End If
  48.        Next
  49.        For i = 1 To Len(strData)
  50.            If Mid$(strData, i, 1) = Chr$(0) Then
  51.                Mid$(strData, i, 1) = " "
  52.            End If
  53.        Next
  54.  
  55.    Case REG_BINARY
  56.        lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal 0, RetornoData)
  57.        If lResult = 0 Then
  58.            ReDim binData(RetornoData)
  59.            lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, binData(0), RetornoData)
  60.  
  61.            If lResult = 0 Then
  62.                For i = 0 To UBound(binData) - 1
  63.                    sTmp = sTmp & Right$("00" & Hex$(binData(i)), 2) & " "
  64.                Next
  65.                ValueData = sTmp
  66.            End If
  67.        End If
  68.  
  69.    Case REG_DWORD, REG_DWORD_BIG_ENDIAN
  70.        lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, lngData, RetornoData)
  71.        If lResult = 0 Then
  72.            ValueData = "0x" & Right$("00000000" & Hex$(lngData), 8) & " (" & lngData & ")"
  73.        End If
  74.    Case Else
  75.        lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal 0, RetornoData)
  76.        If lResult = 0 Then
  77.            strData = String(RetornoData, Chr$(0))
  78.            lResult = RegQueryValueEx(Key, strValueName, 0, ByVal 0, ByVal strData, RetornoData)
  79.  
  80.            If lResult = 0 Then
  81.                ValueData = Left$(strData, InStr(1, strData, Chr$(0)) - 1)
  82.            End If
  83.        End If
  84. End Select
  85. End Function

A la funcion se la llama con la clave ya abierta, si pueden ayudarme se lo agradeceria.

PD: ¿Como hacen para que el codigo salga con colores? Es menos lioso xD


Título: Re: Leet el registro de windows
Publicado por: $Edu$ en 14 Marzo 2012, 01:03 am
Encerra el codigo dentro de las etiquetas con el lenguaje correspondiente, por ejemplo en este caso con [code =vb] ' codigo [ /code] pero sin los espacios y veras que queda coloreado


Título: Re: Leet el registro de windows
Publicado por: noele1995 en 14 Marzo 2012, 15:32 pm
Ok eso responde a mi pregunta del color del codigo (no lo corrijo ahora porque con el movil tardo mucho ;D ), pero volviendo al tema de mi pregunta podriais ayudarme con los valores DWORD?


Título: Re: Leet el registro de windows
Publicado por: $Edu$ en 14 Marzo 2012, 15:44 pm
Yo no tengo ni idea, pero buscate en google como leer valores Dword, o sino capas que si buscas bien hasta encontras una forma de que lea todo.


Título: Re: Leet el registro de windows
Publicado por: burbu_1 en 15 Marzo 2012, 15:33 pm
En primer lugar tienes que asegurarte que el valor RetornoData es 4 o más grande, ya que para guardar un valor DWORD se necesitan 4 bytes, si no, RegQueryValueEx no te retornará ERROR_SUCCESS.
Para los valores de cadena y binarios, ya haces esa comprobación llamando 2 veces al api, para los DWORD no hace falta poque SIEMPRE van a ser 4 bytes

por otro lado, los valores DWORD son números de 32 bits (4bytes) SIN signo, mientras que los valores Long de vb, son números de 32 bits CON signo.

Esto quiere decir que un valor WORD puede ir 
de                   0           0x 00 00 00 00
a      4294967295          0x FF FF FF FF

y un Long puede ir
de                 0      0x 00 00 00 00
a    2147483647     0x 07 FF FF FF

y de                 -1      0x FF FF FF FF
a      -2147483648     0x 08 FF FF FF


por lo que si el long es negativo, hay que hacer una conversión.

Código
  1.  Dim ValueData As String
  2.    Dim hKey As Long
  3.    If RegOpenKey(HKEY_CURRENT_USER, "kk", hKey) = ERROR_SUCCESS Then
  4.        Dim lngData As Long     'un valor Long es un número de 4 bytes CON signo
  5.        If RegQueryValueEx(hKey, "Nuevo", ByVal 0, ByVal 0, lngData, 4) = ERROR_SUCCESS Then
  6.            If lngData < 0 Then 'Si el long es negativo se pasa a DWORD (por ejemplo asi)
  7.                ValueData = "0x" & Right$("00000000" & Hex$(lngData), 8) & " (" & (2 * 2147483648#) + lngData & ")"
  8.            Else
  9.                ValueData = "0x" & Right$("00000000" & Hex$(lngData), 8) & " (" & lngData & ")"
  10.            End If
  11.        End If
  12.        RegCloseKey hKey
  13.    End If
  14.  

Saludos.


Título: Re: Leet el registro de windows
Publicado por: noele1995 en 16 Marzo 2012, 00:15 am
Muchas gracias me has aclarado mucho, muy bien explicado tambien. Mañana mismo corregire el codigo.
Gracias de nuevo burbu_1  ;D