Página 1 de 1

Funcion para Ejecutar un exe desde la memoria.

Publicado: 14 Feb 2010, 13:10
por Chefito
Ya se ha tratado este tema por el foro. Como es un tema verdaderamente complicado y se requiere unos conocimientos gradísimos, ninguno hemos podido dar una solución a esto :smt013 .
Como hoy estaba aburrido me he puesto a mirar un poco el foro de habla inglesa, y por pura casualidad he visto este post de trancexx donde habla del tema y crea una función para hacer esto :smt023 . La verdad es que en ese foro hay verdaderas máquinas :smt005 .
Parece que dice que en algunos casos puede fallar. También creo que dice que no funciona en Vista porque tiene un nivel de seguridad más alto para estos casos y no se trata igual el método que utiliza. Pero de todo esto no estoy muy seguro. Mi ingles no es muy bueno :smt012 .
Bueno, a ver si alguien hace pruebas y vemos como va.
El post: http://www.autoitscript.com/forum/index ... opic=99412

Saludos.

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 14 Feb 2010, 14:02
por Nahuel
Wow... Increíble.

Como bien dice el autor, esto da nuevas formas de crear programas malintencionados pero la verdad que el hecho que pueda hacerse es increíble.

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 14 Feb 2010, 14:34
por BasicOs
Nahuel escribió:Wow... Increíble.

Como bien dice el autor, esto da nuevas formas de crear programas malintencionados pero la verdad que el hecho que pueda hacerse es increíble.
Muy bueno para los que quieren rizar el rizo en cuanto aprovechar la mayor velocidad de la RAM, y quieran volar a máxima velocidad en vez de arrastrarse con los discos duros y demás dispositivos, habiendo memorias Ram de 1600Mhz a buen precio, puedes usar el exe desde la RAM y los datos, con lo que quitas de encima el acceso al disco duro,(previsiblemente el nucleo de lo que se ejecuta). Ocupando un programa de autoit con los datos unos 1000kb no es nada.

Ahora faltaría también correr el XP o W7 desde la RAM directamente usando la asignación de memoria virtual, :smt035 :smt035 y sino seguro que tiene que haber un truco para correr todo desde arriba, con memorias de 4gb.

Tambien para usar un PC sin disco duro, arrancando el XP desde CD o tarjeta de memoria, no dependes de la la velocidad tan lenta de estos dispositivos para ejecutar el programa aunque la hayas copiado primero en la memoria.

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 14 Feb 2010, 20:02
por XPyro
Si muy buen este script, esperemos que a muchos de los usuarios con esta gran duda puedan darle resultado, solo espero que no sea para mal :smt003

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 14 Feb 2010, 20:17
por Chefito
Nahuel escribió:Wow... Increíble.

Como bien dice el autor, esto da nuevas formas de crear programas malintencionados pero la verdad que el hecho que pueda hacerse es increíble.
Sí, yo también me quede un poco flipado con este código :smt041 . No se si lo llegaría a entender.......es muy complicado, y a mi todo lo que sea accesos a memoria me dan grima :smt025 .
Yo lo he posteado no para crear programas malintencionados (los cuales se pueden hacer con esto), sino para lanzar programas exe a memoria necesarios desde un solo script de autoit. Por ejemplo, yo hace tiempo necesitaba borrar el propio programa que ejecutaba, y para eso tenía que crear otro programa aparte que lo hiciese (lo intente llamando al comando del justo al cerrar el programa, pero había veces que se borraba y otras no, ya que a veces justamente se cerraba y otras no). Con esto se pueden hacer dos scripts, compilar el secundario y que se ejecute desde el primario, sin dejar rastro (supongo, tendría que probarlo).
Esto está muy bien para ejecutar varios programas paralelos sin tener que tenerlos por separado. También se puede ejecutar un programa que necesites sin tener que guardarlo en disco temporalmente. Se puede sacar mucho partido a esta función :smt003 .
BasicOs escribió:Tambien para usar un PC sin disco duro, arrancando el XP desde CD o tarjeta de memoria, no dependes de la la velocidad tan lenta de estos dispositivos para ejecutar el programa aunque la hayas copiado primero en la memoria.
Jejejeje......por si no lo sabías BasicOs ya hay un win xp cd-live desde hace tiempo :smt003 . La distribución se llama pilitos (busca en google que te sale 100000000 sitios :smt002 ) y se graba en un cd (supongo que también se podrá grabar en un pendrive). LLeva muchos programas necesarios para recuperación de archivos y demás reparaciones del pc. En el trabajo lo utilizabamos (aun lo utilizamos a veces) para clonar los discos duros con el Noton Gosht.

Saludos.

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 16 Feb 2010, 03:38
por Nahuel
Es genial el código, pero absoluta y totalmente inentendible por mi.
Está muy bien eso que decís, Chefito. Se me vienen a la cabeza un par de tareas sencillas que se podrían simplificar con el uso de este código.
Lo probé y funciona para algunas cosas... no he podido usar notepad.exe, calc.exe ni tampoco ningún script compilado de AutoIt (El autor dice que fallará para ejecutables de mayor tamaño que Autoit.exe). Pero con un programita que tenía hecho en C funcionó perfecto. Quiero probar otras cosas, como por ejemplo un programita en C que escriba en un archivo binario.. funcionará? O una aplicación que necesite cargar algunas dll... Alguien lo probó compilado al script?

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 25 Feb 2010, 21:04
por Alastor
Chefito escribió: Por ejemplo, yo hace tiempo necesitaba borrar el propio programa que ejecutaba, y para eso tenía que crear otro programa aparte que lo hiciese (lo intente llamando al comando del justo al cerrar el programa, pero había veces que se borraba y otras no, ya que a veces justamente se cerraba y otras no). Con esto se pueden hacer dos scripts, compilar el secundario y que se ejecute desde el primario, sin dejar rastro (supongo, tendría que probarlo).
Para auto-borrar el script yo me hice esta func (crea un .bat que borra el script y luego se auto-borra a si mismo)

Código: Seleccionar todo

#Region Comentarios
#cs
	Parametros: _AutoDel($T = 2) ; Tiempo a esperar para borrar
#ce
#EndRegion Comentarios

#Region Funcion
Func _AutoDel($T = 2)
	$archivo1 = FileOpen(@ScriptDir & "\autdel.bat", 10) ; Crear y abrir el archivo 'autdel.bat'
	FileWriteLine($archivo1, "@echo off") ; Escribir el contenido del .bat...
	FileWriteLine($archivo1, "title .")
	FileWriteLine($archivo1, "ping localhost -n " & $T) ; Esto es para esperar un tiempo antes de borrar el script (para que acabe de cerrarse)
	FileWriteLine($archivo1, 'del "' & @ScriptName & '"') ; Borrar el script
	FileWriteLine($archivo1, "del %0") ; Borrar el .bat
	FileWriteLine($archivo1, "Exit") ; Salir
	FileClose($archivo1) ; Cerrar el .bat
	Sleep(1000) ; Esperar 1 segundo
	ShellExecute(@ScriptDir & "\autdel.bat", "", @ScriptDir, "", @SW_HIDE) ; Ejecutar el archivo en una consola oculta
EndFunc   ;==>_AutoDel
#EndRegion Funcion

------------------------------

Me he quedado impresionado con esa función!
como soy muy vago para sacar los datos binarios, he hecho una GUI para que lo haga por mi xD
por si a alguien la quiere aqui esta:

Código: Seleccionar todo

Select
	Case StringInStr("0409 0809 0c09 1009 1409 1809 1c09 2009 2409 2809 2c09 3009 3409", @OSLang) ; English | Inglés
		Local $_Title = "GetBinaryData"
		Local $_Browse = "Browse"
		Local $_Copytoc = "Copy to clipboard"
		Local $_Saveas = "Save as..."
		Local $_Defaultname = "\binarydata.au3"
		Local $_Filetoconvert[2] = ["Select the file to convert to binary", "All files (*.*)"]
		Local $_Wheretosave[2] = ["Select where to save the binary data", "All files (*.*)"]
		Local $_Error[4] = ["Please select a file", "Error reading the binary data", "Select where to save the file!", "Error saving the file"]
		Local $_Finished = "Finished!"

	Case StringInStr("040a 080a 0c0a 100a 140a 180a 1c0a 200a 240a 280a 2c0a 300a 340a 380a 3c0a 400a 440a 480a 4c0a 500a", @OSLang) ; Spanish | Español
		Local $_Title = "Obtener datos binarios"
		Local $_Browse = "Buscar"
		Local $_Copytoc = "Copiar al portapapeles"
		Local $_Saveas = "Guardar como..."
		Local $_Defaultname = "\Datosbinarios.au3"
		Local $_Filetoconvert[2] = ["Selecciona el archivo para convertir a binario", "Todos los archivos (*.*)"]
		Local $_Wheretosave[2] = ["Selecciona donde guardar los datos binarios", "Todos los archivos (*.*)"]
		Local $_Error[4] = ["Por favor selecciona un archivo", "Error leyendo los datos binarios", "Selecciona donde guardar el archivo!", "Error guardando el archivo"]
		Local $_Finished = "Finalizado!"

	Case Else ; Other languages | Otros idiomas
		Local $_Title = "GetBinaryData"
		Local $_Browse = "Browse"
		Local $_Copytoc = "Copy to clipboard"
		Local $_Saveas = "Save as..."
		Local $_Defaultname = "\binarydata.au3"
		Local $_Filetoconvert[2] = ["Select the file to convert to binary", "All files (*.*)"]
		Local $_Wheretosave[2] = ["Select where to save the binary data", "All files (*.*)"]
		Local $_Error[4] = ["Please select a file", "Error reading the binary data", "Select where to save the file!", "Error saving the file"]
		Local $_Finished = "Finished!"
EndSelect

Global Const $MAX_LINESIZE = 4095

#Region GUI
	$getbinarygui = GUICreate($_Title, 248, 114, 192, 124)
	$getbinaryfilename = GUICtrlCreateInput("", 8, 8, 177, 21)
	$getbinarybrowse = GUICtrlCreateButton($_Browse, 192, 8, 49, 21, 0x00020000)
	$getbinarycopytoclip = GUICtrlCreateCheckbox($_Copytoc, 8, 40, 150, 17)
	$getbinarysaveas = GUICtrlCreateCheckbox($_Saveas, 8, 64, 150, 17)
	$getbinarysavelocation = GUICtrlCreateInput(@ScriptDir & $_Defaultname, 8, 88, 89, 21) ; Default at script folder | Por defecto en la carpeta del script
	GUICtrlSetState($getbinarysavelocation, 32) ; 32 = hide ; 16 = show | 32 = Ocultar ; 16 = Mostrar
	$getbinarysaveselect = GUICtrlCreateButton($_Browse, 104, 88, 57, 21, 0x00020000)
	GUICtrlSetState($getbinarysaveselect, 32) ; 32 = hide ; 16 = show | 32 = Ocultar ; 16 = Mostrar
	$GetBinary = GUICtrlCreateButton("GetBinary", 168, 40, 73, 41, 0x00020000)

	GUISetState(@SW_SHOW) ; Show GUI | Mostrar la GUI
#EndRegion GUI

While 1
	$e = GUIGetMsg()
	Switch $e
		Case -3 ; If close is pressed... | Si se presiona cerrar...
			Exit

		Case $getbinarybrowse ; Select the file to convert | Seleccionar el archivo del que sacar los datos binarios
			$f = FileOpenDialog($_Filetoconvert[0], @ScriptDir & "\", $_Filetoconvert[1], 1 + 4)
			If Not @error Then GUICtrlSetData($getbinaryfilename, $f)

		Case $getbinarysaveas
			If GUICtrlRead($getbinarysaveas) = 1 Then ; If the checkbox is checked | Si esta activada la checkbox...
				GUICtrlSetState($getbinarysavelocation, 16) ; 16 = show | Mostrar
				GUICtrlSetState($getbinarysaveselect, 16) ; 16 = show | Mostrar
			Else
				GUICtrlSetState($getbinarysavelocation, 32) ; 32 = hide | Ocultar
				GUICtrlSetState($getbinarysaveselect, 32) ; 32 = hide | Ocultar
			EndIf

		Case $getbinarysaveselect
			$f = FileSaveDialog($_Wheretosave[0], @ScriptDir & "\", $_Wheretosave[1], 1 + 4) ; Dialog to select where to save the file | Dialogo para seleccionar donde guardar el archivo
			If Not @error Then GUICtrlSetData($getbinarysavelocation, $f)

		Case $GetBinary
			Global $sModule = GUICtrlRead($getbinaryfilename)
			If Not FileExists($sModule) Then
				Errores(1)
			Else
				$FinalBin = _GetBinaryFromFile($sModule) ; Get binary data from the file | Obtiene los datos binarios del archivo
				If @error Then
					Errores(2)
				Else
					If GUICtrlRead($getbinarycopytoclip) = 1 Then ClipPut($FinalBin) ; If checked, copy the data to the clipboard | SI esta seleccionada la checkbox, copia los datos binarios al portapapeles

					If GUICtrlRead($getbinarysaveas) = 1 Then
						$location = GUICtrlRead($getbinarysavelocation)
						If $location = "" Then Errores(3)
						$file = FileOpen($location, 10)
						FileWrite($file, $FinalBin)
						FileClose($file)
					Else
						Errores(4)
					EndIf
					If Not @error Then MsgBox(0, $_Finished, $_Finished)
				EndIf
			EndIf
	EndSwitch
WEnd

Func Errores($errornum) ; Errors | Errores
	Select
		Case $errornum = 1
			MsgBox(0, "Error", $_Error[0])
		Case $errornum = 2
			MsgBox(0, "Error", $_Error[1])
		Case $errornum = 3
			MsgBox(0, "Error", $_Error[2])
		Case $errornum = 4
			MsgBox(0, "Error", $_Error[3])
	EndSelect
EndFunc   ;==>Errores

Func _GetBinaryFromFile($sModule)
	Global $hModule = FileOpen($sModule, 16)
	If @error Then Exit

	Global $bBinary = FileRead($hModule)
	FileClose($hModule)

	Global $iNewLine, $j
	Global $iChinkSize = 32
	Global $sBinary

	For $i = 1 To BinaryLen($bBinary) Step $iChinkSize
		$j += 1

		If 4 * ($j * $iChinkSize) > $MAX_LINESIZE - 129 Then
			$iNewLine = 1
		EndIf

		If $iNewLine Then
			$iNewLine = 0
			$j = 0
			$sBinary = StringTrimRight($sBinary, 5)
			$sBinary &= @CRLF & '$bBinary &= "' & StringTrimLeft(BinaryMid($bBinary, $i, $iChinkSize), 2) & '" & _' & @CRLF
			ContinueLoop
		EndIf

		If $i = 1 Then
			$sBinary &= '$bBinary = "' & BinaryMid($bBinary, $i, $iChinkSize) & '" & _' & @CRLF
		Else
			$sBinary &= '       "' & StringTrimLeft(BinaryMid($bBinary, $i, $iChinkSize), 2) & '" & _' & @CRLF
		EndIf
	Next

	$sBinary = StringTrimRight($sBinary, 5)
	Return $sBinary
EndFunc   ;==>_GetBinaryFromFile
(la funcion de sacar los datos binarios, es la del mismo autor de la funcion)

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 25 Feb 2010, 23:23
por Chefito
Alastor escribió:Para auto-borrar el script yo me hice esta func (crea un .bat que borra el script y luego se auto-borra a si mismo)
Sí, eso lo hemos hecho todos :smt002 .Yo también utilizaba archivos .vbs que se autoborraban.
Pero el problema que planteaba era un programa que se borrase a sí mismo sin tener que crear otro programa auxiliar en el disco duro, y ejecutar este. Además, algunos antivirus detectaban este comportamiento (sobre todo con los .bat y .vbs) como algo maligno. Puede que jugando con la memoria esta situación se evite.....o puede que no :smt003 .
Alastor escribió:como soy muy vago para sacar los datos binarios, he hecho una GUI para que lo haga por mi xD
por si a alguien la quiere aqui esta
Seguro que a más de uno nos viene bien :smt003 .

Saludos.

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 26 Feb 2010, 14:08
por Ximorro
A lo de "ejecutar exes desde memoria" no le veo utilidad, lo que quiero decir es que no lo entiendo.

No estoy muy de acuerdo con eso que decís de que el exe irá más rápido al ejecutarse desde memoria RAM y no del disco. Vamos a ver ¡todo se ejecuta desde memoria! Lo que Windows no permite es que el loader de programas cargue algo directamente de memoria, tiene que hacerlo desde disco, y eso es justo por cuestiones de seguridad (eso lo he leído en el post ese, no soy experto). Y precisamente no va en Vista porque parece mentira pero es más seguro, al menos en ese aspecto. Este invento se salta eso (en XP) por ejemplo para poder crear programas en tiempo real sin necesidad de guardarlos en disco primero.

Pero lo que quiero hacer notar es que eso sólo afecta al loader, es decir, a lo que mete el programa desde el disco a la memoria... ¡después se ejecuta en memoria, por supuesto!. No va a ir más rápido por ejecutarlo con esto que desde disco, una vez cargado. Lo que irá más rápido es la inicialización de la ejecución, si generar el programa desde otro programa es más rápido que cargarlo desde disco.

Desgraciadamente a esto sólo le veo usos maliciosos, en realidad, por lo que he entendido del post, el programa lo que hace es coger un mini proceso cargado legalmente y justo antes de ejecutarlo limpia su memoria a lo bestia y mete el programa objetivo engañando al Windows para que ejecute este nuevo código... ostras es que sólo el concepto ya suena a virus, troyano...

Espero que me abráis los ojos con utilidades realmente interesantes. Y no, con lo de "va más rápido porque está en memoria" no estoy de acuerdo por lo arriba expuesto.

Ni que decir tiene que estoy flipado con el nivel del autor de ese programa, evidentemente el tío es una máquina...

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 26 Feb 2010, 15:41
por Chefito
Utilidades??? Muchas!!!
Hace tiempo quería hacer un escritorio remoto en vb y necesitaba toda la velocidad posible para cargar las imágenes del escritorio remoto. Se me ocurrió que lo más rápido sería coger los datos de las imágenes que te envía el cliente y cargarlas directamente a memoria :smt002 .
Igual que pasa con las imágenes también podría pasar con el video y el sonido. Hay veces que al poder ganar algo de velocidad también es posible ganar algo de calidad.
El poder coger los datos directamente de la red y cargarlos en memoria en vez de tener que ir grabandolos en el disco duro para luego cogerlos, es un factor en velocidad.

Pero estoy deacuerdo contigo de que casi siempre esto se utiliza para hacer programas maliciosos. Una pena.

Saludos.

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 01 Mar 2010, 10:27
por Ximorro
Pues tú hablas de datos, eso es otra cosa.

En este caso siguiendo ese esquema lo que haríamos es descargar programas de internet y ejecutarlos sin necesidad de guardarlos en disco... menudo peligro.
Supongo que irá más rápido, al no mirarlos el antivirus, que está enganchado en el loader para analizar todo lo que se ejecuta...
Las imágenes son una cosa, puede que necesites cargar un montón, pero es bastante raro necesitar cargar y ejecutar al vuelo un montón de ejecutables... a menos que sean una caterva de viruses...

Espero que eso no ponga a los ejecutables de AutoIt en la lista de virus de los antivirus, como ya pasa cuando lo encriptas, que no puedo encriptar porque el McAfee me dice que es un virus y no hay manera de decirle que no lo es...

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 01 Mar 2010, 15:41
por Chefito
Bueno, la verdad es que te doy la razón. Yo me refiero a poder cargar archivos no ejecutables directamente en los controles, que también tiene tela el tema :smt005 .

Saludos.

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 14 Abr 2010, 04:52
por Splash
Alguém testou no Windows Vista / 7?
Parece que funciona no Windows Vista e 7, mas não testei.

Obs.: Pelo que pude notar essa técnica é instável, então cuidado.

PD:Ayuda Resumen: ¿Funciona en W.Vista o 7? Aunque puede ser inestable cuidado!

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 17 Abr 2010, 11:16
por Alastor
Splash escribió:Alguém testou no Windows Vista / 7?
Parece que funciona no Windows Vista e 7, mas não testei.

Obs.: Pelo que pude notar essa técnica é instável, então cuidado.

PD:Ayuda Resumen: ¿Funciona en W.Vista o 7? Aunque puede ser inestable cuidado!
i can't understand your language, so I'll answer in english
It works under Windows Vista/Windows 7 if you change some things (that's what the autor said)

el autor dijo que funcionaría en vista/win7 si se le hacian algunas modificaciones

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 18 Abr 2010, 18:37
por Splash

Código: Seleccionar todo

i can't understand your language, so I'll answer in english
It works under Windows Vista/Windows 7 if you change some things (that's what the autor said)
Yes, but this is a long time ago. The author made some new modifications on script,
but not say if now is working or not on Windows Vista/Seven. :smt022

Sim, mas foi a muito tempo atras. O autor fez algumas novas modificações no script,
mas, não disse se com as novas modificações ele funciona ou não no Windows Vista/Seven.

Não ficou claro/certo/explícito.

Re: Funcion para Ejecutar un exe desde la memoria.

Publicado: 19 Abr 2010, 16:09
por Alastor
Splash escribió:Yes, but this is a long time ago. The author made some new modifications on script,
but not say if now is working or not on Windows Vista/Seven. :smt022
trancexx escribió:edit:
64bit support added. That means you can embed either x64 or x86 modules.
If your AutoIt is x64 you embed x64 modules. If AutoIt is x86 embed x86.
x64 AutoIt could also use embedded x86 modules but I don't like that because needed structures would have to be changed to something that's not meeting aesthetics standards :P.
He only said that he had added support for 64bit programs.
Anyway, I'll try the new script at Windows Vista and report the results later.