elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  ¿Generar un ejecutable con configuraciones personalizadas desde otro ejecutable?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Generar un ejecutable con configuraciones personalizadas desde otro ejecutable?  (Leído 5,671 veces)
Crazy.sx


Desconectado Desconectado

Mensajes: 447



Ver Perfil
¿Generar un ejecutable con configuraciones personalizadas desde otro ejecutable?
« en: 24 Noviembre 2012, 08:40 am »

Hola. Hace unos años atrás había hecho una pregunta parecida a esta pero con VB6, la cosa es que no encuentro el post y creo que la respuesta me la había dado E0N en aquella oportunidad y lo quería ver de nuevo como para usarlo de guía.

Ahora ya no uso VB6 sino VB .NET 2010, y lo que quiero hacer es hacer algo similar a lo que hace, por ejemplo, el bifrost en cuanto a generar un "servidor" con las configuraciones para la conexión, etc., que han sido especificadas de antemano desde el "cliente".

A ver, si me explico mejor. Por ejemplo, tener un programa que tenga dos textbox y un botón y que al hacer clic en ese botón se genere automáticamente otro ejecutable que al ser ejecutado (valga la redundancia) muestre como mensaje los textos que haya ingresado en los textbox del primero.

Aquella vez, E0N, había usado la función Split y un string que servía como delimitador pero tomaba al archivo binario... bueno, algo así, que se yo.   :-\

No se si me he sabido explicar, pero espero que me hayan entendido.

¿Cómo se haría esto?

Espero que me puedan ayudar, gracias.

PD: No estoy haciendo troyano ni nada de eso, solo lo puse como ejemplo al bifrost porqu es lo primero que se me vino a la cabeza y que es exactamente lo que me gustaría hacer.


En línea

Destruir K. LOL
seba123neo


Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: ¿Generar un ejecutable con configuraciones personalizadas desde otro ejecutable?
« Respuesta #1 en: 24 Noviembre 2012, 15:03 pm »

si me acuerdo que escribia esa informacion al final del archivo o en una sección, pero habia que saber donde segun la estructura del ejecutable PE. creo que los de visual basic .NET al compilarse a un codigo intermedio no se si eso afectara en la estructura y ese codigo sigue funcionando.


« Última modificación: 24 Noviembre 2012, 15:06 pm por seba123neo » En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: ¿Generar un ejecutable con configuraciones personalizadas desde otro ejecutable?
« Respuesta #2 en: 24 Noviembre 2012, 15:59 pm »

Puedes agregar la información a los recursos del ejecutable como array de bytes, si la serializas, haciendo uso de las API:

Código
  1.    <DllImport("kernel32.dll", SetLastError:=True)> _
  2.       Public Function BeginUpdateResource(ByVal pFileName As String, _
  3.       <MarshalAs(UnmanagedType.Bool)> ByVal bDeleteExistingResources As Boolean) As IntPtr
  4.    End Function
  5.  
  6.    <DllImport("kernel32.dll", SetLastError:=True)> _
  7.        Public Function UpdateResource(ByVal hUpdate As IntPtr, _
  8.                                       ByVal lpType As Integer, _
  9.                                       ByVal lpName As Integer, _
  10.                                       ByVal wLanguage As Integer, _
  11.                                       ByVal lpData As Object, _
  12.                                       ByVal cbData As Integer) As Boolean
  13.    End Function
  14.  
  15.    <DllImport("kernel32.dll", setlasterror:=True)> _
  16.    Public Function EndUpdateResource(ByVal hUpdate As IntPtr, _
  17.                                      ByVal fDiscard As Boolean) As Boolean
  18.    End Function
  19.  
  20.    <DllImport("kernel32.dll", SetLastError:=True)> _
  21. Public Function LoadResource(ByVal hModule As IntPtr, _
  22.                             ByVal hResInfo As IntPtr) As IntPtr
  23.    End Function
  24.  
  25.    <DllImport("kernel32.dll", SetLastError:=True)> _
  26. Public Function LoadLibrary(ByVal lpFileName As String) As IntPtr
  27.    End Function
  28.  
  29.    <DllImport("kernel32.dll")> _
  30. Public Function FindResource(ByVal hModule As IntPtr, _
  31.                             ByVal lpName As Integer, _
  32.                             ByVal lpType As Integer) As IntPtr
  33.    End Function
  34.  
  35.    <DllImport("kernel32.dll")> _
  36. Public Function LockResource(ByVal hResData As IntPtr) As IntPtr
  37.    End Function
  38.  
  39.    <DllImport("kernel32.dll", SetLastError:=True, EntryPoint:="FreeLibrary")> _
  40. Public Function FreeLibrary(ByVal hModule As IntPtr) As Boolean
  41.    End Function
  42.  
  43.    <DllImport("kernel32.dll", SetLastError:=True)> _
  44. Public Function SizeofResource(ByVal hModule As IntPtr, _
  45.                               ByVal hResInfo As IntPtr) As UInteger
  46.    End Function
  47.  
  48.    <DllImport("kernel32.dll", CharSet:=CharSet.Unicode, EntryPoint:="EnumResourceNamesW", SetLastError:=True)> _
  49. Public Function EnumResourceNames(ByVal hModule As IntPtr, _
  50.                              ByVal lpszType As Integer, _
  51.                              ByVal lpEnumFunc As EnumResNameProcDelegate, _
  52.                              ByVal lParam As IntPtr) As Boolean
  53.    End Function
  54.  
  55.    Public Delegate Function EnumResNameProcDelegate(ByVal hModule As IntPtr, _
  56.                                                     ByVal lpszType As IntPtr, _
  57.                                                     ByVal lpszName As IntPtr, _
  58.                                                     ByVal lParam As IntPtr) As Boolean
  59.  

