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 General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Modificar ejecutable VisualBasic en la instalación
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Modificar ejecutable VisualBasic en la instalación  (Leído 2,759 veces)
dust564

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Modificar ejecutable VisualBasic en la instalación
« en: 1 Junio 2015, 22:58 pm »

Llevo varios días con una idea rondando la cabeza, pero por mucho que he buscado no he encontrado como hacerlo.

Tengo una aplicación (ya completamente funcional) hecha en Visual Basic con Visual Studio 2012 que requiere para varias funciones un número de cuatro dígitos que viene ya en el ejecutable, pero me gustaría que éste fuese distinto en cada instalación pero sin almacenarlo en un archivo o en el registro.

No sé si me explico. Poniendo un ejemplo:

Tengo una aplicación que al abrirla muestra un Label en el que pone "0000", lo que en el código sería así:

Código:
Label1.Text = "0000"

Y la idea es que a la hora de instalarlo en el ordenador ese número cambie por uno aleatorio, de forma que una vez abierta mostrase un texto distinto en cada ordenador:

PC1: 1234
PC2: 5678

La duda es si esto se puede hacer y cómo...

Salu2


En línea

nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Modificar ejecutable VisualBasic en la instalación
« Respuesta #1 en: 2 Junio 2015, 03:05 am »

Hola podrías usar la función random para que te genere un número Aleatorio
Acá un ejemplo

Código
  1. Dim numeroAleatorio As New Random()
  2. Label1.Text = System.Convert.ToString(numeroAleatorio.Next)

También puedes usar rangos etc

Código
  1. 'Rango de 1000 a 10,000
  2. Dim rnd1 As New Random()
  3. Dim N As Integer = rnd1.Next(1000, 10000)
  4. 'Console.WriteLine("{0:0000}", N)
  5. RadLabel39.Text = "PCI: " + N.ToString
  6.  
  7. 'Genera números aleatorios de 4 dígitos desde 0 a 9999
  8. Dim rnd1 As New Random()
  9. Dim N As Integer = rnd1.Next(9999)
  10. 'Console.WriteLine("{0:0000}", N)
  11. RadLabel39.Text = "PCI: " + N.ToString

También puedes ver Rnd y Randomize en msdn.

Saludos.

Pd: Si no es lo que buscas seguro alguien te ayuda.


« Última modificación: 2 Junio 2015, 03:48 am por nolasco281 » En línea

Lo que se puede imaginar... se puede programar.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Modificar ejecutable VisualBasic en la instalación
« Respuesta #2 en: 2 Junio 2015, 10:05 am »

¿Por qué tienes pegas con almacenar la configuración en un archivo?, una solución sería hacer lo que te comentó @nolasco281, pero usando la infraestructura Settings para que la aletoriedad se produzca una única vez por instalación.

Ej:
Código
  1. If Not My.Settings.IsRandomized Then
  2.  My.Settings.RandomValue = ' Generar valor aleatorio
  3.  My.Settings.IsRandomized = True
  4. End If
  5.  
  6. lbl.text = My.Settings.RandomValue.ToString

Teniendo en cuenta que esos datos se guardan en un archivo de configuración pero es la solución menos compleja, de lo contrario las opciones que te quedan son llamar a la app mediante argumentos para pasarle un número específico (para esto debes controlar los argumentos desde la app, e iniciar la app desde la consola o un acceso directo para pasarle dicho número), automatizar la compilación de la app en tiempo de ejecución desde el instalador (editando previamente "X" valor estático del código fuente antes de compilar, para aplicar dicha aletoriedad por instalación, claro está), o automatizar el parcheo de "X" bytes de la app compilada para modificar el valor, para esto primero debes localizar los bytes que hacen referencia a ese valor "aleatorio" en un editor hexadecimal o como veas.

En realidad ninguna de esas alternativas es dificil mientras sepas cómo hacerlo.

Saludos
En línea



dust564

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: Modificar ejecutable VisualBasic en la instalación
« Respuesta #3 en: 2 Junio 2015, 16:15 pm »

nolasco281: Como generar el número aleatorio ya se hacerlo, el problema es que no sé implantarlo. Aún así gracias por la contestar  ;D

Eleкtro: El motivo por el que tengo pegas para almacenar el número en un archivo de configuración... es que ese número es el que utiliza el programa para cifrar todos los archivos que utiliza, por eso me gustaría poder grabar un número único en cada ejecutable.

He estado viendo que se puede crear un instalador para el prograda directamente desde Visual Studio, ¿con ese instalador podría hacerlo? ¿O con que aplicación podría automatizar el parcheo...?

La situación real es esta:

