Edit Server ,Server Builder vb.Net

Iniciado por Robokop, 14 Julio 2006, 02:21 AM

0 Miembros y 1 Visitante están viendo este tema.

Robokop

Editores de server y server builder
En esta mini guía voy a explicar o mas bien a dar ideas para crear editores de Server y generadores de Server para sus proyectos Cliente-Servidor.
Estos editores ayudan haciendo ver un poco mas profesional el trabajo realizado, aquí se va a usar la versión visual basic.Net 2005 Profesional , pero la Express servirá perfectamente

Todas estas ideas las saque de métodos que se usaban en VB6 ya notaran que son parecidas ,las ideas originales  las saque de la versión 6 no son mías pero de la .Net si .

Empezamos creando un proyecto grafico con 2 textbox y un commandButton.
Eso es para el editor




Algo así mas o menos debemos de dejar.
Luego ustedes podrán añadir mas opciones de mientras dejaremos esas para el ejemplo.
Creamos otro proyecto al que llamaremos Server ,igual que el anterior colocamos 2 textbox pero esta vez sin el comandButton.

Para poderlo editar perfectamente sin que se dañe el server , tenemos que abrirlo de forma binaria y colocar los datos hasta el Final del archivo.
Después cuando en el server debemos de leernos en forma binaria para obtener los datos.

Comencemos con el Edtor:

Primero importamos el nameSpace IO para poder trabajar con flujos de entrada y salida y de forma binaria.
Después en el form dentro del evento on click del commandButton colocamos este code:

Imports System.IO
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            Dim fs As FileStream
            Dim bw As BinaryWriter
            Dim directorio As String = "server.exe"
            fs = New FileStream(directorio, FileMode.Append, FileAccess.Write)
            bw = New BinaryWriter(fs)

            Dim puerto As String = TextBox1.Text
            Dim pass As String = TextBox2.Text

            Dim i As Integer
            For i = puerto.Length + 1 To 5
                puerto = " " + puerto
            Next
            Dim a As Integer
            For a = pass.Length + 1 To 5
                pass = " " + pass
            Next
            bw.Write(puerto & "\" & pass)
            bw.Close() : fs.Close()
        Catch ex As IOException
            Console.WriteLine("Error:" + ex.Message)
        End Try
    End Sub

End Class


Primero declaramos Fs como flujo de entrada y salida.
Bw lo declaramos para poder escribir en forma binaria la declaración binaryWriter nos permite eso.
Directorio es el lugar donde se encuentra el server.

Aquí:

    fs = New FileStream(directorio, FileMode.Append, FileAccess.Write)

Creamos un objeto con la variable fs ,el objeto es del tipo filestream por lo tanto nos permite la entrada y salida de datos ,en la primera posición va la aplicación a editar en ese caso server.exe ya declarado, después filemode nos permite elegir de que modo se va a abrir en este caso es append es decir al final del archivo para no dañar el contenido y por ultimo el modo de acceso que es para escribir.

CitarDim puerto As String = TextBox1.Text
            Dim pass As String = TextBox2.Text
Declaramos el valor de puerto y pass corresponden a las cajas de texto.

CitarDim i As Integer
            For i = puerto.Length + 1 To 5
                puerto = " " + puerto
            Next
Esta parte es muy importante y de aquí depende su funcionamiento:
Tenemos que tener contados y separados los caracteres para que cuando programemos el servidor no coma datos que no pertenecen por eso debemos de dejar un espacio predefinido.
Aquí estamos dejando un espacio para 5 caracteres, si no pusiéramos este código tendríamos que colocar exactamente 5 caracteres para que no diera error , así que esta parte nos permite poner cualquier cantidad entre 0 y 5  en cada caja de texto , si escribimos demás también nos dará un error para ello debemos de aumentar la cantidad.
Asi que contamos la longitud de la variable puerto y la llevamos  hasta 5 aumentado un espacio atras de la variable para que no de error , posteriormente quitaremos esos espacios en el server.

      Dim a As Integer
            For a = pass.Length + 1 To 5
                pass = " " + pass
            Next

Hacemos lo mismo que en el anterior codigo.
  bw.Write(puerto & "\" & pass)
            bw.Close() : fs.Close()

Procedemos a escribir los datos separados por una diagonal para posteriormente podelos separar.
y cerramos los flujos.
  Catch ex As IOException
            Console.WriteLine("Error:" + ex.Message)
        End Try

Si hay un error atrapamos la exepción y mostramos el mensaje de error evitando un cierre de programa.


SERVER

En el server ira el siguiente codigo:
CitarImports System.IO
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim br As BinaryReader '//Declaramos variable para abrir como binario//
        Dim nombre As String = "server.exe" '//fila a abrir
        Dim fs As FileStream '/Variable para flujo de entrada

        fs = New FileStream(nombre, FileMode.Open, FileAccess.Read) '/Condiciones flujo de entrada
        br = New BinaryReader(fs) '//Declaramos en binary reader condiciones de fs

        Dim puerto As String 'Variable en donde se almacena la info
        br.BaseStream.Seek(-12, SeekOrigin.End) 'nos pocicionamos al final menos 12
        puerto = br.ReadString '//Leemos 12 caracteres que equivale a 5 en un lado y 5 en otro
        'Se desperdicia -1 asi que para 10 seria -11 pero mas el "\".
        Dim lugar As Integer '//Lugar donde se encuentra el punto clave a separar.
        lugar = InStr(puerto, "\") 'Buscamos el punto clave y almacenamos su poscicion en lugar.
        Dim str2 As String 'Declaramos una variable para partir la original.
        str2 = puerto.Substring(lugar) 'La partimos desde el punto clave
        Dim str As String
        str = puerto.Remove(lugar - 1) 'Almacenamos en str lo removido despues del punto clave -1_
        'ese menos 1 es del "\"(la diagonal)
        TextBox1.Text = str.Trim 'Quitamos espacios
        TextBox2.Text = str2.Trim

        fs.Close() : br.Close() 'Cerramos los flujos.
    End Sub
End Class

Aqui ya tiene comentarios asi que solamente detallo las partes imporantes:

Citarbr.BaseStream.Seek(-12, SeekOrigin.End)
        puerto = br.ReadString
        Dim lugar As Integer
        lugar = InStr(puerto, "\")
aqui usamos el objeto br y la propiedad baseStream para poder acceder a seek , en accesos aleatorios podemos usar Seek directamente pero como estamos en binario nos basamos de baseStream para abrirlo.

Seek nos permite posicionarnos en cualquier parte de un fichero SeekOrigin.End nos permite colocarnos al final del archivo es -12 porque:
5+5 de los datos de las cajas de texto van 10 , + 1 de la diagonal ("\") y menos 1 que siempre se debe de restar ese uno y van 12, si quisiéramos que el usuario pudiera introducir 6 caracteres en cada caja tendríamos que poner -14 en lugar de -12 y así sucesivamente dependiendo de las necesidades del programa.
Recuerden que si van a aumentar aquí tendrían que hacerlo también en el servidor para registrar mas espacios en caso que no se completaran los caracteres.

y fin del editor de server ahora ya podemos hacer las pruebas.



Constructor del server
Este nos permite generar el servidor a partir del ejecutable .
El codigo del editor esta vez sería así:
Imports System.IO
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        serverbuild()
        Try
            Dim fs As FileStream
            Dim bw As BinaryWriter
            Dim directorio As String = "server.exe"
            fs = New FileStream(directorio, FileMode.Append, FileAccess.Write)
            bw = New BinaryWriter(fs)

            Dim puerto As String = TextBox1.Text
            Dim pass As String = TextBox2.Text

            Dim i As Integer
            For i = puerto.Length + 1 To 5
                puerto = " " + puerto
            Next
            Dim a As Integer
            For a = pass.Length + 1 To 5
                pass = " " + pass
            Next
            bw.Write(puerto & "\" & pass)
            bw.Close() : fs.Close()
        Catch ex As IOException
            MsgBox("Error:" + ex.Message)



        End Try
    End Sub

    Sub serverbuild()
        Dim cliente As String
        Dim server As String
        FileOpen(1, My.Application.Info.DirectoryPath & "\" & My.Application.Info.AssemblyName & ".exe", OpenMode.Binary, OpenAccess.Read)
        cliente = Space(LOF(1) - 28672)
        server = Space(28672)
        FileGet(1, cliente)
        FileGet(1, server)
        FileClose(1)
        FileOpen(2, My.Application.Info.DirectoryPath & "\" & "server.exe", OpenMode.Binary)
        FilePut(2, server)
        FileClose(2)
    End Sub


Lo que cambia es que en la propiedad del click llamamos a serverBuild antes  y creamos un nuevo subprocedimiento que es el que llamamos :
CitarFileOpen(1, My.Application.Info.DirectoryPath & "\" & My.Application.Info.AssemblyName & ".exe", OpenMode.Binary, OpenAccess.Read)
Nos abrimos a nostros mismos , el 1 es un identificador como #1 que declarabas en visual basic  y nos abrimos en modo binario para leer.

Citarcliente = Space(LOF(1) - 28672)
        server = Space(28672)
Almacenamos en cliente el espacio que resta despues de 28672 bits que es el peso del server, para saberlo , antes compilamos el server , vamos a propiedades y vemos el peso ese peso lo remplazamos por 28672 , LOF(1) nos permite llegar al final de un archivo.
Despues hacemos lo mismo con server pero esta vez el espacio restante que es lo que pesa el.


  FileOpen(2, My.Application.Info.DirectoryPath & "\" & "server.exe", OpenMode.Binary)
        FilePut(2, server)

Creamos el directorio server.exe en modo binario y colocamos los datos que obtuvimos en server.

En el server es el mismo codigo y la misma explicación.

Ahora para poder generar un solo ejecutable tenemos que descargar un editor hexadecimal(Por cierto quiero dar un parentesis para agradecer a WarGhost que el me dio la idea del generador del server en Visual Basic 6 yo la pase al .Net para ayudar a los que han cambiado a este lenguaje).

El editor hexadecimal es para pegar los datos del server y el cliente , para dejar uno solo.
Primero debemos de dejar los datos del Cliente y luego los del server , así que abrimos con el editor el Server y copiamos todos sus datos .
Luego abrimos el editor y nos vamos hasta al final hasta el ultimo cero que haya y lo pegamos .
Por ultimo guardamos lo editado con extensión .exe y listo ya
lo tenemos.

Creo que no van a quedar tantas dudas pues lo explique muy especificamente , pero cualquier cosa dila .
Seguro que con esto van a surgir nuevas ideas , que van a acortar muchisimo mas el codigo y lo van a hacer un poco mas facíl eso ya esta en su imaginación.

Por si se llegaran a presetar dificultades dejo los proyectos , junto con el ServerBuilder ya Compilado
http://mx.geocities.com/esteban_7_21/ProyectoNet.zip

Salu2

songless

Leyendo el código... es imposible saber que hace el programa. Estás haciendo un programa que modifica otro, un joiner, un...

Pero reconozco que lo que más me ha interesado es cuando dices que con un editor hexadecimal pegas cliente y servidor en un ejecutable.

¿ COMOR ? Eso suena sugerente  :)


Robokop

#2
El programa lo que hace es la funcion de un editor de un server como en los troyanos , que en lugar de configurar un puerto predeterminado para la conexion dejas que otra la aplicacion lo decida ya que se supone que el servidor no debe de interactuar para que se configure en la otra computadora .
Lo del editor hexadecimal , es para generar una aplicacion idependiente de otra pero en una sola , asi que lo que tienes que hacer con el editor es colocar los datos del server al final del cliente y guardarlo como ejecutable entonces con el codigo que coloque lo va a generar.

CitarLeyendo el código... es imposible saber que hace el programa.
Para eso esta la explicacion.

Si no comprendes el funcionamiento baja el proyecto dentro viene el generador del server para que veas como funciona.



Editado , note que al tener que recojer muchos datos era muy laborioso y problematico asi que estuve buscando en muchos NameSpaces para encontrar otro método mucho mas facil y corto.

Edit Server 2 (Mas Fácil y corto)

Cliente

Antes en el cliente teniamos que implementar una funcion para añadir espacios antes pero ya no porque Ahora vamos a prefedinir esa longitud sin caracteres el codigo es :


Imports Microsoft.VisualBasic.Compatibility
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim port As New VB6.FixedLengthString(5)
        Dim pass As New VB6.FixedLengthString(20)
        port.Value = TextBox1.Text
        pass.Value = TextBox2.Text
        FileOpen(1, "Vamos.exe", OpenMode.Binary)
        FilePut(1, port.Value, LOF(1) + 1)
        FilePut(1, pass.Value, LOF(1) + 1)
        FileClose(1)
    End Sub
End Class


En este se va a editar el server cuando se haca click en el botón
Dim port As New VB6.FixedLengthString(5)
        Dim pass As New VB6.FixedLengthString(20)

Declaramos la varibles como objetos y usamos un metodo primitivo de vb6 para definir la longitud que va a llevar :
port es de 5 caracteres y pass de 20.
Con este codigo si el usuario escribe de mas no pasa nada ya que elimina los caracteres restantes automaticamente.

     port.Value = TextBox1.Text
        pass.Value = TextBox2.Text

Como lo creamos a un objeto tenemos que usar la propiedad value o valor , para referenciarlos con las cajas de texto.

FileOpen(1, "Server.exe", OpenMode.Binary)
1 es la declaracion que define el archivo , server.exe es el nombre del programa que vamos a editar y openmode.binary el modo que lo abrimos que es binario.

FilePut(1, port.Value, LOF(1) + 1)
Ponemos los datos al final del archivo pero separado por un espacio para eso es ese + 1
  FileClose(1)
Cerramos el flujo.

Server

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim port As New VB6.FixedLengthString(5)
        Dim pass As New VB6.FixedLengthString(20)
    FileOpen(1, My.Application.Info.AssemblyName & ".exe", OpenMode.Binary, OpenAccess.Read)
        FileGet(1, port.Value, LOF(1) - 24)
        FileGet(1, pass.Value)
        FileClose(1)
        TextBox1.Text = Trim(port.Value)
        TextBox2.Text = Trim(pass.Value)
    End Sub
End Class


Dim port As New VB6.FixedLengthString(5)
        Dim pass As New VB6.FixedLengthString(20)

Definimos los espacios de port y pass , tienen que ser la misma cantidad que los que difinimos en el cliente

FileOpen(1, My.Application.Info.AssemblyName & ".exe", OpenMode.Binary, OpenAccess.Read)
Nos abrimos a nosotros mismos en modo binario

FileGet(1, port.Value, LOF(1) - 24)
fileget nos permite tomar valores, port.value son los espacios predefinidos y lof(1) nos permite llegar al final del archivo pero -24 espacios que son los que guardamos , es 24 porque 20+5-1=24 es-1 siempre se le resta menos 1.

FileGet(1, pass.Value)
Como ya definimos desde donde iva a empezar ya no es necesario restar los -24.
Se delimita gracias a los valores que apartamos en las declaraciones.

FileClose(1)
        TextBox1.Text = Trim(port.Value)
        TextBox2.Text = Trim(pass.Value)

Cerramos el flujo y quitamos los espacios sobrantes.

Descarga de proyecto: Aqui

surfrio