Puedes prepar el ejecutable a generar para buscar en el mismo el recurso, que no existe en el momento que generas el ejecutable, sino que se le agrega después de que se genera. Puedes buscar información de como se usan estas API, espero que te sirva de algo, si no logras dar con la funcionalidad avisas y te doy un ejemplo ;)
En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
Crazy.sx


Desconectado Desconectado

Mensajes: 447



Ver Perfil
Re: ¿Generar un ejecutable con configuraciones personalizadas desde otro ejecutable?
« Respuesta #3 en: 24 Noviembre 2012, 19:10 pm »

si me acuerdo que escribia esa informacion al final del archivo o en una sección, pero habia que saber donde segun la estructura del ejecutable PE. creo que los de visual basic .NET al compilarse a un codigo intermedio no se si eso afectara en la estructura y ese codigo sigue funcionando.

Creo que por ahi era la cosa, agregando los datos al final (EOF). Mmm, ahora que me acuerdo se trataban de tres cosas, había un "juntador", "cliente", "servidor" y era el juntador quien unificaba las cosas, pero el cliente y el servidor debían coincidir en los datos para que funcionara.

Seguiré buscando  :silbar:



Puedes agregar la información a los recursos del ejecutable como array de bytes, si la serializas, haciendo uso de las API:

Código
  1. .
  2. .
  3. .
  4.  

Puedes prepar el ejecutable a generar para buscar en el mismo el recurso, que no existe en el momento que generas el ejecutable, sino que se le agrega después de que se genera. Puedes buscar información de como se usan estas API, espero que te sirva de algo, si no logras dar con la funcionalidad avisas y te doy un ejemplo ;)

 :o No entendí esto Keyen Night, disculpa. ¿Dices sobre agregar el ejecutable a generar dentro del proyecto y enviarle los datos para configurarlo? :S
En línea

Destruir K. LOL
Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: ¿Generar un ejecutable con configuraciones personalizadas desde otro ejecutable?
« Respuesta #4 en: 24 Noviembre 2012, 21:21 pm »

Puedes intentar agregar los datos al final del ejecutable, y que los últimos 4 Bytes sean un Int32 que de el tamaño de los mismo, pero no se hasta que punto esto pueda dañar el ensamblado por eso te recomiendo los Resources.

Aquí esta un ejemplo, en Debug no funciona, vaya a saber quien por que :xD

