<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DisidentS Team &#187; Reverseme</title>
	<atom:link href="http://www.disidents.org/tag/reverseme/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.disidents.org</link>
	<description>-= Sharing Knowledge since 1996! =- Seguridad, Ingeniería Inversa, Redes, Programación, Noticias</description>
	<lastBuildDate>Fri, 03 Sep 2010 13:10:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>ParaBytes Reverseme #4 &#8211; (Old Session 2002)</title>
		<link>http://www.disidents.org/2009/06/07/parabytes-reverseme-4/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=parabytes-reverseme-4</link>
		<comments>http://www.disidents.org/2009/06/07/parabytes-reverseme-4/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 15:45:27 +0000</pubDate>
		<dc:creator>spark</dc:creator>
				<category><![CDATA[Spark - @rroba]]></category>
		<category><![CDATA[@rroba]]></category>
		<category><![CDATA[Ingeniería Inversa]]></category>
		<category><![CDATA[Parabyte]]></category>
		<category><![CDATA[Reverseme]]></category>
		<category><![CDATA[Reversing Links]]></category>
		<category><![CDATA[SparK]]></category>

		<guid isPermaLink="false">http://www.disidents.org/?p=165</guid>
		<description><![CDATA[Hemos llegado a una parte muy interesante de este curso, bienvenidos nuevamente a otro fascinante episodio de esta sección. Espero que les guste y que les sea de agrado leerla, he elegido un elaborado Reverseme de ParaBytes aún sin solución, nosotros no implementaremos la solución completa, pero pasen y vean, vean que bestia he atrapado. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Hemos llegado a una parte muy interesante de este curso, bienvenidos nuevamente a otro fascinante episodio de esta sección.</p>
<p style="text-align: left;">Espero que les guste y que les sea de agrado leerla, he elegido un elaborado Reverseme de ParaBytes aún sin solución, nosotros no implementaremos la solución completa, pero pasen y vean, vean que bestia he atrapado. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bien, había comentado anteriormente que es un Reverseme, pero para todos aquellos que no lo sepan, o aún no lo entiendan, un Reverseme es justamente un programa el cual hay que agregarle, activarle, reprogramarle alguna función.</p>
<p>Estas funciones son dadas por el programador, como reglas del juego, como veremos mas adelante, tenemos reglas para jugar con nuestro Reverseme elegido, muy entretenidas, cubriremos la mayor parte de estas reglas, que son muy sencillas, y les ayudará muchísimo a la hora de entender alguna víctima de este tipo, o quizás nuevas, porque todo este conocimiento es reciclable.</p>
<p><strong>Reglas de Juego</strong></p>
<p>Bueno, el Reverseme nos dice, que tenemos un solo botón, llamado Exit, que justamente lo que hace es salir del programa; pero también hay un misterioso lugar arriba que nada esta ocupándolo, veremos porqué.</p>
<p>Esto es así porque, justamente lo que debemos hacer es crear un botón nuevo, en ese espacio, y luego programarlo para que muestre un número aleatorio en un messagebox, parece sencillo no?, veamos que sucede más adelante.<br />
<img class="aligncenter size-medium wp-image-166" title="captura1" src="http://www.disidents.org/wp-content/uploads/2009/06/captura1-300x183.jpg" alt="captura1" width="300" height="183" /></p>
<p><strong>Un poco de teoría</strong></p>
<p>Veamos algunas definiciones nuevas para los iniciados, y renovemos a los ya iniciados con un poco de teoría que no viene nada mal.</p>
<p>Un archivo PE,NE,MZ, ELF, COM, o cualquier formato que tengamos que analizar o modificar, debemos estudiar en primera instancia su estructura. Un fichero PE (los mas comunes de win32) está dividido en secciones, PE significa Portable Executable, y algunos nombres comunes de secciones que se suelen encontrar en un PE normal son: .code, .data, .rsrc, .udata, .text, .edata, y algunos más que posiblemente ahora no recuerde bien, pero para que más, esos son los más importantes.</p>
<p>Por supuesto que la cosa cambia cuando el EXE esta empaquetado, las secciones suelen cambiar sus características , incluyendo su nombre y demás atributos.</p>
<p>Cada sección, posee atributos, como el de ejecutable, o el de lectura, compartido, etc. Con un editor de  archivos PE pueden verse las secciones fácilmente, un programa para ello es PE-Editor, muy útil en estos casos, permite volcar secciones, editarlas, analizarlas, etc.</p>
<p>Cuando un programa es ejecutado, este es volcado en gran parte en memoria, o al menos el código que será ejecutado dentro de poco tiempo en memoria, esto hace que la mayoría de los recursos del archivo EXE se vuelquen también en memoria, y tengamos casi todo ahí para servirnos de ese manjar.</p>
<p>Cuando tenemos un Reverseme de este estilo que debemos AGREGAR un botón, justamente, debemos agregar código, y eso requiere cambios en el flujo del programa, cambios lógicos, o sea que no hagan que el programa se corrompa ni produzca errores, debemos controlarlo, para poder hacer lo que queramos hacer con él, ésta manera, es la mejor manera de entender el ensamblador  y que sucede dentro de la PC en Windows por ahora.</p>
<p><strong>Desviación del Flujo de Programa</strong></p>
<p>Debemos graficar esta situación, esta modificación es en primera instancia en memoria, luego podemos transladarla al archivo físicamente parcheándolo y dejándole agregada la función para siempre, pero antes para hacer todo esto debemos graficarnos como modificar el flujo de un programa.</p>
<p>Los virus hacen algo parecido al infectar EXE&#8217;s, justamente cambian el flujo de su víctima, para que el virus se ejecute primero y luego, infecta, o hace sus cosas malas, y luego le da el lugar a la víctima a que se ejecute normalmente; antes en DOS, se calculaba la cabecera del EXE, y luego se le agregaba el código de operación de un salto incondicional con la dirección en la que empezaba el virus, de esta manera, el programa lo primero que hacía era, ir al virus a través de ese salto y luego volver.</p>
<p>Algo parecido haremos aquí, primero dejaremos que muchas cosas propias del programa se ejecuten, porque no lo infectaremos, simplemente le agregaremos algunas cosas, así que debemos observar la víctima mirarla bien donde hay que agregar, como funciona y demás para luego decidir donde agregar y porque.</p>
<p>En programación en Win32Asm, tenemos que cualquier programa  que programemos en este lenguaje, tiene un bucle, este se denomina bucle de mensajes, y es ejecutado por cada programa siempre, para saber si algún mensaje fue enviado a ese programa, como por ejemplo el clickeo en un botón, la minimización del programa y muchísimas cosas más.</p>
<p>Generalmente las API&#8217;s ejecutadas son GetMessage, TranslateMessage y DispatchMessage, son utilizadas para este fin, de esta forma, ubicar este bucle se nos hace muy fácil simplemente buscando estas API&#8217;s.</p>
<p>Generalmente cuando el programa se está cargando antes que nada, genera los recursos, o sea, la ventana, los botones, y todos los componentes que necesita para funcionar, estos son generados de diversas maneras, dependiendo el lenguaje en el que fué programado.</p>
<p>Por ejemplo en algunos programas hechos en Delphi , se utiliza el API LoadResource, mientras que en Win32Asm, se suele hacer de distintas maneras, generalmente se hace de la manera más tradicional, llamando a CreateWindowExa, para crear botones, ventanas , y demás componentes.</p>
<p>Pero esta API lleva parámetros que deben ser introducidos y respetados para que todo funcione como queremos.</p>
<p>Si ubicamos la rutina que crea un botón, ya podemos modificarla un poco y agregarla en algún lugar libre para redireccionar el programa hacia ese lugar en el momento que se comienzan a cargar los recursos para también cargar el nuestro que agregaremos, y luego devolverle el control para que el programa siga su rumbo normal sin ningún tropiezo.</p>
<p>Bien, grafiquemos esto:</p>
<p>Inicio del Programa &#8212;&gt; Carga de Recursos – PARCHEO &#8211; &#8212;&gt; desvío hacia nuevo código &#8212;&gt; retorno al código original</p>
<p>Sabiendo que debemos hacer, analicemos nuestro amiguito, con Language vemos en que lenguaje está programado, cuando vemos que nada nos pone, es que está hecho en el lenguaje más puro Win32Asm, si señor, miremoslo, porque todo está entregado, no hay runtimes, ni llamadas a DLL&#8217;s sin sentido , ni cosas raras, es ASM, puro y simple.</p>
<p>Si lo desensamblamos, y miramos con W32Dasm, vamos a la ventana de String References y vemos una palabra BUTTON, bueno ahí tienes hijo, el botón declaradísimo, más claro imposible. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Hagamos doble click en la palabra, y nos lleva a la dirección donde parece que se declara el tipo de botón, nombre de este, y muchas cosas mas, luego si miramos mas abajo podemos observar que se llama a CreateWindowExa, exacto, con eso se crea el botón.</p>
<p>Ahora, una idea brillante se me ha ocurrido (milagro), podemos reutilizar este código ya compilado para usarlo para nuestros propósitos que en este caso es agregarle un botón más, por ahora, solamente haremos eso.</p>
<p>Bien, el código para la declaración del botón empieza con PUSH en la dirección 4011CB, si miramos más abajo podemos observar que en la dirección 4011E8 se encuentra el título del único botón que hay en el programa (hasta ahora), “Exit”, y una línea más abajo está el texto “BUTTON”,  estamos por buen camino. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://www.disidents.org/wp-content/uploads/2009/06/captura2.jpg"><img class="aligncenter size-medium wp-image-169" title="captura2" src="http://www.disidents.org/wp-content/uploads/2009/06/captura2-284x300.jpg" alt="captura2" width="284" height="300" /></a></p>
<p>Luego podemos ver que ingresa muchos parámetros más y luego ejecuta la API CreateFontA, que lo que hace justamente es darle un tipo de letra al botón, nosotros haremos exactamente lo mismo con el nuestro, luego ejecuta la API SendMessage simplemente para poner la letra al botón.</p>
<p>Nosotros copiaremos enteramente desde 4011CB a 40123D, y modificaremos, algunas cosas, si miramos el PUSH que pushea el texto “Exit”, este nos dice una dirección, que es 40303C, nosotros modificaremos ese PUSH poniendo un PUSH pero a una dirección lejana que sabemos que no será utilizada por nadie como por ejemplo 403FF8, ahí pondremos cualquier texto, con el Olly, simplemente apretamos control+G en la ventana de datos y ponemos esa dirección, luego seleccionamos 8 bytes y hacemos click en el botón derecho, haciendo click en la opción para modificar los datos, introducimos el texto que queramos, y listo.</p>
<p style="text-align: center;"><a href="http://www.disidents.org/wp-content/uploads/2009/06/captura3.jpg"><img class="size-medium wp-image-171 aligncenter" title="captura3" src="http://www.disidents.org/wp-content/uploads/2009/06/captura3-300x186.jpg" alt="captura3" width="300" height="186" /></a></p>
<p>Ahora, debemos cambiar el ID del botón, el del Exit es 7A69, el cual modificaremos y le pondremos uno más 7A6A por ejemplo. Nuestro botón debe tener distinto ID para poder poder existir y sobrevivir, sino haría conflictos con el existente.</p>
<p><a href="http://www.disidents.org/wp-content/uploads/2009/06/captura3.jpg"><img class="aligncenter size-medium wp-image-171" title="captura3" src="http://www.disidents.org/wp-content/uploads/2009/06/captura3-300x186.jpg" alt="captura3" width="300" height="186" /></a></p>
<p>Ahora si miramos un poco más arriba vemos que en 4011C5 y más arriba también está el bucle de mensajes del programa, el cual nos centraremos en 4011AC, que es donde pregunta por el ID del botón Exit, deberá hacer lo mismo para nuestro botón, asi que debemos parchear esa parte también de esta manera:</p>
<p>claramente se observa que exit sale del programa, o sea la API que hay mas abajo PostQuitMessage es ejecutada, quiere decir que cundo hacemos click en ese botón el salto JNZ que hay antes no se ejecuta, este se ejecuta cuando NO es clickeado el botón, o sea que si es presionado el nuestro, ahí podemos redireccionar con una dirección distinta hacia nuestro código, para que haga un CMP con nuestro ID tal cual como lo hizo con exit y luego un nuevo JNZ, y ahí si éste será idéntico al que modificaremos ahora, ¿porque? Pues porque este JNZ nos lleva a otra parte del bucle principal del programa que se encarga de los mensajes también, si no lo hacemos nuestro programa puede romperse y salir de repente o inclusive trabar a nuestro querido Windows.</p>
<p style="text-align: center;"><a href="http://www.disidents.org/wp-content/uploads/2009/06/captura4.jpg"><img class="size-medium wp-image-172 aligncenter" title="captura4" src="http://www.disidents.org/wp-content/uploads/2009/06/captura4-300x118.jpg" alt="captura4" width="300" height="118" /></a></p>
<p>Bien, he dado las pautas para poder modificarlo, ahora debemos situar el código de creación del botón en algún lado, para eso, usaremos un programa hecho por WKT (saludos esn-min) llamado Topo, este programa analizará nuestro EXE en busca de espacio libre para alojar injertos, y luego lo dejará fertilizado para nuestros propósitos.</p>
<p>Al ejecutarlo y analizar el fichero nos dice que hay 420 bytes disponibles, le decimos que lo agregue en la misma sección (o sea .code), y luego, operamos con el Olly de nuevo.<br />
<img class="aligncenter size-medium wp-image-170" title="captura5" src="http://www.disidents.org/wp-content/uploads/2009/06/captura5-300x130.jpg" alt="captura5" width="300" height="130" /></p>
<p>En 40225C en el offset A5C, a partir de ahí  estará seguro nuestro injerto, así que los saltos antes mencionados deben redireccionarse a éste código, el salto que debe ir hacia este código es un JMP a esta dirección, lo pondremos sobre el push 0 de la dirección 4011CB, y luego, de ir hacia nuestro código, antes de regresar pondremos un push 0 (que fue el que sobreescribimos) y luego un jump al segundo push, o sea a la dirección 4011CD,  de esta manera el programa no se dará cuenta de lo que está sucediendo en su interior. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Así nuestra víctima generará un botón que ni siquiera estaba previsto crear con algunos simples cambios.</p>
<p><strong>Conclusión</strong></p>
<p>Muy  bien, hemos hecho un injerto de código!, ahora con esto debemos profundizar y utilizarlo en más reversemes, crackmes, toolmes, y demás bestias que andan sueltas por la Red.</p>
<p>Espero que les sea de utilidad, y vean que hay cosas que no son tan difíciles como las plantean, o como se plantean en muchos sitios “elite”.-</p>
 <span class="post2pdf_span" style="border: 1px solid gray; width: 160px; text-align: left; "><a href="http://www.disidents.org/wp-content/plugins/post2pdf/generate.php?post=" rel="nofollow"><img src="http://www.disidents.org/wp-content/plugins/post2pdf/icon/pdf.png" width="16px" height="16px" />convert this post to pdf.</a></span>]]></content:encoded>
			<wfw:commentRss>http://www.disidents.org/2009/06/07/parabytes-reverseme-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