Tengo un programa en varias aulas de informática para varias tareas, entre ellas evitar que ejecuten juegos. Al iniciarse, la aplicación recupera del registro la configuración (incluido si debe activarse o no) cifrada con ese número y la descifra para aplicarla. Si detecta que algún valor no está o no puede descifrarlo con la clave, bloquea el ordenador.

Hasta ahí bien, pero viene el problema. Los ordenadores comparten el mismo programa pero no las mismas restricciones, de forma que copiando los valores de registro de un ordenador con el programa desactivado y pegándolos en el ordenador bloqueado consiguen desactivar la aplicación...

Por eso me gustaría que cada ordenador (cada ejecutable, para ser exacto) tuviese una clave única, y que al copiar los valores de un ordenador a otro lo reconozca como no válido...
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Modificar ejecutable VisualBasic en la instalación
« Respuesta #4 en: 3 Junio 2015, 21:27 pm »

Hasta ahí bien, pero viene el problema. Los ordenadores comparten el mismo programa pero no las mismas restricciones, de forma que copiando los valores de registro de un ordenador con el programa desactivado y pegándolos en el ordenador bloqueado consiguen desactivar la aplicación...

Si el problema es ese entonces la primera solución que te ofrecí de usar Settings no te serviría, ya que el archivo de configuración sigue esta estructura, donde el hash sería el mismo en cada PC:
Código:
c:\Users\<username>\AppData\Local o Roaming\<companyname>\<appdomainname>_<eid>_<hash>\<verison>

Ejemplo real:
Código:
C:\Users\Administrador\AppData\Local\ElektroStudios\MasterMusik_Reports.exe_Url_q2a441mf5bc330sftjmvcdv30vohiv0o\2.0.0.0\user.config

De todas formas para otras cosas te puede interesar, aquí puedes conocer más detalles de su arquitectura, aunque es un artículo bastante antiguo:
Using My.Settings in Visual Basic 2005



A ver si lo he entendido bien, sino corrígeme.

Tu tienes algo PARECIDO a este ejemplo, en el código fuente:

Código
  1. Dim value As Integer = 0
  2.  
  3. Select Case value
  4.  
  5.    Case Is = 0
  6.        ' Activar aplicaciones.
  7.  
  8.    Case Is = 1
  9.        ' Denegar aplicaciones.
  10.  
  11.    Case Else
  12.        ' ...
  13.  
  14. End Select
(muy resumido)

¿Pero cómo decides si Value debe ser 0 o 1 al distribuirr y ejecutar el programa?, es decir, si el programa lo ejecutase yo en mi PC, ¿cómo se decide si se deben activar esas cosas que mencionas?, ¿se decide por un número?, ¿pero entonces cómo se decide el número que yo debo tener, no era aleatorio?, que lio, estoy algo espeso y no lo llego a pillar del todo.

De todas formas, ¿podrías mantener una conexión con los PCs de esas aulas? (mediante sockets), en ese caso lo que podrías hacer es administrar las activaciones de forma remota basándote en el HWID (Hardware ID) de cada equipo conectado,
de lo contrario, y si tienes acceso físico a esas aulas, entonces también puedes obtener manualmente el HWID de cada PC ejecutando un programa específico en ese PC que devuelva el HWID, es decir, obtienes los HWID de cada PC, luego creas una lista/array con los HWID predefinidos en tu código fuente y así administras las activaciones al distribuir la app, simplemente comprobando si el HWID dle equipo actual corresponde con algún HWID de la lista que compilaste.

Te dejo unas funciones que tal vez te podrían servir para pensar en algún enfoque, estas funciones sirven para obtener el identificador del procesador y de la placa base de un PC, y para cifrar un string mediante el algoritmo AES:

Código
  1.    ''' <remarks>
  2.    ''' *****************************************************************
  3.    ''' Title : Get CPU Identifier
  4.    ''' Author: Elektro
  5.    ''' Date  : 03-June-2015
  6.    '''
  7.    ''' Required Namespaces:
  8.    ''' <see cref="System.Management"/>
  9.    '''
  10.    ''' Usage Example:
  11.    ''' Dim Value as String = GetCpuId()
  12.    ''' *****************************************************************
  13.    ''' </remarks>
  14.    ''' <summary>
  15.    ''' Gets the motherboard ID of the current computer machine.
  16.    ''' </summary>
  17.    ''' <returns>The motherboard ID.</returns>
  18.    Public Shared Function GetCpuId() As String
  19.  
  20.        Using wmi As New ManagementObjectSearcher("select ProcessorID from Win32_Processor")
  21.  
  22.            Using query As ManagementObjectCollection = wmi.Get
  23.  
  24.                Return DirectCast(query(0), ManagementObject).Properties("ProcessorID").Value.ToString
  25.  
  26.            End Using
  27.  
  28.        End Using
  29.  
  30.    End Function

Código
  1.    ''' <remarks>
  2.    ''' *****************************************************************
  3.    ''' Title : Get Motherboard Identifier
  4.    ''' Author: Elektro
  5.    ''' Date  : 03-June-2015
  6.    '''
  7.    ''' Required Namespaces:
  8.    ''' <see cref="System.Management"/>
  9.    '''
  10.    ''' Usage Example:
  11.    ''' MsgBox(GetMotherboardId)
  12.    ''' *****************************************************************
  13.    ''' </remarks>
  14.    ''' <summary>
  15.    ''' Gets the motherboard ID of the current computer machine.
  16.    ''' </summary>
  17.    ''' <returns>The motherboard ID.</returns>
  18.    Public Shared Function GetMotherboardId() As String
  19.  
  20.        Using wmi As New ManagementObjectSearcher("select SerialNumber from Win32_BaseBoard")
  21.  
  22.            Using query As ManagementObjectCollection = wmi.Get
  23.  
  24.                Return DirectCast(query(0), ManagementObject).Properties("SerialNumber").Value.ToString
  25.  
  26.            End Using
  27.  
  28.        End Using
  29.  
  30.    End Function

Código
  1.    ''' <remarks>
  2.    ''' *****************************************************************
  3.    ''' Title : AES Encryptor
  4.    ''' Author: Elektro
  5.    ''' Date  : 03-June-2015
  6.    '''
  7.    ''' Required Namespaces:
  8.    ''' <see cref="System.IO"/>
  9.    ''' <see cref="System.Security.Cryptography"/>
  10.    ''' <see cref="System.Text"/>
  11.    '''
  12.    ''' Usage Example:
  13.    ''' Dim encrypted As String = AESEncryptor("Hello World!", key:="My Encryption Key", size:=128)
  14.    ''' *****************************************************************
  15.    ''' </remarks>
  16.    ''' <summary>
  17.    ''' Encrypts an string using AES algorithm.
  18.    ''' </summary>
  19.    ''' <param name="str">The string to encrypt.</param>
  20.    ''' <param name="key">The encryption key.</param>
  21.    ''' <param name="size">The key size. 128, 192 or 256 bits.</param>
  22.    ''' <param name="salt">The key salt.</param>
  23.    ''' <param name="mode">The encryption mode.</param>
  24.    ''' <returns>The encrypted string.</returns>
  25.    Public Function AESEncryptor(ByVal str As String,
  26.                                 ByVal key As String,
  27.                                 ByVal size As Integer,
  28.                                 Optional ByVal salt As Byte() = Nothing,
  29.                                 Optional ByVal mode As CipherMode = CipherMode.ECB) As String
  30.  
  31.        If (size <> 128) AndAlso (size <> 192) AndAlso (size <> 256) Then
  32.            Throw New ArgumentException(message:="Key size for this algorithm should be 128, 192 or 256.", paramName:="keySize")
  33.  
  34.        ElseIf (salt IsNot Nothing) AndAlso (salt.Length < 8) Then
  35.            Throw New ArgumentException(message:="Salt should contain at least 8 bytes.", paramName:="salt")
  36.  
  37.        ElseIf salt Is Nothing Then
  38.            salt = {&H49, &H76, &H61, &H6E, &H20, &H4D, &H65, &H64}
  39.  
  40.        End If
  41.  
  42.        Using crypto As Aes = Aes.Create()
  43.  
  44.            Dim pdb As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(key, salt:=salt)
  45.  
  46.            crypto.KeySize = size ' 128, 192 or 256 Bits.
  47.            crypto.Key = pdb.GetBytes(cb:=(size \ 8)) ' 16, 24, or 32 or Bytes (128, 192 or 256 Bits).
  48.            crypto.IV = pdb.GetBytes(cb:=16) ' 16 Bytes (128 Bits).
  49.            crypto.Mode = mode
  50.  
  51.            Using ms As New MemoryStream()
  52.  
  53.                Using cs As New CryptoStream(ms, crypto.CreateEncryptor(), CryptoStreamMode.Write)
  54.  
  55.                    Dim strBytes As Byte() = Encoding.Unicode.GetBytes(str)
  56.                    cs.Write(strBytes, 0, strBytes.Length)
  57.                    cs.Close()
  58.  
  59.                End Using
  60.  
  61.                Return Convert.ToBase64String(ms.ToArray)
  62.  
  63.            End Using
  64.  
  65.        End Using
  66.  
  67.    End Function
  68.  
  69.    ''' <remarks>
  70.    ''' *****************************************************************
  71.    ''' Title : AES Decryptor
  72.    ''' Author: Elektro
  73.    ''' Date  : 03-June-2015
  74.    '''
  75.    ''' Required Namespaces:
  76.    ''' <see cref="System.IO"/>
  77.    ''' <see cref="System.Security.Cryptography"/>
  78.    ''' <see cref="System.Text"/>
  79.    '''
  80.    ''' Usage Example:
  81.    ''' Dim decrypted As String = AESDecryptor("JRVQnb2q7f3BtIDaq5Tdcqu2+2GYGEMLyQrBT9mMjgw=", key:="My Encryption Key", size:=128)
  82.    ''' *****************************************************************
  83.    ''' </remarks>
  84.    ''' <summary>
  85.    ''' Decrypts a previously encrypted string using AES algorithm.
  86.    ''' </summary>
  87.    ''' <param name="str">The encrypted string to decrypt.</param>
  88.    ''' <param name="key">The key used for encryption.</param>
  89.    ''' <param name="size">The key size used for encryption. 128, 192 or 256 bits.</param>
  90.    ''' <param name="salt">The key salt used for encryption.</param>
  91.    ''' <param name="mode">The encryption mode.</param>
  92.    ''' <returns>The decrypted string.</returns>
  93.    Public Function AESDecryptor(ByVal str As String,
  94.                                 ByVal key As String,
  95.                                 ByVal size As Integer,
  96.                                 Optional ByVal salt As Byte() = Nothing,
  97.                                 Optional ByVal mode As CipherMode = CipherMode.ECB) As String
  98.  
  99.        If (size <> 128) AndAlso (size <> 192) AndAlso (size <> 256) Then
  100.            Throw New ArgumentException(message:="Key size for this algorithm should be 128, 192 or 256.", paramName:="keySize")
  101.  
  102.        ElseIf (salt IsNot Nothing) AndAlso (salt.Length < 8) Then
  103.            Throw New ArgumentException(message:="Salt should contain at least 8 bytes.", paramName:="salt")
  104.  
  105.        ElseIf salt Is Nothing Then
  106.            salt = {&H49, &H76, &H61, &H6E, &H20, &H4D, &H65, &H64}
  107.  
  108.        End If
  109.  
  110.        Using crypto As Aes = Aes.Create()
  111.  
  112.            Dim pdb As New Rfc2898DeriveBytes(key, salt)
  113.  
  114.            crypto.KeySize = size ' 128, 192 or 256 Bits.
  115.            crypto.Key = pdb.GetBytes(cb:=(size \ 8)) ' 16, 24, or 32 or Bytes (128, 192 or 256 Bits).
  116.            crypto.IV = pdb.GetBytes(cb:=16) ' 16 Bytes (128 Bits).
  117.            crypto.Mode = mode
  118.  
  119.            Using ms As New MemoryStream()
  120.  
  121.                Using cs As New CryptoStream(ms, crypto.CreateDecryptor(), CryptoStreamMode.Write)
  122.  
  123.                    Dim cipherBytes As Byte() = Convert.FromBase64String(str)
  124.                    cs.Write(cipherBytes, 0, cipherBytes.Length)
  125.                    cs.Close()
  126.  
  127.                End Using
  128.  
  129.                Return Encoding.Unicode.GetString(ms.ToArray)
  130.  
  131.            End Using
  132.  
  133.        End Using
  134.  
  135.    End Function