Código
  1. Module Module1
  2.  
  3.    Sub Main()
  4.  
  5.        'El File.Exists es solo es para que el generador y la prueba sean el mismo archivo'
  6.        'en tu proyecto obviamente una cosa es el generador y otra es el ejecutable'
  7.        'que se genera, esto como es un ejemplo están las dos cosas juntas.'
  8.        If Not IO.File.Exists("C:\ejemplo.exe") Then
  9.  
  10.            'Hacemos una copia de nosotros mismos'
  11.            IO.File.Copy(Process.GetCurrentProcess.MainModule.FileName, "C:\ejemplo.exe")
  12.  
  13.            Dim mensaje As String = "Este mensaje fue introducido al final del ensamblado..."
  14.            Dim tamaño As Integer = mensaje.Length
  15.  
  16.            Dim ejemplo As New IO.FileStream("C:\ejemplo.exe", IO.FileMode.Open, IO.FileAccess.Write)
  17.  
  18.            'Nos vamos al final del archivo'
  19.            ejemplo.Seek(0, IO.SeekOrigin.End)
  20.  
  21.            'Escribimos un margen de 8 bytes vacíos, para evitar errores'
  22.            ejemplo.Write(New Byte(8 - 1) {}, 0, 7)
  23.  
  24.            'Escribimos el mensaje'
  25.            ejemplo.Write(System.Text.Encoding.Default.GetBytes(mensaje), 0, tamaño)
  26.  
  27.            'Escribimos la longitud del mismo'
  28.            ejemplo.Write(BitConverter.GetBytes(tamaño), 0, 4)
  29.  
  30.            ejemplo.Flush()
  31.            ejemplo.Close()
  32.  
  33.            'Iniciamos el ejecutable con el mensaje'
  34.            Process.Start("C:\ejemplo.exe")
  35.  
  36.        Else
  37.  
  38.            'Abrimos el archivo de nuestro propio proceso'
  39.            Dim Ensamblado As New IO.FileStream(Process.GetCurrentProcess.MainModule.FileName, IO.FileMode.Open, IO.FileAccess.Read)
  40.  
  41.            'Nos ubicamos 4 posiciones hacia atras desde el final'
  42.            Ensamblado.Seek(-4, IO.SeekOrigin.End)
  43.  
  44.            Dim Buffer As Byte() = New Byte(4 - 1) {}
  45.  
  46.            Dim TamañoDatos As Integer = 0
  47.  
  48.            'Leemos los ultimos 4 bytes'
  49.            Ensamblado.Read(Buffer, 0, 4)
  50.  
  51.            'Estos 4 bytes corresponden al tamaño del mensaje, estan Int32'
  52.            TamañoDatos = BitConverter.ToInt32(Buffer, 0)
  53.  
  54.            'Redimensionamos el buffer para recibir los datos'
  55.            ReDim Buffer(TamañoDatos - 1)
  56.  
  57.            'Nos colocamos al inicio del mensaje, tomando en cuenta que contamos'
  58.            'de atras hacia adelante el tamaño del mensaje y los 4 bytes que ocupaba'
  59.            'el tamaño del mismo'
  60.            Ensamblado.Seek(-TamañoDatos - 4, IO.SeekOrigin.End)
  61.  
  62.            'Leemos el mensaje'
  63.            Ensamblado.Read(Buffer, 0, TamañoDatos)
  64.  
  65.            Ensamblado.Close()
  66.  
  67.            'Imprimimos el mensaje'
  68.            Console.WriteLine(String.Format("Este ensamblado contiene el siguiente mensaje: {0}", _
  69.                                            System.Text.Encoding.Default.GetString(Buffer)))
  70.  
  71.            Console.Read()
  72.  
  73.        End If
  74.  
  75.    End Sub
  76.  
  77. End Module
  78.  
« Última modificación: 24 Noviembre 2012, 23:18 pm por Keyen Night » En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
Crazy.sx


Desconectado Desconectado

Mensajes: 447



Ver Perfil
Re: ¿Generar un ejecutable con configuraciones personalizadas desde otro ejecutable?
« Respuesta #5 en: 25 Noviembre 2012, 03:05 am »

Ok, gracias. Voy a probar a ver que me sale.

Encontré: El post del cual les comentaba pero el archivo ya no existe por lo que sigo en la misma :P
http://foro.elhacker.net/programacion_vb/source_editor_de_servers_completo-t171824.0.html;msg812090

Y aquí algo parecido pero no se cómo se lo pasaría a .NET: http://www.antrax-labs.org/2012/05/server-builder-vb6.html
« Última modificación: 25 Noviembre 2012, 04:34 am por Lucas.AR » En línea

Destruir K. LOL
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: ¿Generar un ejecutable con configuraciones personalizadas desde otro ejecutable?
« Respuesta #6 en: 26 Noviembre 2012, 13:37 pm »

Lo agregaría como recurso embebido al ejecutable con Mono.Cecil :P
http://hintdesk.com/c-how-to-edit-resource-of-an-assembly/
Otra opción es ver como lo han implementado en el código de flu :P

Saludos
« Última modificación: 26 Noviembre 2012, 13:56 pm por Novlucker » En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Compilar ejecutable desde otro (visual basic)
Programación Visual Basic
redired 7 3,604 Último mensaje 3 Mayo 2006, 01:53 am
por redired
Crear ejecutable para linux desde windows
Programación C/C++
Revkxis 9 6,610 Último mensaje 18 Mayo 2013, 20:54 pm
por CodeSource
Como programar ejecutable que lea url del navegador por defecto
Programación General
sancakoky 1 2,607 Último mensaje 28 Junio 2013, 08:17 am
por engel lex
como localizar un ejecutable desaparecido
GNU/Linux
egoyo 5 3,887 Último mensaje 18 Julio 2013, 17:09 pm
por egoyo
MOVIDO: como localizar un ejecutable desaparecido
Dudas Generales
Songoku 0 2,047 Último mensaje 17 Julio 2013, 19:30 pm
por Songoku
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines