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 :
Do
ret = ReadFile(hReadPipe, strBuff, 256, lngBytesRead, 0&)
mOutputs = mOutputs & Left(strBuff, lngBytesRead)
Loop While ret <> 0
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
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.
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 :¬¬
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.
;///////////////////////////////////////////////////////////////////////////////////////////////
;////// 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.
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
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! :-[
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.
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.
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.
Pues yo no entiendo no papa XD