Saludos
« Última modificación: 3 Junio 2015, 21:37 pm por Eleкtro » En línea



dust564

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: Modificar ejecutable VisualBasic en la instalación
« Respuesta #5 en: 6 Junio 2015, 23:38 pm »

Éste es el código que el programa lee al iniciarse y bajo el que decide si se activa o no:

Código
  1. 'He cambiado el nombre de los valores a otros genericos.
  2. 'La aplicacion viene desactivada por defecto.
  3. 'Password seria el codigo de cuatro digitos que decia al principio.
  4.  
  5. Dim regdat1E = My.Computer.Registry.GetValue(
  6.    "HKEY_CURRENT_USER\Software\Mi Programa", "Entrada", Nothing)
  7. Dim regdat1D as string
  8. regdat1D = descifrar(Password, regdat1E)
  9.  
  10. If regdat1D = "Activado" then
  11. ''Bloque de codigo de activacion
  12. Elseif regdat1D = "Desactivado" then
  13. ''Bloque de codigo si no hay que activar
  14. Else
  15. ''Bloque de codigo si no hay info sobre la activacion.

La forma de desactivar el programa es abriendo el form principal del programa, desbloquearlo con la contraseña de usuario y elegir la opción de desactivar. Ésto edita la entrada del registro que indica si se activa o no al iniciarse.

Sin embargo me parece mejor idea la de administrar si se activa o no de manera remota, así que me pondré a modificar y probar. Muchas gracias Eleкtro
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines