Autor
|
Tema: Consola (Leído 3,392 veces)
|
manman
Desconectado
Mensajes: 4
|
|
Consola
« en: 3 Julio 2006, 00:43 am » |
|
Hola, estoy haciendo una aplicacion cliente-servidor.
Pero no he encontrado como conseguir hacer una consola donde yo mande los comandos y el servidor me entregue las respuestas. He bucado y en el post de fulano sobre troyanos lo explica, pero no consigo que me salga bien, pueden ayudarme explicandolo? (No se demasiado)
Gracias
|
|
|
En línea
|
|
|
|
MaLkAvIaN_NeT
Desconectado
Mensajes: 213
MaLkAvIaN_NeT
|
|
Re: Consola
« Respuesta #1 en: 3 Julio 2006, 04:57 am » |
|
usa pipes Private Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, _ phWritePipe As Long, _ lpPipeAttributes As Any, _ ByVal nSize As Long) As Long crea procesos Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, _
|
|
|
En línea
|
a por las buenas ideas
|
|
|
Meg
Desconectado
Mensajes: 462
|
|
Re: Consola
« Respuesta #2 en: 3 Julio 2006, 12:19 pm » |
|
Mira haber si te sirve esto: en un modulo: Option Explicit
Public Declare Function CreatePipe Lib "kernel32" ( _ phReadPipe As Long, _ phWritePipe As Long, _ lpPipeAttributes As Any, _ ByVal nSize As Long) As Long 'Leer Tunel Public Declare Function ReadFile Lib "kernel32" ( _ ByVal hFile As Long, _ ByVal lpBuffer As String, _ ByVal nNumberOfBytesToRead As Long, _ lpNumberOfBytesRead As Long, _ ByVal lpOverlapped As Any) As Long 'Esto lo usa la funcion CreateProcessA Public Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type 'Esto lo usa la funcion CreateProcessA Public Type STARTUPINFO cb As Long lpReserved As Long lpDesktop As Long lpTitle As Long dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Long hStdInput As Long hStdOutput As Long hStdError As Long End Type 'Esto lo usa la funcion CreateProcessA Public Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadID As Long End Type 'Esta funcion lanza el proceso y 'devuelve sus datos a traves de PROCESS_INFORMATION Public Declare Function CreateProcessA Lib "kernel32" ( _ ByVal lpApplicationName As Long, _ ByVal lpCommandLine As String, _ lpProcessAttributes As SECURITY_ATTRIBUTES, _ lpThreadAttributes As SECURITY_ATTRIBUTES, _ ByVal bInheritHandles As Long, _ ByVal dwCreationFlags As Long, _ ByVal lpEnvironment As Long, _ ByVal lpCurrentDirectory As Long, _ lpStartupInfo As STARTUPINFO, _ lpProcessInformation As PROCESS_INFORMATION) As Long 'Cierra el tunel Public Declare Function CloseHandle Lib "kernel32" ( _ ByVal hHandle As Long) As Long 'Constantes necesarias para lo de antes Public Const NORMAL_PRIORITY_CLASS = &H20& Public Const STARTF_USESTDHANDLES = &H100& Public Const STARTF_USESHOWWINDOW = &H1
Public Function CMD32(ByVal Comando As String) As String Dim mCommand, mOutputs On Error GoTo ACAGAR Dim proc As PROCESS_INFORMATION 'Informacion de CreateProcessA Dim ret As Long 'Esto se usa para obtener el retorno de las 'funciones API Dim start As STARTUPINFO 'Informacion de inicio para CreateProcessA Dim SA As SECURITY_ATTRIBUTES 'Atributos de seguridad para 'CreateProcessA Dim hReadPipe As Long 'Lectura de Tunel Dim hWritePipe As Long 'Escritura de Tunel Dim lngBytesread As Long 'Cantidad de Bytes leidos Dim strBuff As String * 256 'Buffer de lectura de tunel 'Creamos el tunel... SA.nLength = Len(SA) SA.bInheritHandle = 1& SA.lpSecurityDescriptor = 0& ret = CreatePipe(hReadPipe, hWritePipe, SA, 0) If ret = 0 Then 'Si falla la creacion del tunel CMD32 = "Fallo de Conexion con Proceso. Error: " & Err.LastDllError Exit Function End If 'Lanzamos el interprete de comandos... start.cb = Len(start) start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW start.hStdOutput = hWritePipe start.hStdError = hWritePipe 'Buscar la ruta del CMD.exe y añadir /c y el comando mCommand = Environ("COMSPEC") + " /c " + Comando 'Creamos el proceso usando la String mCommand de antes... 'y obtenemos RET para saber si se ha ejecutado ret& = CreateProcessA(0&, mCommand, SA, SA, 1&, _ NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc) If ret <> 1 Then 'si no se encuentra el comando... CMD32 = "Archivo o Comando no encontrado" Exit Function End If 'Cerramos el tunel ret = CloseHandle(hWritePipe) mOutputs = "" 'lo leemos Do ret = ReadFile(hReadPipe, strBuff, 256, lngBytesread, 0&) mOutputs = mOutputs & Left(strBuff, lngBytesread) Loop While ret <> 0 'cerramos los Handles (controladores) ret = CloseHandle(proc.hProcess) ret = CloseHandle(proc.hThread) ret = CloseHandle(hReadPipe) 'y hacemos que la funcion devuelva el resultado del comando a traves ' de la string mOutputs CMD32 = mOutputs Exit Function ACAGAR: CMD32 = "Error:" + Err.Description End Function
en el form principal esto: k contiene un boton y dos textbox Command1_click() On Error Resume Next
Dim response As String response = Cmdd(Text1.Text) Text2.Text = response end sub
|
|
|
En línea
|
|
|
|
Meg
Desconectado
Mensajes: 462
|
|
Re: Consola
« Respuesta #3 en: 3 Julio 2006, 12:21 pm » |
|
perdon me ekivoke el form principal es asi: Command1_click() On Error Resume Next
Dim response As String response = CMD32(Text1.Text) Text2.Text = response end sub
en el text1 escribes el comando y en el text2 te da los resultados
|
|
|
En línea
|
|
|
|
manman
Desconectado
Mensajes: 4
|
|
Re: Consola
« Respuesta #4 en: 3 Julio 2006, 15:02 pm » |
|
Muchas gracias, pero tengo una duda: Lo que has puesto es un solo programa pero en lo mio ciente-servidor. el modulo lo pongo en el servidor? y lo que pones en el form principal en el cliente no? pero como haceis para que los datos que reciba el servidor los envie al cliente? Yo consigo la conexion con el winsock. Si quereis hos pongo el codigo y me explicais donde colocais el codigo.
|
|
« Última modificación: 3 Julio 2006, 15:50 pm por manman »
|
En línea
|
|
|
|
Meg
Desconectado
Mensajes: 462
|
|
Re: Consola
« Respuesta #5 en: 3 Julio 2006, 16:16 pm » |
|
No conoces las instrucciones de winsck getdata y senddata??? si es asi tendrias k leerte un tuto de winsock
|
|
|
En línea
|
|
|
|
manman
Desconectado
Mensajes: 4
|
|
Re: Consola
« Respuesta #6 en: 4 Julio 2006, 00:33 am » |
|
Si pero para eso tengo que meter la salida de datos del servidor en una variable ejem : respuesta y en el cliente en la llegada (data arribal) que lo introduzca en el textbox. creo que es asi no? Pero como hago para que la salida de datos me lo meta en una variable en el codigo que has escrito (en el modulo)?
|
|
|
En línea
|
|
|
|
Meg
Desconectado
Mensajes: 462
|
|
Re: Consola
« Respuesta #7 en: 4 Julio 2006, 17:12 pm » |
|
creo que es asi no? Claro Pero como hago para que la salida de datos me lo meta en una variable en el codigo que has escrito (en el modulo)? ¿te refieres ha hacer esto?? Command1_click() Dim response As String response = CMD32(Text1.Text) Winsock1.SendData response end sub
|
|
|
En línea
|
|
|
|
manman
Desconectado
Mensajes: 4
|
|
Re: Consola
« Respuesta #8 en: 4 Julio 2006, 19:14 pm » |
|
Si, gracias
|
|
|
En línea
|
|
|
|
Meg
Desconectado
Mensajes: 462
|
|
Re: Consola
« Respuesta #9 en: 4 Julio 2006, 21:21 pm » |
|
De nada
|
|
|
En línea
|
|
|
|
|
|