<?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; Cracking</title>
	<atom:link href="http://www.disidents.org/tag/cracking/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>Tutorial Trainer para DrugLord 2.2 by Krozmic</title>
		<link>http://www.disidents.org/2010/05/02/tutorial-trainer-para-druglord-2-2-by-krozmic/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tutorial-trainer-para-druglord-2-2-by-krozmic</link>
		<comments>http://www.disidents.org/2010/05/02/tutorial-trainer-para-druglord-2-2-by-krozmic/#comments</comments>
		<pubDate>Mon, 03 May 2010 01:45:06 +0000</pubDate>
		<dc:creator>krozmic</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Cracking]]></category>
		<category><![CDATA[DisidentS]]></category>
		<category><![CDATA[Druglord]]></category>
		<category><![CDATA[Ingeniería Inversa]]></category>
		<category><![CDATA[krozmic]]></category>
		<category><![CDATA[Reversing Engineering]]></category>
		<category><![CDATA[trainer]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.disidents.org/?p=426</guid>
		<description><![CDATA[Bueno&#8230; este es mi primer tute&#8230; y no se como empezar&#8230; jeje vamos por partes no? Imagen del juego: Este es el juego&#8230; para que vean que no es un juego de esos en 3d y que tiene todos los chiches&#8230;este es así a lo sencillo&#8230; El juego trata de ser vendedor de drogas&#8230; Un [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">Bueno&#8230; este es mi primer tute&#8230; y no se como empezar&#8230; jeje vamos por partes no?</div>
<div id="_mcePaste">Imagen del juego:</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic1.jpg"><img class="aligncenter size-medium wp-image-428" title="krozmic1" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic1-300x265.jpg" alt="" width="300" height="265" /></a></div>
<div>Este es el juego&#8230; para que vean que no es un juego de esos en 3d y que tiene todos los chiches&#8230;este es así a lo sencillo&#8230;</div>
<div>El juego trata de ser vendedor de drogas&#8230; Un juego al estilo Oferta – Demanda&#8230; compras droga barata y lo vendes cuando sea cara&#8230;</div>
<div>Bueno.. como yo siempre lo juego y mi hermano también.. sabemos bien como funciona&#8230; el juego solo tiene 55 días máximo de juego&#8230; Para los que piensen.. NO es una protección de tiempo&#8230;es 55 días juego&#8230;</div>
<div id="_mcePaste">Como les decía.. quisimos jugar mas días.. tener mas dinero para comprar droga&#8230; y tener mayor capacidad para almacenar dicha droga&#8230;</div>
<div id="_mcePaste">Me dije.. “Hummm aprendería mas sobre el reversing haciendo esto&#8230;. y AHHH también aprendí a programar&#8230; Pues bueno.. Intentemoslo&#8230;”</div>
<div id="_mcePaste">Y ahora lo intentaremos&#8230;</div>
<p></p>
<div>– <strong>BUSCANDO DATOS IMPORTANTES&#8230;</strong></div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic2.jpg"><img class="aligncenter size-medium wp-image-429" title="krozmic2" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic2-300x265.jpg" alt="" width="300" height="265" /></a></div>
<div id="_mcePaste">Bueno.. ahí les señale lo que necesitamos&#8230; “Day: 2/30” , “Cash: 434” y “Your pants pocket (2/10)”</div>
<div>Como ven ya jugue dos dias&#8230; gaste mi dinero para comprar el “Pot” y en “Your pants&#8230;” tengo mis dos unidades, kilos, bolsas o lo que sea de Pot&#8230;</div>
<div id="_mcePaste">Si.. ya lo tenemos todo&#8230;</div>
<p></p>
<div id="_mcePaste"><strong>– ACLARACIONES o OBSERVACIONES&#8230;</strong></div>
<div id="_mcePaste">Esto les muestro porque se como va el juego.. y para aclarar cualquier duda&#8230;</div>
<div id="_mcePaste">El juego tiene unos rankings&#8230; subis de ranking cuando ya tienes 1.000.000 de dolares etc etc y te da 5 dias mas de juego, te aumenta la capacidad y todo lo demas&#8230;aquí les dejo los rankings&#8230; que nos ayudaran para despues&#8230;.</div>
<div>Ranks</div>
<div>You can have one of six ranks at any give time:</div>
<p></p>
<div>Wannabe</div>
<div id="_mcePaste">Cash Required: $0</div>
<div id="_mcePaste">Carrying Capacity: 10 units</div>
<div id="_mcePaste">Container: pants pocket</div>
<p></p>
<div>Small-time Operator</div>
<div id="_mcePaste">Cash Required: $5,000</div>
<div id="_mcePaste">Carrying Capacity: 25 units</div>
<div id="_mcePaste">Container: coat</div>
<p></p>
<div>Dealer</div>
<div id="_mcePaste">Cash Required: $40,000</div>
<div id="_mcePaste">Carrying Capacity: 100 units</div>
<div id="_mcePaste">Container: black Trans Am</div>
<p></p>
<div>Big-Time Dealer</div>
<div id="_mcePaste">Cash Required: $300,000</div>
<div id="_mcePaste">Carrying Capacity: 600 units</div>
<div id="_mcePaste">Container: converted milk truck</div>
<p></p>
<div>Distributer</div>
<div id="_mcePaste">Cash Required: $2,500,000</div>
<div id="_mcePaste">Carrying Capacity: 3,500 units</div>
<div id="_mcePaste">Container: warehouse</div>
<p></p>
<div>Drug Lord</div>
<div id="_mcePaste">Cash Required: $15,000,000</div>
<div id="_mcePaste">Carrying Capacity: 20,000 units</div>
<div id="_mcePaste">Container: island paradise</div>
<p></p>
<div>Ya&#8230;. Bueno ahora que viene&#8230;</div>
<div id="_mcePaste">Ah cierto.. debugear el juego&#8230;</div>
<p></p>
<div>– <strong>EL DEBUG DEL JUEGO&#8230;.</strong></div>
<div>Primero primero lo escaneamos con el RDG&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic3.jpg"><img class="aligncenter size-medium wp-image-430" title="krozmic3" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic3-300x158.jpg" alt="" width="300" height="158" /></a></div>
<div id="_mcePaste">Bueno dice archivo sospechoso y bla bla.. no me interesa&#8230;</div>
<div id="_mcePaste">Pero no hay nada de packer y todo eso&#8230;</div>
<div id="_mcePaste">Depuremolo de una vez&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic4.jpg"><img class="aligncenter size-medium wp-image-431" title="krozmic4" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic4-300x183.jpg" alt="" width="300" height="183" /></a></div>
<div id="_mcePaste">caemos aquí&#8230;</div>
<div id="_mcePaste">que le hago, que le hago.. si no se entiende un huevo&#8230;</div>
<div id="_mcePaste">Hey cierto&#8230; ver los text string y si no hay nada las apis comunes que siempre usamos&#8230;</div>
<div>Text String Primero:</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic5.jpg"><img class="aligncenter size-medium wp-image-432" title="krozmic5" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic5-300x198.jpg" alt="" width="300" height="198" /></a></div>
<div id="_mcePaste">huuuuuuuuuuuuu&#8230; millones&#8230; seguro hay alguno que nos sirve&#8230;</div>
<div>y seguro que hay millones de apis&#8230;</div>
<div>pero se me ocurrio algo&#8230;. en dias decia&#8230; “Day:1/30”</div>
<div>intentemos buscando la constante 30 en el debug.. en hexa es igual a “1E”</div>
<div>Click derecho sobre el debug &gt; search for &gt; Constant..</div>
<div>le ponemos el 30 en decimal o el 1E en hexa&#8230; Aceptamos</div>
<div>y paramos en&#8230;.</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic6.jpg"><img class="aligncenter size-medium wp-image-433" title="krozmic6" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic6-300x250.jpg" alt="" width="300" height="250" /></a></div>
<div>Y si.. no me digan nada.. ahi tenemos una api&#8230; pero llegamos de otra forma&#8230; asique</div>
<div>EXPERIENCIA+1</div>
<div>Sigamos&#8230;.</div>
<div>Ponemos una Bp sobre PUSH 1E&#8230; damos run&#8230; paramos de vuelta&#8230;</div>
<div>Traceamos un poco&#8230; y llegamos <strong>00406011 MOV DWORD PTR DS:[42AD74],1E</strong></div>
<div id="_mcePaste">osea que mueve los “30” a esa pocicion de memoria&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic7.jpg"><img class="aligncenter size-medium wp-image-434" title="krozmic7" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic7-290x300.jpg" alt="" width="290" height="300" /></a></div>
<div>Ven&#8230;</div>
<div>bueno&#8230; para probar podriamos, no se.. modificar ese byte&#8230; por otro para probar si sale mas dias&#8230;.entonces&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic8.jpg"><img class="aligncenter size-medium wp-image-435" title="krozmic8" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic8-253x300.jpg" alt="" width="253" height="300" /></a></div>
<div id="_mcePaste">y cambia 1E por FF&#8230; que son&#8230;255&#8230;</div>
<div>damos run y nos fijamos&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic9.jpg"><img class="aligncenter size-full wp-image-436" title="krozmic9" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic9.jpg" alt="" width="244" height="183" /></a></div>
<div id="_mcePaste">y si.. son 255 dias&#8230;volvemos a donde estabamos y anotamos la posición de la memoria donde esta alojado el 1E&#8230;</div>
<div id="_mcePaste">[0042AD74]</div>
<div>Bien&#8230; ya tenemos los dias&#8230;</div>
<div id="_mcePaste">Ahora el cash&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic10.jpg"><img class="aligncenter size-full wp-image-437" title="krozmic10" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic10.jpg" alt="" width="253" height="184" /></a></div>
<div id="_mcePaste">Bueno cuando empezamos el juego.. tenemos 1,990 dolares y una deuda de 1,150&#8230;lo de la deuda lo dejamos&#8230; total cuando tengamos 1millon de dolares ni vamos a sentir esa deuda..jiji</div>
<div>Ahora.. como procedemos&#8230;</div>
<div>Lo que podriamos hacer es&#8230; poner un Bp en SendDlgItemMessageA y buscar y buscar hasta encontrar el indicado&#8230; Asi como lo hice yo&#8230; pero ya me olvide&#8230; asique eso lo pueden hacer ustedes&#8230;</div>
<div id="_mcePaste">bueno&#8230; la verdad que no me acuerdo de donde estaba, como y porque&#8230;</div>
<div id="_mcePaste">pero encontre que el primer cash que se agrega es 2,000 dolares y no 1,990.. seguro que es por los</div>
<div id="_mcePaste">impuestos, gasto por el carne de vendedor de drogas.. que se yo&#8230;</div>
<div id="_mcePaste">lo que si que cuando vimos donde se movia los dias a la memoria&#8230; mas abajito este el del cash&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic11.jpg"><img class="aligncenter size-medium wp-image-438" title="krozmic11" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic11-300x216.jpg" alt="" width="300" height="216" /></a></div>
<div>si ven.. dice&#8230; <strong>00406044 MOV DWORD PTR DS:[42ACE0],7D0</strong></div>
<div id="_mcePaste">mueve 7D0 que son los 2000$ a esa pocicion de la memoria&#8230;</div>
<div>probamos de vuelta&#8230;</div>
<div id="_mcePaste">vemos en la memoria&#8230; osea en el dump y vemos</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic19.jpg"><img class="aligncenter size-medium wp-image-445" title="krozmic19" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic19-300x221.jpg" alt="" width="300" height="221" /></a></div>
<div id="_mcePaste">ahi esta el 7D0 alrevez&#8230; (Odio que siempre lo ponga al revez..me marea. y peor si estoy con resaca)</div>
<div id="_mcePaste">bueno ya saben como modificar los bytes&#8230; agarramos los dos y ponemo fill con FF`s si salio tiene que aver FF FF</div>
<div id="_mcePaste">pero cuanto dinero seria esto&#8230; para saber claro si salio o no&#8230; calculadora y son&#8230; 65.535 $</div>
<div>damos run y miramos el cash&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic12.jpg"><img class="aligncenter size-full wp-image-439" title="krozmic12" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic12.jpg" alt="" width="248" height="183" /></a></div>
<div id="_mcePaste">y practicamente nos faltan los 10$&#8230; pero no me importa.. a mi por lo menos 10$ en el juego no me interesa&#8230; si voy a ser rico&#8230;</div>
<div id="_mcePaste">bueno&#8230; ya sabemos que hacer&#8230; anotar la pocicion de la memoria donde esta alojado el cash&#8230;[42ACE0]</div>
<div id="_mcePaste">ya tenemos el cash.. luego le agregaremos lo que queremos de dinero&#8230;</div>
<div>Ahora lo que mas cuesta&#8230; la capacidad&#8230;</div>
<div id="_mcePaste">como vieron al comienzo donde estaban los rankings&#8230; se ve que hay 6 tipos de capacidades&#8230;</div>
<p></p>
<div>Wannabe</div>
<div id="_mcePaste">Carrying Capacity: 10 units</div>
<div>Small-time Operator</div>
<div id="_mcePaste">Carrying Capacity: 25 units</div>
<div>Dealer</div>
<div id="_mcePaste">Carrying Capacity: 100 units</div>
<div>Big-Time Dealer</div>
<div id="_mcePaste">Carrying Capacity: 600 units</div>
<div>Distributer</div>
<div id="_mcePaste">Carrying Capacity: 3,500 units</div>
<div>Drug Lord</div>
<div id="_mcePaste">Carrying Capacity: 20,000 units</div>
<p></p>
<div>y bueno.. si le modificamos al comienzo.. una capacidad de 10unidades por una capacidad de 15000unidades cuando subamos de ranking tendremos de vuelta 25 unidades de capacidad y asi sucesivamente&#8230; osea que hay que pescarlos a todos y modificarlos&#8230;</div>
<div>bueno&#8230; no me van a creer pero me olvide tambien como llegue ahi&#8230; haremos algo rapidito&#8230;.</div>
<div>si tienen el GREATISWINDOWSE&#8230; pues ejecutenlo&#8230;</div>
<div>ejecutemos el juego tambien&#8230;</div>
<div>y veamos&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic13.jpg"><img class="aligncenter size-medium wp-image-440" title="krozmic13" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic13-300x175.jpg" alt="" width="300" height="175" /></a></div>
<div>Bueno si tenemos el windowse y el druglord abiertos ponemos nuestro cursor sobre el (0/10) de Your pants pocket y nos fijamos en el windowse donde dice..</div>
<div id="_mcePaste">Control ID 000001FB</div>
<div id="_mcePaste">nos acordamos del numero  ese y cerramos el windowse y el juego&#8230;abrimos de vuelta el juego con el Olly y damos click derecho&gt; search for&gt; constant y ponemos lo del control id que vimos recien&#8230;.</div>
<div>y el olly nos tira aquí&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic14.jpg"><img class="aligncenter size-medium wp-image-441" title="krozmic14" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic14-300x234.jpg" alt="" width="300" height="234" /></a></div>
<div>si ven &#8230; un chiqui mas arriba dice ASCII “Your %s (%d%d)”&#8230; osea que es eso.. y que estamos muy muy cerca&#8230;.</div>
<div id="_mcePaste">que tal si le ponemos unas Bp un poco mas arriba para tracear&#8230;.</div>
<div id="_mcePaste">lo pueden poner en 00402998 MOV EBX,EAX</div>
<div>dan run.. y paran y tracean&#8230;</div>
<div>Llegamos a 004029CA el primer Bp de la imagen de arriba&#8230;. compara EBX con una dato de que</div>
<div id="_mcePaste">esa direccion&#8230;</div>
<div>que es un 0A&#8230; osea 10decimal&#8230; que es nuestra primera capacidad.</div>
<div>Pero bueno traceamos un poco mas y llegamos al segundo Bp de la imagen de arriba&#8230; el 00402A0E y vemos que mueve el 0A que esta en la direccion de la memoria a EAX&#8230;</div>
<div id="_mcePaste">nos fijamos en el esa direccion el el dump y modificamos el 0A por FF para ver si cambia o no&#8230;</div>
<div>ya saben como se hace.. y no lo repetire&#8230; no pega copiar y pegar imagenes&#8230;. aparte ya lo tienen que saber a estas alturas&#8230;</div>
<div id="_mcePaste">bueno&#8230; ya le modificamos por los FF y damos run para mironear&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic15.jpg"><img class="aligncenter size-full wp-image-442" title="krozmic15" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic15.jpg" alt="" width="170" height="52" /></a></div>
<div>Y si.. ahi estan los 255 que era el FF que modificamos&#8230;</div>
<div id="_mcePaste">volvemos&#8230;. anotamos la direccion&#8230; 004230F0</div>
<div>como les dije.. ahora falta pescar a las otras 5 capacidades&#8230;</div>
<div>dejamos los Bp como estan&#8230; ahora a jugar para pescarlos&#8230;</div>
<div id="_mcePaste">(pero si hay que dominar el juego para subir de ranking&#8230; algo mas facil???)</div>
<div>bueno.. ya que anotaron donde estaba alojado el cash.. vamos a modificarlo de entrada para que los rankings pasen rapido&#8230;</div>
<div id="_mcePaste">reiniciamos el olly&#8230;</div>
<div>hacemos goto a 00406044 donde ingresaba el 2000$</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic16.jpg"><img class="aligncenter size-medium wp-image-443" title="krozmic16" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic16-300x221.jpg" alt="" width="300" height="221" /></a></div>
<div id="_mcePaste">y modificamos el D0 07 del dump por haber humm&#8230; para el ranking de druglord necesitamos</div>
<div id="_mcePaste">15.000.000 de $</div>
<div id="_mcePaste">asique&#8230; le agregaremos 20.000.000 de $</div>
<div>bueno.. 20millones en hexa es &#8230; 1312D00</div>
<div id="_mcePaste">y como les dije que me marea ponerlo alrevez&#8230; me programe un programita que te da la vuelta los</div>
<div id="_mcePaste">numeros (litle endian-big endian) para que los escribas en el dump&#8230;</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic17.jpg"><img class="aligncenter size-medium wp-image-444" title="krozmic17" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic17-300x169.jpg" alt="" width="300" height="169" /></a></div>
<div id="_mcePaste">Ahi lo tenemos&#8230; me automatice el problema&#8230; asique le modificamos al D0 07 por 00 2D 31 01</div>
<div id="_mcePaste">queda entonces asi..</div>
<div><a href="http://www.disidents.org/wp-content/uploads/2010/05/krozmic18.jpg"><img class="aligncenter size-medium wp-image-427" title="krozmic18" src="http://www.disidents.org/wp-content/uploads/2010/05/krozmic18-300x63.jpg" alt="" width="300" height="63" /></a></div>
<div>y bueno Bp puestos&#8230; dinero puesto.. damos run y vemos que tenemos 19millones y pico&#8230;</div>
<div id="_mcePaste">ahora le damos en STAY HERE y nos para el olly&#8230;</div>
<div>nos fijamos que capacidad esta pasando&#8230;</div>
<div id="_mcePaste">volvemos a dar run&#8230; STAY HERE &#8230; para&#8230; miramos&#8230; run.. STAY HERE &#8230; para&#8230; miramos&#8230;hasta que tengamos estos valores</div>
<p></p>
<div>Carrying Capacity: 10 units <strong>este ya lo tenemos el 0A en hexa</strong></div>
<div>Small-time Operator</div>
<div id="_mcePaste">Carrying Capacity: 25 units <strong>este es 19 en hexa</strong></div>
<div>Dealer</div>
<div id="_mcePaste">Carrying Capacity: 100 units <strong>este es 64 en hexa</strong></div>
<div>Big-Time Dealer</div>
<div id="_mcePaste">Carrying Capacity: 600 units <strong>este es 258 en hexa</strong></div>
<div>Distributer</div>
<div id="_mcePaste">Carrying Capacity: 3,500 units <strong>este es DAC en hexa</strong></div>
<div>Drug Lord</div>
<div id="_mcePaste">Carrying Capacity: 20,000 units <strong>este es 4E20 en hexa</strong></div>
<p></p>
<div>esos valores en hex tienen que pescar&#8230; y anotar en que direccion de memoria estan&#8230;</div>
<div>yo les pongo aquí debajo&#8230;</div>
<p></p>
<div>el capacidad 25 esta en 423118 &#8220;19&#8243;</div>
<div id="_mcePaste">el capacidad 100 esta en 423140 &#8220;64&#8243;</div>
<div id="_mcePaste">el capacidad 600 esta en 423168 &#8220;258&#8243;</div>
<div id="_mcePaste">el capacidad 3500 esta en 423190 &#8220;DAC&#8221;</div>
<div id="_mcePaste">el capacidad 20000 esta en 4231B8 &#8220;4E20&#8243;</div>
<p></p>
<div>ya tenemos todo&#8230;</div>
<p></p>
<div>- <strong>RECOMPILACION DE NUEVOS DATOS</strong></div>
<p></p>
<div>Dirección de donde se aloja los días [42AD74]</div>
<div id="_mcePaste">Dirección de donde se aloja el cash [42ACE0]</div>
<div id="_mcePaste">Dirección de donde se aloja la capacidad 10 decimal 0A hexa [4230F0]</div>
<div id="_mcePaste">Dirección de donde se aloja la capacidad 25 decimal 19 hexa [423118]</div>
<div id="_mcePaste">Dirección de donde se aloja la capacidad 100 decimal 64 hexa [423140]</div>
<div id="_mcePaste">Dirección de donde se aloja la capacidad 600 decimal 258 hexa [423168]</div>
<div id="_mcePaste">Dirección de donde se aloja la capacidad 3500 decimal DAC hexa [423190]</div>
<div id="_mcePaste">Dirección de donde se aloja la capacidad 20000 decimal 4E20 hexa [4231B8]</div>
<p></p>
<div>ya esta todo&#8230;</div>
<div>ahora&#8230;</div>
<p></p>
<div>-<strong> PROGRAMACION DEL TRAINER</strong></div>
<div>Les dejo el código fuente en la capeta porque si les pego aquí se hará un caos.. y ustedes entenderán menos&#8230;</div>
<div id="_mcePaste">asique fíjense en la carpeta&#8230;</div>
<div id="_mcePaste">el código fuente tiene comentarios para que vean&#8230;</div>
<div id="_mcePaste">también les dejo en la carpeta el programita ese que da vuelta los números para ponerlo en el dump..</div>
<div id="_mcePaste">para los mas newies claro.. porque el resto de ustedes la dominan todo&#8230;</div>
<p></p>
<div>Con esto me voy despidiendo&#8230;</div>
<p>Bajar fuentes, complementos y juego:</p>
<p><a href="http://www.disidents.org/wp-content/uploads/2010/05/OllydumpFORMAT.zip">OllydumpFORMAT</a> <a href="http://www.disidents.org/wp-content/uploads/2010/05/druglord.zip">druglord</a> <a href="http://www.disidents.org/wp-content/uploads/2010/05/DrugLTrainer.zip">DrugLTrainer</a></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/2010/05/02/tutorial-trainer-para-druglord-2-2-by-krozmic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>md5 search function</title>
		<link>http://www.disidents.org/2010/03/28/md5-search-function/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=md5-search-function</link>
		<comments>http://www.disidents.org/2010/03/28/md5-search-function/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 11:25:49 +0000</pubDate>
		<dc:creator>noukeys</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Cracking]]></category>
		<category><![CDATA[DisidentS]]></category>
		<category><![CDATA[Ingeniería Inversa]]></category>
		<category><![CDATA[md5 cracker]]></category>
		<category><![CDATA[noukeys]]></category>
		<category><![CDATA[Reverse Engineering]]></category>

		<guid isPermaLink="false">http://www.disidents.org/?p=421</guid>
		<description><![CDATA[Muchas veces programamos chorraditas rápidas, que pueden llegar a ser muy útiles. Pues creo que la que aquí presento puede ser una de estas, es una función en python que búsca su f, dada su imagen f&#8217;. La he utilizado para hacer una auditoría a un fichero con más de 30.000 imágenes y la verdad, [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces programamos chorraditas rápidas, que pueden llegar a ser muy útiles. Pues creo que la que aquí presento puede ser una de estas, es una función en python que búsca su f, dada su imagen f&#8217;.</p>
<p>La he utilizado para hacer una auditoría a un fichero con más de 30.000 imágenes y la verdad, los resultados han sido positivos.</p>
<p>He renombrado el ficherito a .txt para poder subirlo.</p>
<p><a href="http://www.disidents.org/wp-content/uploads/2010/03/md5_cracker.txt">md5_cracker</a></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">import urllib</p>
<p>__id__ = &#8220;$Id: md5_cracker.py 2010-03-28 13:13$&#8221;<br />
__version__ = &#8220;$Revision: 0 $&#8221;<br />
__date__ = &#8220;$Date: 2010-03-28 13:13:51 +0100 (San, 28 Mar 2010) $&#8221;<br />
__author__ = &#8220;noukeys reverser (noukeys@gmail.com)&#8221;<br />
__copyright__ = &#8220;Copyright 2010+ noukeys&#8221;<br />
__license__ = &#8220;GPL&#8221;<br />
__URL__ = &#8220;http://www.reversing.es&#8221;</p>
<p>#Busca un hash en diversas webs conocidas.<br />
def md5search(hash):</p>
<p>find = &#8221;;</p>
<p>#busqueda:<br />
try:<br />
if find == &#8221;:<br />
f = urllib.urlopen(&#8220;http://gdataonline.com/qkhash.php?mode=txt&amp;hash=&#8221; + hash.strip(&#8216;\t\n&#8217;))<br />
for line in f.readlines():<br />
if (line.find(&#8216;&lt;tr&gt;&lt;td width=&#8221;65%&#8221;&gt;&#8217;) != -1) and (line.find(&#8216;????&#8217;) == -1):<br />
line = line.partition(&#8217;35%&#8221;&gt;&lt;b&gt;&#8217;)<br />
line = line[2].partition(&#8216;&lt;/b&gt;&#8217;)<br />
find = line[0]<br />
except:<br />
pass</p>
<p>#busqueda<br />
try:<br />
if find == &#8221;:<br />
params = urllib.urlencode({&#8216;pass&#8217;: hash.strip(&#8216;\t\n&#8217;), &#8216;option&#8217;: &#8216;hash2text&#8217;, &#8216;send&#8217;: &#8216;Submit&#8217;})<br />
f = urllib.urlopen(&#8220;http://md5online.net/&#8221;, params)<br />
for line in f.readlines():<br />
if line.find(&#8216;pass :&#8217;) != -1:<br />
line = line.partition(&#8216;s : &lt;b&gt;&#8217;)<br />
line = line[2].partition(&#8216;&lt;/b&gt;&#8217;)<br />
find = line[0]<br />
except:<br />
pass</p>
<p>#busqueda<br />
try:<br />
if find == &#8221;:<br />
params = urllib.urlencode({&#8216;term&#8217;: hash.strip(&#8216;\t\n&#8217;), &#8216;crackbtn&#8217;: &#8216;Crack+that+hash+baby%21&#8242;})<br />
f = urllib.urlopen(&#8220;http://md5crack.com/crackmd5.php&#8221;, params)<br />
for line in f.readlines():<br />
if line.find(&#8216;Found&#8217;) != -1:<br />
line = line.partition(&#8216;(&#8220;&#8216;)<br />
line = line[2].partition(&#8216;&#8221;)&#8217;)<br />
find = line[0]<br />
except:<br />
pass</p>
<p>#Resultados<br />
return find.strip(&#8216;\t\n&#8217;)</p>
<p>#P.O.C.<br />
print md5search(&#8217;084e0343a0486ff05530df6c705c8bb4&#8242;)</p>
</div>
 <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/2010/03/28/md5-search-function/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Crackeando un componente para Delphi</title>
		<link>http://www.disidents.org/2009/08/11/crackeando-un-componente-para-delphi/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=crackeando-un-componente-para-delphi</link>
		<comments>http://www.disidents.org/2009/08/11/crackeando-un-componente-para-delphi/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 23:54:39 +0000</pubDate>
		<dc:creator>spark</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Componentes]]></category>
		<category><![CDATA[Crack]]></category>
		<category><![CDATA[Crackeando]]></category>
		<category><![CDATA[Cracking]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[DisidentS]]></category>
		<category><![CDATA[DsD!]]></category>
		<category><![CDATA[Ingeniería Inversa]]></category>
		<category><![CDATA[SparKrisp]]></category>

		<guid isPermaLink="false">http://www.disidents.org/?p=330</guid>
		<description><![CDATA[Hola a todos, estoy nuevamente para mostrarles lo sencillo que puede ser crackear un componente para el entorno de desarrollo Delphi. Las otras noches, nos juntamos en la casa de un amigo a comer unos canelones, después de comer, charlar y reirnos un rato, sacamos nuestras notebooks&#8230; fue ahí cuando me dije, ¿porque no crackear [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a todos, estoy nuevamente para mostrarles lo sencillo que puede ser crackear un componente para el entorno de desarrollo Delphi.</p>
<p>Las otras noches, nos juntamos en la casa de un amigo a comer unos canelones, después de comer, charlar y reirnos un rato, sacamos nuestras notebooks&#8230; fue ahí cuando me dije, ¿porque no crackear estas compos que hacen muy lindas interfaces a nuestras aplicaciones delphi?</p>
<p>No diré el nombre de estas componentes, ya que obviamente son pagas, sino no sería necesario crackearlas , no? xD</p>
<p>Pero sí daré una pista, empiezan con estas dos letras VGS y las que le siguen, sin espacios son 4 letras, muy conocida palabra en el &#8220;ambiente&#8221; en el que nos solemos mover. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  a alguien le gusta la demoscene? xD</p>
<p>Bien, no doy mas pistas, si no lo han agarrado dedíquense a otra cosa&#8230; xD</p>
<p>La protección es muy, pero muy sencilla, pero molesta, como todas. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Una pequeña NAG Screen, cuando se instala el componente en Delphi, aparecerá, si arrancamos el entorno, aparecerá, porque Delphi carga todas sus librerías al comienzo&#8230; si compilamos un proyecto de ejemplo que viene en el paquete, saldrá el NAG de nuevo, y obviamente si corremos el EXE generado aparte, también&#8230; en algún lugar más? xD</p>
<p>Lo que haremos serán dos parcheos simples y no aparecerán nunca más en ningún lado, solo con parchear un fichero. Hay que ir a la fuente, delphi compila y reconvierte todo a varios formatos para que todo en &#8220;su mundo&#8221; salga bien.</p>
<p>Podemos rompernos la cabeza parcheando 3 o 4 archivos, o 1 solo simplemente. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>De que se trata todo esto</strong></p>
<p>Bueno, como ya expliqué es un simple NAG molesto, las demás funcionalidades parecen completas, así que les mostraré el mensajito:</p>
<p style="text-align: center;"><img class="size-medium wp-image-334   aligncenter" title="nagd1" src="http://www.disidents.org/wp-content/uploads/2009/08/nagd1-300x189.jpg" alt="nagd1" width="300" height="189" /></p>
<p>Bien, como les dije, este cartelito, todas las veces que les comenté aparece, ahora vamos a sacarnóslo de encima <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Si miramos la carpeta de los componentes estos, veremos que tenemos la carpeta packages, dentro hay archivos con estas extensiones dpk, dcu, res, bpl y dcp.</p>
<p>Los DPK son Delphi Package, los DCU son Delphi Compiled Unit, los BPL son Borland Package Library y los DCP son Delphi Component Package.</p>
<p>Cuando abrimos un DPK, compilamos e intalamos, éste contiene las DCU compiladas, y la DPK utilizada se guardara en la carpeta de proyectos de Borland.</p>
<p>Con esto quiero decir, que si crackeamos lo que genera un DPK que es un BPL, no lo crackearemos del todo&#8230; <img src='http://www.disidents.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Miremos primero lo más facil.</p>
<p><strong>Donde atacar</strong></p>
<p>Si compilamos un ejemplo y lo abrimos con el IDA, buscaremos una parte del string del NAG, por ej, &#8220;trial&#8221;.</p>
<p>Encontraremos la parte de código como la siguiente:</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 920px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">CODE:004F4704                 mov     eax, offset _str_This_applicatio.Text</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 920px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">CODE:004F4709                 call    unknown_libname_164 ; BDS 2005-2006 and Delphi6-7 Visual Component Library</div>
<pre><span style="font-style: normal;">C</span>ODE:004F4704                 mov     eax, offset _str_This_applicatio.Text</pre>
<pre>CODE:004F4709                 call    unknown_libname_164 ; BDS 2005-2006 and Delphi6-7 Visual Component Library</pre>
<div>Podemos parchear este CALL pero no es recomendable..</div>
<pre>CODE:0050BED0                 mov     eax, offset _str_Resources.Text

CODE:0050BED5                 call    sub_4F7E78

CODE:0050BEDA                 call    nullsub_13</pre>
<p>Ok, entonces, podemos parchear el segundo CALL. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Si miramos el código en hexa, será el siguiente: E8 C1 87 FE FF deberíamos NOPearlo, y listo, lo tenemos arreglado. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pero!, siempre hay un pero, no nos conviene parchear cada EXE que compilamos, o si? <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  sería muy tedioso, deberíamos correr el parche por cada ejemplo o aplicación que utilice estas librerías, entonces deberíamos parchear la fuente, donde se genera la cuestión, no creen?&#8230;</p>
<p><strong>Buscando la fuente</strong></p>
<p>Ok, busquemos lo mismo en el BPL que si lo abrimos es un PE armado por Delphi. En cambio no podremos hacerlo con un DPC.</p>
<p>Encontramos esto:</p>
<pre><strong><span style="font-weight: normal;">CODE:004560C1                 call    @Vg_scene@RegisterVGObjects$qqrx17System@AnsiStringpxpx17System@TMetaClassxi ; Vg_scene::RegisterVGObjects(System::AnsiString,System::TMetaClass **,int)</span>

<span style="font-weight: normal;">CODE:004560C6                 call    @Vg_version@ShowVersion2$qqrv ; Vg_version::ShowVersion2(void)</span>
</strong></pre>
<p>Con esto lograremos que Delphi 7 no sea interrumpido por la molesta NAG, pero al compilar los ejemplos, y al ejecutarlos saldrá nuestro NAG&#8230; <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Entonces, donde está la magia de esto? nos queda una de las extensiones que expliqué antes: DCU.</p>
<p>Las DCU NO son PE&#8217;s así que tendremos que ver como los &#8220;atacamos&#8221;, la mejor idea creo que es con DEDE. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Mirando en la carpeta fuera de packages, vemos tooodos los DCU,  así que encontraremos uno de ellos que es vg_version.dcu</p>
<p>Podemos abrir el DEDE y hacer lo siguiente:</p>
<p><a href="http://www.disidents.org/wp-content/uploads/2009/08/dede.JPG"><img class="aligncenter size-medium wp-image-343" title="dede" src="http://www.disidents.org/wp-content/uploads/2009/08/dede-300x181.jpg" alt="dede" width="300" height="181" /></a></p>
<p>Como vemos, abrimos DEDE, y en el menú dumpers, podemos elegir la opcion Dumpeador de DCU. Si hacemos click en esa opción se abrirá la siguiente pantalla, donde elegimos el archivo vg_version.dcu y hacemos click en procesar.</p>
<p>Obtendremos lo siguiente:</p>
<p><a href="http://www.disidents.org/wp-content/uploads/2009/08/dcudumper.JPG"><img class="aligncenter size-medium wp-image-344" title="dcudumper" src="http://www.disidents.org/wp-content/uploads/2009/08/dcudumper-300x186.jpg" alt="dcudumper" width="300" height="186" /></a></p>
<p>Obtendremos el código de nuestra DCU, entonces ahí veremos lo siguiente:</p>
<pre style="padding-left: 60px;">procedure ShowVersion2;

const

  AboutText = 

    000: ÿÿÿÿP...This app|FF FF FF FF 50 01 00 00 54 68 69 73 20 61 70 70|

    010: lication uses a |6C 69 63 61 74 69 6F 6E 20 75 73 65 73 20 61 20|

    020: trial version of|74 72 69 61 6C 20 76 65 72 73 69 6F 6E 20 6F 66|

    030:  VGScene.....Ple|20 56 47 53 63 65 6E 65 2E 0D 0A 0D 0A 50 6C 65|

    040: ase contact the |61 73 65 20 63 6F 6E 74 61 63 74 20 74 68 65 20|

    050: provider of the |70 72 6F 76 69 64 65 72 20 6F 66 20 74 68 65 20|

    060: application for |61 70 70 6C 69 63 61 74 69 6F 6E 20 66 6F 72 20|

    070: a registered ver|61 20 72 65 67 69 73 74 65 72 65 64 20 76 65 72|

    080: sion.....%s..Cop|73 69 6F 6E 2E 0D 0A 0D 0A 25 73 0D 0A 43 6F 70|

    090: yright (C) 1998-|79 72 69 67 68 74 20 28 43 29 20 31 39 39 38 2D|

    0A0: 2009 by Eugene K|32 30 30 39 20 62 79 20 45 75 67 65 6E 65 20 4B|

    0B0: ryukov....For co|72 79 75 6B 6F 76 0D 0A 0D 0A 46 6F 72 20 63 6F|

    0C0: nditions of dist|6E 64 69 74 69 6F 6E 73 20 6F 66 20 64 69 73 74|

    0D0: ribution and use|72 69 62 75 74 69 6F 6E 20 61 6E 64 20 75 73 65|

    0E0: , see LICENSE.TX|2C 20 73 65 65 20 4C 49 43 45 4E 53 45 2E 54 58|

    0F0: T.....Visit our |54 2E 0D 0A 0D 0A 56 69 73 69 74 20 6F 75 72 20|

    100: web site for the|77 65 62 20 73 69 74 65 20 66 6F 72 20 74 68 65|

    110:  latest versions|20 6C 61 74 65 73 74 20 76 65 72 73 69 6F 6E 73|

    120:  of VGScene:....|20 6F 66 20 56 47 53 63 65 6E 65 3A 0D 0A 0D 0A|

    130: http://www.ksdev|68 74 74 70 3A 2F 2F 77 77 77 2E 6B 73 64 65 76|

    140: .com/..support@k|2E 63 6F 6D 2F 0D 0A 73 75 70 70 6F 72 74 40 6B|

    150: sdev.com.       |73 64 65 76 2E 63 6F 6D 00|;

var</pre>
<p>Aquí vemos que está el mensaje de nuestra NAG, tenemos nuestro objetivo en la mira. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Como veremos, tenemos 2 procedimientos ShowVersion y ShowVersion2.</p>
<p>Lo que haremos será sencillo, en vez de parchear DENTRO, parchearemos solamente y PUSH EBP:</p>
<pre>begin

   00000000 : 55                            PUSH EBP

   00000001 : 8B EC                         MOV EBP,ESP

   00000003 : 83 C4 F4                      ADD ESP,-12

   00000006 : 53                            PUSH EBX

   00000007 : 56                            PUSH ESI

   00000008 : 33 C0                         XOR EAX,EAX

   0000000A : 89 45 FC                      MOV DWORD PTR [EBP-4],EAX

   0000000D : 33 C0                         XOR EAX,EAX

   0000000F : 55                            PUSH EBP

   00000010 : 68(95 00 00 00                PUSH ShowVersion2{0x26}+149</pre>
<p>Justamente el PUSH EBP, podemos cambiarlo por un RETN, entonces no entrará directamente a nuestra función, es decir, entrará y luego se irá y no habrá pasado nada. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Entonces tendremos que cambiar el 55 que es el código de operación del PUSH EBP, por un RETN que es un C3.</p>
<p><strong>Parcheando</strong></p>
<p>La pregunta que tendremos inmediatamente, es ¿cómo podemos interceptar ese PUSH EBP, en realidad los dos por las dudas&#8230;?</p>
<p>Lo mejor, es buscar el patrón de bytes, así nos aseguraremos que estamos en el lugar indicado.. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>El patrón que utilicé yo para buscar en ShowVersion2 es: 55 8B EC 83 C4 F4, será el mismo en ShowVersion, ya que es la &#8220;cabecera&#8221; de la función, y siempre es igual, idéntica.</p>
<p>Así que cambiaremos el 55 por un C3, y san se acabó la maldita NAG. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Conclusión</strong></p>
<p>No hay mucho más que decir, son buenos componentes, si los utilizarán con fines lucrativos, cómprenlos, pero la forma en que está protegido esto, es&#8230; deplorable. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Luego podremos recompilar nuestro DPK y reemplazar los nuevos por los viejos, la NAG no aparecerá nunca más ni en Delphi, ni en ningún lado.</p>
<p>Espero que les haya gustado.</p>
<p>Nos vemos en la próxima.</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=J" 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/08/11/crackeando-un-componente-para-delphi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Análisis de Bifrost v1.2 Exhaustivo Parte #1</title>
		<link>http://www.disidents.org/2009/06/19/analisis-de-bifrost-v12-exahustivo-parte-1/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=analisis-de-bifrost-v12-exahustivo-parte-1</link>
		<comments>http://www.disidents.org/2009/06/19/analisis-de-bifrost-v12-exahustivo-parte-1/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 14:07:37 +0000</pubDate>
		<dc:creator>AbsshA</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[AbsshA]]></category>
		<category><![CDATA[BitFrost]]></category>
		<category><![CDATA[Cracking]]></category>
		<category><![CDATA[DisidentS]]></category>
		<category><![CDATA[Ingeniería Inversa]]></category>
		<category><![CDATA[Malware]]></category>
		<category><![CDATA[Reversing Engineering]]></category>
		<category><![CDATA[Trojans]]></category>

		<guid isPermaLink="false">http://www.disidents.org/?p=202</guid>
		<description><![CDATA[Ya llevaba la idea desde hace tiempo y de momento sale la parte #1&#8230; el archivo adjunto contiene: &#8220;Bifrost_core.dll&#8221; -&#62; .DLL con cabecera reparada y descomprimida (de UPX), y tabla IAT arreglada que contiene el núcleo del troyano. &#8220;PE_Header.Bifrost_core.txt&#8221; -&#62; Copia de la Información del PE Header de la librería que se crea en memoria. &#8220;Server.exe_INFECTED&#8221; -&#62; Servidor [...]]]></description>
			<content:encoded><![CDATA[<div>
<div>
<div>Ya llevaba la idea desde hace tiempo y de momento sale la parte #1&#8230; el archivo adjunto contiene:</div>
<p></p>
<div></div>
<div>
<div>&#8220;<em>Bifrost_core.dll</em>&#8221; -&gt; <strong>.DLL con cabecera reparada y descomprimida (de UPX), y tabla IAT arreglada que contiene el núcleo del troyano</strong>.</div>
<p></p>
<div></div>
<div>&#8220;<em>PE_Header.Bifrost_core.txt</em>&#8221; -&gt; <strong>Copia de la Información del PE Header de la librería que se crea en memoria.</strong></div>
<div><strong><br />
</strong></div>
<div>&#8220;<em>Server.exe_INFECTED</em>&#8221; -&gt; <strong>Servidor que se ha analizado (Infectado, aunque no conecta a ningún lado).</strong></div>
<div><strong><br />
</strong></div>
<div>En ésta parte se ve solamente hasta lo que es extraer la .dll de la memoria, en la segunda parte haré el análisis Estático con IDA (que tengo casi terminado) y escribiré el funcionamiento sobre como se Instala en el SO, Protocolos de comunicación, Desinstalación y Contra-Ataques que se puedan hacer&#8230;</div>
<p></p>
<div>Si hay alguien que le interese saber como reparé la .dll una vez volcada que me escriba al privado y haré una Parte III o un Anexo.</div>
<p></p>
<div></div>
<div>Download:</div>
<div></div>
<p></p>
<div><a href="http://www.savefile.com/files/2130462">Mirror 1</a></div>
<div><a href="http://sites.google.com/site/absshacls/Home/Bifrost.v1.2.Analasis.Exahustivo.By.%5BClS%5DAbsshA.rar?attredirects=0">Mirror 2</a></div>
<div>Password: &#8220;crackslatinos&#8221;</div>
<div>&#8211;</div>
<div>AbsshA@disidents.com</div>
</div>
<div>http://abssha.blogspot.com</div>
</div>
</div>
 <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/19/analisis-de-bifrost-v12-exahustivo-parte-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lockless X-Lock Crackme #1 &#8211; (Old Session 2002)</title>
		<link>http://www.disidents.org/2009/06/14/lockless-x-lock-crackme-1-old-session-2002/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=lockless-x-lock-crackme-1-old-session-2002</link>
		<comments>http://www.disidents.org/2009/06/14/lockless-x-lock-crackme-1-old-session-2002/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 17:00:57 +0000</pubDate>
		<dc:creator>spark</dc:creator>
				<category><![CDATA[Spark - @rroba]]></category>
		<category><![CDATA[@rroba]]></category>
		<category><![CDATA[Cracking]]></category>
		<category><![CDATA[Ingeniería Inversa]]></category>
		<category><![CDATA[Old Reversing Session]]></category>
		<category><![CDATA[Reversing Engineering]]></category>
		<category><![CDATA[Reversing Links]]></category>
		<category><![CDATA[SparK]]></category>

		<guid isPermaLink="false">http://www.disidents.org/?p=180</guid>
		<description><![CDATA[En la lección de este mes, les traigo un amigable crackme, que según el autor (  y con razón) es un tutorial, si lo desensamblamos, así que les pegaré el código y eso es todo… jeje , era broma, lo iremos descubriendo de a poco, y aprenderemos juntos. Nos encontramos con una protección que no [...]]]></description>
			<content:encoded><![CDATA[<p>En la lección de este mes, les traigo un amigable crackme, que según el autor (  y con razón) es un tutorial, si lo desensamblamos, así que les pegaré el código y eso es todo… jeje , era broma, lo iremos descubriendo de a poco, y aprenderemos juntos. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Nos encontramos con una protección que no habíamos analizado aun, esta proteccion, es parecida a las utilizadas en los keymes, donde necesitamos un fichero clave para que el programa este registrado, este fichero clave contiene ciertas caracteristicas muy importantes que hacen, que se este registrado o no.</p>
<p>Bueno, este crackme no es un keyme, pero al principio actua como un keyme, nada mas que chequea un par de cosillas distintas, que ya veremos.</p>
<p><strong>Reglas de Juego</strong></p>
<p>Cuando ejecutamos el Crackme , tenemos en la pantalla principal de este, dos botones, y a la izquierda de estos, dos labels, que dicen Shareware y Unregistered.</p>
<p>Miremos en el boton About/Rules, donde nos dice, que hay tres caminos para crackear el crackme, y luego como les comente al principio del articulo, si lo desensamblamos, este crackme, es un tutorial por si mismo, tenemos permitido usar desensamblador y parchear; y por ultimo dice que si somos mejores con SoftIce, lo hagamos con SoftIce, pero nosotros no usaremos SoftIce, usaremos Olly Debugger, asi que no lo desensamblaremos, ni lo parchearemos fisicamente, solo en memoria.</p>
<p><strong>Un poco de teoría</strong></p>
<p>Desensamblemos el crackme, y veremos la pantalla principal de debugger, con el codigo ensamblador mostrandonos como es nuestra victima, debo decirles, que es un poco enradada, pero no nos asusteis, esta todo controlado…</p>
<p>Comenzamos en la dirección 401000, con un recibimiento poco comun en los crackmes (lo he  visto en algunos programas y juegos comerciales, y bastantes nuevos), nada mas ni nada menos que un “Hi Reverser”,</p>
<p>¿ pero quien es el reverser aquí ?, SI! Nosotros, o eso creo….</p>
<p>Luego otro PUSH ( que lo que hace es cargar con una direccion de memoria la cual apuna al string, el string propiamente dicho) que nos dice “Here Starts the test for the Versión” (Aquí empieza el chequeo por la versión).</p>
<p>Nueve instrucciones mas abajo encontramos otro texto que es PUSHeado a la memoria diciendo: “Here end the test for the Versión” (Aquí termina el chequeo por la verision).</p>
<p>Con razon el creador dijo que esto era un tutorial, miren, si nos marca el sector donde hace el chequeo para decirnos si esta registrado o no el programa, nosotros debemos conseguir que en esos dos labels que hay al ejecutarlo en la pantalla principal diga que esta registrado.</p>
<p>Bien, veamos que podemos hacer aquí tenemos lo siguiente:</p>
<p><a href="http://www.disidents.org/wp-content/uploads/2009/06/principalcrackme.jpg"><img class="aligncenter size-medium wp-image-181" title="principalcrackme" src="http://www.disidents.org/wp-content/uploads/2009/06/principalcrackme-300x211.jpg" alt="principalcrackme" width="300" height="211" /></a></p>
<p>En la direccion 0040100B  , la instrucción MOV [DWORD DS:40300C],1 y en la direccion 00401015 , la instrucción MOV [DWORD DS:403008],1 ;  analicemos para que sirven y porque las nombro de entre todas las demas, ¿ ustedes piensan que tienen coronita ? pues no, no la tienen, o de algun modo si… <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Los dos MOV’s mueven un 1 en decimal, a dos direcciones de memoria diferentes…. Anotemos la direccion 403008.</p>
<p>Más abajo en la dirección 00401021 , tenemos la instruccion  LEA EAX,[DWORD DS:403010], que carga el valor que esta en la zona de memoria 403010 a  EAX, y luego la instrucción de la direccion 00401029 que nos dice:</p>
<p><a href="http://www.disidents.org/wp-content/uploads/2009/06/captura1reg1deverdad.jpg"><img class="aligncenter size-medium wp-image-183" title="captura1reg1deverdad" src="http://www.disidents.org/wp-content/uploads/2009/06/captura1reg1deverdad-300x43.jpg" alt="captura1reg1deverdad" width="300" height="43" /></a></p>
<p>CMP EAX,X-LOCK~1.00403012</p>
<p><a href="http://www.disidents.org/wp-content/uploads/2009/06/captura1reg2deverdad.jpg"><img class="aligncenter size-medium wp-image-184" title="captura1reg2deverdad" src="http://www.disidents.org/wp-content/uploads/2009/06/captura1reg2deverdad-300x24.jpg" alt="captura1reg2deverdad" width="300" height="24" /></a></p>
<p>Luego viene nuestro push querido indicandonos el fin del programa, un pop eax, y un salto JE, que nos lleva  a la direccion 401040….</p>
<p><strong>Algo muy notorio</strong></p>
<p>Muy bien, ¿que es lo notorio?, ese salto a 401040 nos lleva a continuar el flujo del programa normalmente, ¿pero que sucede si este salto no se realiza?, veamos:</p>
<p>00401036   MOV [DWORD DS:403008],0</p>
<p>¿Pero que sucede aquí?, en 403008, la que yo les dije que recordaran , pone un 0!!!, ¿porque? Sigamos mirando y deduzcamos si ese 0 es necesario para estar registrados o no…</p>
<p><a href="http://www.disidents.org/wp-content/uploads/2009/06/chequeaeaxpor1.jpg"><img class="aligncenter size-medium wp-image-185" title="chequeaeaxpor1" src="http://www.disidents.org/wp-content/uploads/2009/06/chequeaeaxpor1-300x12.jpg" alt="chequeaeaxpor1" width="300" height="12" /></a></p>
<p>Mas adelante en el programa , carga la ventana principal, en la direccion 401077 chequea , por si se ha clickeado un boton, y si es asi, pregunta cual de ellos, etc, etc. Esta rutina es comun en todos los programas, ya que es la rutina principal que chequea por cada opcion, o boton , si fue presionado o no, y en caso afirmativo se deriva el flujo del programa a la direccion correspondiente a la accion solicitada por el usuario.</p>
<p>Lo bueno comienza en la direccion 0040109D, donde nos encontramos el push identico, al primero que vimos en la apertura del programa desensamblado, y unas lineas de codigo mas abajo el otro push que nos indica que finaliza la seccion de registro, tal cual en el principio.</p>
<p>¿ Se acuerdan de los mirror checks que yo les habia explicado en articulos anteriores ?, bien, aquí lo tienen, la proteccion se repite en dos zonas de memoria distintas, o sea, que si nosotros parcheamos solamente la primera, o encontramos la segunda y parcheamos solamente esta, la otra seguira actuando normalmente y no nos dejara el programa registrado, por supuesto todo esto depende de cómo el programa este implementado, porque en nuestro caso, con modificar el segundo chequeo , nuestro crackme ya esta completamente funcional.</p>
<p>Fijense que en la direccion 0040109D vuelve a hacer lo mismo que antes.</p>
<p>Carga en EAX, lo que contiene la direccion 403010 y lo compara con lo que hay en la direccion 403012, si no llegan a ser iguales en la direccion 004010AD salta a la direccion 004010B9, pero la instrucción MOV [DWORD DS:40300C],0 de la linea anterior no es ejecutada, si se produce el salto, pero miren atentamente moveria un 0 decimal a la direccion 40300C, es otra zona!, es un doble chequeo, pero chequea dos zonas distintas de memoria, miremos mas,</p>
<p>miremos mas….. <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/redireccion.jpg"><img class="aligncenter size-medium wp-image-182" title="redireccion" src="http://www.disidents.org/wp-content/uploads/2009/06/redireccion-300x90.jpg" alt="redireccion" width="300" height="90" /></a></p>
<p>En la direccion 004010A2  tenemos un  LEA EAX,[DWORD DS:403010], 403010 tiene un 31 en hexa (1 en decimal), lo que al compararlo en 4010A8 con el valor de 00403012 que contiene un 30 en decimal (0 en decimal), hara que no salte y entonces el mov de la direccion 004010AF pondra a 40300C en  0 y no estaremos registrados.</p>
<p>A partir de la direccion de memoria 4010E6 hasta 4010EE tenemos lo siguiente:</p>
<p>MOV EAX,[DWORD DS:403008]   ;  mueve lo que contiene 403008 a EAX</p>
<p>CMP EAX,1<span> </span> ; lo compara con 1</p>
<p>JNZ SHORT X-LOCK~1.00401105 ; y luego si no es igual salta a 401105</p>
<p>Mas abajo miremos, las strings cargadas…</p>
<p>004010F6  |. 50             PUSH EAX                                 ; /Text =&gt; &#8220;Fullversion&#8221;</p>
<p>00401115  |. 50             PUSH EAX                                 ; /Text =&gt; &#8220;Registered&#8221;</p>
<p>Necesitamos que estas strings se carguen, para que nuestro crackme funcione correctamente!!!, pero como podemos hacerlo??? Bien, el salto de la direccion 4010EE no nos lleva a poder ejecutar esas strings, por lo menos la de Fullversion no, pero sin embargo salta a una direccion anterior a la de la string “Registered”, salta a 401105, y “Registered”, esta en 401115, o sea que algo debe haber en el medio..  &gt;: \</p>
<p>Perfecto, en la dirección 401105 tenemos lo mismo que en la direccion 4010E6 nada mas que el MOV EAX,[DWORD DS:403008]  , cambia por MOV EAX,[DWORD DS:40300C]  , aquí sucede lo mismo que antes, si no se cumple la misma condicion, o sea en la direccion 40300C no esta el valor 1 decimal, tampoco carga la string “Registered”, y nuestro programa no estaria ni completo (Fullversion) ni registrado (Registered).</p>
<p><a href="http://www.disidents.org/wp-content/uploads/2009/06/poneeditsregistrado.jpg"><img class="aligncenter size-medium wp-image-186" title="poneeditsregistrado" src="http://www.disidents.org/wp-content/uploads/2009/06/poneeditsregistrado-300x53.jpg" alt="poneeditsregistrado" width="300" height="53" /></a></p>
<p><strong>Alternativas de Cracking:</strong></p>
<p>Hay muchas alternativas, para hacer que nuestro pequeño funcione, podemos modificar los saltos de las direcciones 401034 y 4010EE, entonces como los valores de las direccion 403008 y 40300C seran 0 saltara, y nos hara registrar, simplemente cambiar los JNZ por JZ y listo, o sino por JMP y estos se transformaran en saltos INcondicionales, o sea, no importa si son iguales o no los valores, el salto se realiza igual.</p>
<p>Otra alternativa mas “elite”, y menos sucia que cambiar saltos y forzar el flujo del programa, es modificar la instrucción LEA de la direccion 00401021  , donde mueve lo que contiene 403010 a EAX, como lo que contiene 403010 es un 1 en decimal, siempre no saltara y nos pondra en 403008 el valor 0 con lo que no estaremos registrados nunca, entonces ¿por cual valor podemos moficar el operando de la instrucción LEA? Por una direccion de memoria como por ejemplo 403012, que contiene 0, entonces cuando llegue al CMP EAX, 403012, simplemente comparara el valor que contiene 403012 con el que contiene 403012, ¿resultado?, se produce el salto, y asi nuestro soldadito atrapado en  403008 (el 1), seguira vivo y no sera machacado….</p>
<p>Otra alternativa seria cambiar el CMP EAX,403012 por 403010, ya que, sera lo mismo, nada mas que en 403010 hay un 1 y no un 0 decimal como en 403012.</p>
<p>Luego en 004010A2 podemos modificar la instrucción LEA , por 403012, o inclusive podemos hacer un MOV EAX,0  y seria suficiente porque 403012 contiene un 0 decimal, y debemos hacer que el salto se produzca, y como el salto se produce cuando son iguales, pues ya lo tenemos <img src='http://www.disidents.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Tambien podemos modificar el CMP, como en la zona de chequeo anterior o el salto JNZ.</p>
<p><strong>Triunfadores:</strong></p>
<p>Hemos  triunfado de nuevo, como podemos ver, nos aparece una ventanita, diciendonos, que hemos craqueado exitosamente el crakme, y que esperemos el segundo que sera mas difícil de crackear, ¿lo sera? Quizas si…. Quizas no….</p>
<p>¡Hasta la próxima!</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/14/lockless-x-lock-crackme-1-old-session-2002/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CutedEvil Crackme #1 (Old Session &#8211; 2002)</title>
		<link>http://www.disidents.org/2009/04/05/cutedevil-crackme-1-old-session-2002/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=cutedevil-crackme-1-old-session-2002</link>
		<comments>http://www.disidents.org/2009/04/05/cutedevil-crackme-1-old-session-2002/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 01:44:50 +0000</pubDate>
		<dc:creator>spark</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Spark - @rroba]]></category>
		<category><![CDATA[@rroba]]></category>
		<category><![CDATA[Cracking]]></category>
		<category><![CDATA[crackme]]></category>
		<category><![CDATA[cutedevil]]></category>
		<category><![CDATA[Ingeniería Inversa]]></category>
		<category><![CDATA[Reversing Links]]></category>
		<category><![CDATA[SparK]]></category>
		<category><![CDATA[SparKrisp]]></category>

		<guid isPermaLink="false">http://www.disidents.org/?p=127</guid>
		<description><![CDATA[  CuTedEvil CrackMe #1 Análisis y Parcheo.   Buenas, a todos los lectores de @rroba, soy SparK, del team DisidentS, y les ofrezco mis nobles y humildes conocimientos en este arte de la Ingeniería Inversa. Espero que se diviertan tanto como yo lo he hecho con este crackme, en realidad no es nada difícil, pero [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p align="CENTER"><span style="font-family: Arial, sans-serif;"><span style="font-size: x-large;">CuTedEvil CrackMe #1</span></span></p>
<p align="CENTER"><span style="font-family: Arial, sans-serif;"><span style="font-size: large;"><span style="text-decoration: underline;">Análisis y Parcheo.</span></span></span></p>
<p align="CENTER"> </p>
<p align="JUSTIFY"><span style="font-family: Arial;">Buenas, a todos los lectores de @rroba, soy SparK, del team DisidentS, y les ofrezco mis nobles y humildes conocimientos en este arte de la Ingeniería Inversa.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Espero que se diviertan tanto como yo lo he hecho con este crackme, en realidad no es nada difícil, pero a veces es lindo acorralar fácilmente a una víctima o no? <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Quizás algunos de ustedes sean avezados Reverser&#8217;s y piensen al leerme, ¿pero que es esto? ¿El abecedario una y otra vez?, quizás otros novatos newbies, o simplemente lectores interesados en este arte digan: “mmmm, interesante”, quiero que sepan todos ustedes, intentaré darles siempre pensamientos frescos e ideas nuevas, por eso es bello este arte, es muy diverso.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Pero, vamos por partes, dijo Jack el Destripador, ¿Qué es un Crackme?</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Ok, para los que no lo saben, un crackme es un programita que sirve para ejecitarse en el arte de la ingeniería inversa, en pocas palabras, es un “ejercicio de aplicación”.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">¿ Que lograremos crackeando un crackme?</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Pues, muchísimas cosas, primero, hay crackmes con las mas diversas protecciones y ocurrencias, en síntesis sirve para poder aprender, concentrarse en ese código difícil de aprender e interpretar a simple vista llamado Ensamblador, para poder memorizar técnicas, rutinas,  y luego, en otro momento cuando miremos otro código digamos, “ah!, es mas o menos parecido a&#8230;” , en fin, ejercitas, la lógica, la memoria, y a la vez si no sabes o no entiendes ni medio de lo que pasa en ese maldito crackme, <strong>aprendes</strong>, que es lo más importante que te puede suceder aquí.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Les daré mas pistas, existen muchos tipos de ejercicios de aplicación, algunos de ellos son los Reverse me&#8217;s, los Tool me&#8217;s y demás, los primeros debes conocer ensamblador a fondo, y reprogramar la aplicación, o inclusive agregar código faltante, ¿ interesante no ? , ya veremos algunos, no desesperéis&#8230;. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Este Crackme, lo he bajado de <a href="http://www.crackmes.de/">www.crackmes.de</a> , y hasta hoy no tenía solución.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">El crackme, tiene un aspecto como una caja de registro típica de cualquier programa, deberemos ingresar Nombre de Usuario, Serial, y luego click en Check.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Si hacemos click en Read the Rulez!, nos dirá que debemos programar un keygen, ok, ¿que es eso? Un programa que genere seriales aceptables para el crackme, ingresandole cualquier nombre de usuario, para poder hacer esto debemos conocer y entender que sucede dentro del crackme y como se calcula el serial a partir de un nombre de usuario dado.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Ok, empecemos parcheándolo, ¿porque? ,  pues porque no tenemos que analizar mucho para parchearlo, aunque no este permitido en las reglas del juego, lo haré para explicarles a los más novatillos como se debe hacer.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial">Les comento algo a todos, parchear es nocivo para la mente del cracker, se dice que es un sucio crack, aquel que pudiendo aplicar técnicas mas “finas”,  parchea, ¿ porque ?, porque aquí queremos aprender, y el facilismo nos lleva a la mediocridad, entonces, si parcheamos, es fácil crackearlo, como verán solo cambiando uno o dos bytes, pero si hacemos un serial fishing, y aún muchísimo mejor , programamos una keygen, estamos demostrandonos sobre todo, que sabemos bien lo que sucede en nuestra querida pc, y que podemos entender tarde o temprano, lo que sea. Aunque si no está a nuestros alcances hacer un keygen aún, paciencia, parchear es divertido <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Carguemos el Olly, (¿que porque olly?, porque me anda muy bien en mi win xp), y ejecutemoslo, presionando F9, ¿que sucede?, aparece nuestro programilla, ponemos un nombre de usuario, SparK, ahora un serial, 0123456, y click en Check, que sucede?&#8230;&#8230;&#8230; NADA!</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Ok, se dice en el Zen Cracking, que todo cracker necesita una referencia para penetrar en el código de un programa, los seres humanos, tenemos referencias, los objetos los identificamos con los sentidos, son distintos, son reconocibles, en el cracking sucede lo mismo, el cracker necesita un punto de referencia, al principio los novatos necesitan puntos de referencia mas “humanos”, pero luego, te acostumbras al lenguaje interno de las máquinas y empiezas a encontrar referencias que antes no veías, esto , se llama práctica.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Nuestro punto de referencia, aquí sería un cartel, llamado messagebox que diga “Incorrect Serial” o algo por el estilo, entonces, nosotros desensamblaríamos el programa, y buscaríamos donde se llama a ese messagebox y un poco antes encontraríamos el salto que nos lleva al cartel exitoso o al fracaso, simplemente invertirlo y PUM!, “You are registered”.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial">Pero no, no soñemos mas, enfrentemos la realidad, no hay messagebox, no nos dice nada, pero tampoco nos registra y eso nos pone mal, muy mal. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Ok, busquemos en el Olly, por alguna referencia de strings, miremos un poquito más abajo y encontramos algo como esto:</span></p>
<p style="text-align: center; " align="JUSTIFY"><a href="http://www.disidents.org/wp-content/uploads/2009/04/figura1.jpg"><img class="aligncenter size-thumbnail wp-image-135" title="figura11" src="http://www.disidents.org/wp-content/uploads/2009/04/figura11-150x150.jpg" alt="figura11" width="150" height="150" /></a></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Perfecto!, algunas referencias hemos encontrado, miren esta,  &#8220;Congratulations, you cracked this program <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#8221;, miremos mas arriba de esta referencia, y encontramos este salto:</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">004012E8  |. 74 0F          |JE SHORT CuTedEvi.004012F9</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Bien, si invertimos ese salto, tendríamos que estar registrados, probemos cambiar el 74 por un 75 (JNE), hagamos click sobre la instrucción de salto, presionemos la tecla espaciadora, y ahora, cambiemos el JE por un JNE, y listo, apretemos F9, ¿¿que pasa?? nada, sigue haciendo lo mismo, ¿pero que pasa aqui?</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Seguramente existe lo que se llama, mirror check, es un chequeo primario o secundario, que se hace en otra parte del código, que seguramente chequea longitud del nombre de usuario, del serial ingresado, o algun cálculo con ellos posterior, miremos un poco más, ¿ven porque no es bueno parchear a lo bruto?, si no conoces el código y lo haces mecánicamente, puedes quedar mal parado ante una demostración ;oD</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">¿Pero, como encontrar el otro chequeo?, miremos, observermos, debugiemos el código, una y otra vez, pongamos breakpoints, haber, ¿ que sucede generalmente en estas rutinas a nivel interno para obtener los textos introducidos por el usuario?, una pista, referencia, aparentemente oculta, pero existe, generalmente se llama a la API GetDlgItemText, o GetDlgItemTextA, para obtener el texto, pues ¿que hace?, obtiene el texto del editbox del nombre de usuario por ejemplo, y pone en el registro EAX la longitud del texto introducido.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Busquemos la/las llamadas a esta hermosa API&#8230;..</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Aquí hay algo interesante:</span></p>
<p style="text-align: center;" align="JUSTIFY"><a href="http://www.disidents.org/wp-content/uploads/2009/04/figura2.jpg"><img class="aligncenter size-thumbnail wp-image-136" title="figura21" src="http://www.disidents.org/wp-content/uploads/2009/04/figura21-150x150.jpg" alt="figura21" width="150" height="150" /></a></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Ok, tenemos en 0040115B que carga el ID de uno de los editbox, seguramente el del nombre de usuario, y en</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">0040117E, el ID del serial, ahora 00401166 y en 00401191 es llamada la API mencionada.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;">Fijense algo curioso, luego de llamarlas a las APIs encontramos lo siguiente:</span></span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">0040118E  	CMP EAX,0</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;"> 00401191  	JE CuTedEvi.0040132B</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Recuerden que les conté en secreto que GetDlgItemTextA, devuelve en EAX la longitud del texto extraído de una editbox, entonces, aquí compara la longitud con 0 y si es 0, salta a otro lado, con lo que no iría por buen camino, ya que nosotros debemos ingresar un serial y un nombre de usuario, sino no chequeará nada y seguirá su rumbo&#8230;..</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Existe otra API llamada lstrlenA, que justamente obtiene la longitud de una string. ¿ pero porque esta llamada aquí ?, si ya sabemos cuanto tiene cada string&#8230; quiere decir, que debe necesitarlo, miremos:</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">PUSH CuTedEvi.0040332B                   	; /String = &#8220;&#8221;</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;"> CALL &lt;JMP.&amp;KERNEL32.lstrlenA&gt;           ; \lstrlenA</span></p>
<p align="JUSTIFY"><span style="font-family: Arial"> CMP EAX,0</span></p>
<p align="JUSTIFY"><span style="font-family: Arial"> JE SHORT CuTedEvi.004012F7 </span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">De nuevo un chequeo por 0, y salta a donde el otro chequeo lo hace, 004012F7, como podemos ver, ese salto, es por donde NO debemos ir.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;">Bien, pensemos ahora, que sucede, ¿si no salta a 004012F7?, algo hace, algo debe hacer, y de hecho lo hace&#8230;</span></span></p>
<p style="text-align: center;" align="JUSTIFY"><a href="http://www.disidents.org/wp-content/uploads/2009/04/figura31.jpg"><img class="aligncenter size-thumbnail wp-image-138" title="figura31" src="http://www.disidents.org/wp-content/uploads/2009/04/figura31-150x150.jpg" alt="figura31" width="150" height="150" /></a></p>
<p align="JUSTIFY"><span style="font-family: Arial;">ROL es una instrucción de cálculo, rota los bits hacia la izquierda, hagamos de cuenta que multiplicamos por 5 (en decimal) un valor.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">SUB resta 123 (en hexadecimal).</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">ADD suma 321 (en hexa también)</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">CMP compara con un valor, en este caso 2FE.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Luego si, no es EAX ese valor esperado, salta al famoso <em>salto del fracaso</em>. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
<p align="JUSTIFY"><span style="font-family: Arial;"><span style="text-decoration: underline;">Apliquemos Ingeniería Inversa:</span></span></p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY"><span style="font-family: Arial;">el valor esperado en eax como resultado de los cálculos es 2FE (33 en decimal), en EAX, tenemos la longitud de la cadena serial luego de llamar a lstrlenA, entonces, hagamos el cálculo inverso para ver, que longitud necesitamos tener en el editbox serial.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Tomemos 2FE, restemosle 321, esto nos da un número negativo FFFFFFFFFFFFFFDD, ahora sumemos 123, y nos da 100 (siempre en hexadecimal, no se confundan), ahora ROL multiplica por 5, ahora DIVIDAMOS por 5, ¿¿ y que obtenemos ?? un lindo y hermoso <strong>33</strong><span>.</span></span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Esa, esa cifra señores, es la longitud que el programa necesita que tenga el serial, para poder seguir chequeando.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Ahora , modifiquemos el valor del serial, y miremos, que pasa: 012345678901234567890123456789012 , ese serial introduje yo, 33 valores cualquiera ni más, ni menos&#8230;</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Ahora miremos que estamos muy cerca de los cartelitos de antes, ¿se acuerdan?, ok, les muestro que pasa antes:</span></p>
<p style="text-align: center;" align="JUSTIFY"><span style="font-family: Arial;"><a href="http://www.disidents.org/wp-content/uploads/2009/04/figura4.jpg"><img class="aligncenter size-thumbnail wp-image-139" title="figura41" src="http://www.disidents.org/wp-content/uploads/2009/04/figura41-150x150.jpg" alt="figura41" width="150" height="150" /></a><br />
</span></p>
<p align="JUSTIFY">Ok, tenemos el salto que habíamos parcheado hoy, pero, con la diferencia que sabemos que pasa antes, ahora solamente lo que podemos hacer son dos cosas, o introducir un número cualquiera de 33 caracteres, y luego parchear ese salto, o sino, parchear los dos saltos:</p>
<p>Primero: 		<span style="font-family: Arial;"><span>CMP EAX,2FE</span></span></p>
<p align="JUSTIFY"><span style="font-family: Arial;"> JNZ SHORT CuTedEvi.004012F7</span></p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">Segundo:		<span style="font-family: Arial;"><span style="font-size: x-small;"><span><span>CMP BL,0</span></span></span></p>
<p align="JUSTIFY"><span style="font-family: Arial;"> JE SHORT CuTedEvi.004012F9</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">y Listo!, felicidades lo has logrado. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></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/04/05/cutedevil-crackme-1-old-session-2002/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sólo quiero bajar algo por ftp! (con FlashFXP xD)</title>
		<link>http://www.disidents.org/2009/02/05/solo-quiero-bajar-algo-por-ftp-con-flashfxp-xd/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=solo-quiero-bajar-algo-por-ftp-con-flashfxp-xd</link>
		<comments>http://www.disidents.org/2009/02/05/solo-quiero-bajar-algo-por-ftp-con-flashfxp-xd/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 01:18:45 +0000</pubDate>
		<dc:creator>spark</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Papers]]></category>
		<category><![CDATA[Aplicaciones Inseguras]]></category>
		<category><![CDATA[Cracking]]></category>
		<category><![CDATA[Downloader]]></category>
		<category><![CDATA[FlashFXP Reversing]]></category>
		<category><![CDATA[Ingeniería Inversa]]></category>
		<category><![CDATA[SparK]]></category>
		<category><![CDATA[Troyano]]></category>
		<category><![CDATA[Virus]]></category>

		<guid isPermaLink="false">http://www.disidents.org/?p=33</guid>
		<description><![CDATA[Hola a todos, el otro día buscando un FlashFXP para bajar algo , encontré la última versión&#8230;.la bajé&#8230;.al ejecutarla, me pidió número de serie&#8230; utilicé el keygen que lo acompañaba. Cuando puse el serial el programa siguió su camino, me apareció una ventanita que decía c:\windows\system32 &#8230;. Me pareció muy raro y sospeché de un [...]]]></description>
			<content:encoded><![CDATA[<p>Hola a todos, el otro día buscando un FlashFXP para bajar algo , encontré la última versión&#8230;.la bajé&#8230;.al ejecutarla, me pidió número de serie&#8230; utilicé el keygen que lo acompañaba.</p>
<p>Cuando puse el serial el programa siguió su camino, me apareció una ventanita que decía c:\windows\system32 &#8230;.</p>
<p>Me pareció muy raro y sospeché de un virus&#8230; obviamente seguí utilizando el programa, y NOD me avisó que &#8220;algo&#8221; se quería conectar&#8230; algo con nombre como qsyrjrwes.exe en la carpeta Datos de Programa de mi usuario en Windows XP.</p>
<p>Obviamente, escribí en arroba sobre ese EXE, para ver de que se trataba, era un simple downloader, definido como downloader.Win32&#8230; Ya postearé el artículo explicando de qué se trata&#8230; <img src='http://www.disidents.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Bueno obviamente, el EXE de flashfxp estaba &#8220;envuelto&#8221; por un dropper, éste sacaba el downloader, y después hacía ejecutar al flashfxp normalmente&#8230;</p>
<p>Empezando a mirar el EXE, encontramos algunas strings que se cargan, y mirándolas por arriba, pienso que son strings encriptadas que desencripta en tiempo de ejecución&#8230;</p>
<p><a href="http://www.disidents.org/wp-content/uploads/2008/12/1.jpg"><img class="aligncenter size-medium wp-image-34" title="1" src="http://www.disidents.org/wp-content/uploads/2008/12/1-300x96.jpg" alt="Strings Encriptadas" width="300" height="96" /></a></p>
<p>Seguramente para evitar que los AV&#8217;s detecten el proceso&#8230;</p>
<p>Cuando debuggeemos por las strings &#8220;.dll&#8221; y &#8220;.exe&#8221;, más precisamente en las direcciones 408D03 y 408D15 veremos estas cosas en la pila:</p>
<p style="text-align: center; ">0012FFAC   01141C30  0  ASCII &#8220;C:\WINDOWS\system32\niksr.dll&#8221;</p>
<p>y luego,</p>
<p style="text-align: center; "> </p>
<p>0012FFA8   01141CA4  ¤  ASCII &#8220;C:\DOCUME~1\SPARKR~1\CONFIG~1\Temp\setup.exe&#8221;</p>
<p style="text-align: left; ">Luego de eso, en estas direcciones podremos ver que el ejecutable creado en la carpeta temporal de nuestro windows, posee un icono de flashfxp&#8230; es raro.. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: left; "> </p>
<p style="text-align: center; ">00408D39  |. A1 C8A94000    MOV EAX,DWORD PTR DS:[40A9C8]</p>
<p style="text-align: center; ">00408D3E  |. E8 BDFDFFFF    CALL setup-pr.00408B00</p>
<p style="text-align: left; ">En estas dos líneas se ejecuta el EXE liberado en la carpeta temporal de Windows. Igualmente no es el EXE final.</p>
<p style="text-align: left; ">Veremos que entrando al CALL mencionado dos líneas más arriba, y mirando un poco más, se crea un objeto Mutex.</p>
<p style="text-align: left; "><a href="http://www.disidents.org/wp-content/uploads/2008/12/2.jpg"><img class="aligncenter size-medium wp-image-36" title="2" src="http://www.disidents.org/wp-content/uploads/2008/12/2-300x93.jpg" alt="Mutex" width="300" height="93" /></a></p>
<p>Veamos para que sirve un mutex (una definición de la red&#8230;):</p>
<p><em>&#8220;Un mutex funciona exactamente del mismo modo que las secciones críticas. La única diferencia en las implementaciones Win32 es que la sección crítica esta limitada para ser usada con </em><span style="text-decoration: underline;"><em>solamente un proceso</em></span><em>. Si tienes un programa que usa varios hilos, entonces la sección crítica es liviana y adecuada para tus necesidades. Sin embargo, cuando escribes una DLL, es muy posible que diferentes procesos usen la DLL en el mismo momento. En este caso, debes usar mutexes, en lugar de secciones críticas.&#8221;</em></p>
<p>Veremos en la imagen, que genera un código único, que se utiliza como nombre del mutex, para crearlo, con la API CreateMutexA.</p>
<p>Seguido de esto, parece que nuestro troyano necesita descomprimir una dll denominada bcdsa.dll, veamos:</p>
<p>EAX apunta al string C:\WINDOWS\system32\bcdsa.dll.</p>
<p>El ejecutable busca el archivo bcdsa.dll y si no existe, lo crea.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-89" title="fxp1" src="http://www.disidents.org/wp-content/uploads/2009/02/fxp1.jpg" alt="fxp1" width="551" height="44" /></p>
<p>Luego de crear la DLL, descomprime el segundo EXE como hemos visto que el path estaba en memoria y crea el Thread finalmente con la DLL deseada. Capturemos la DLL, para futuro análisis. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Si vamos a buscar la DLL y vemos propiedades encontraremos una descripción extraña:</p>
<p><img class="aligncenter size-full wp-image-90" title="fxp2bcdsa" src="http://www.disidents.org/wp-content/uploads/2009/02/fxp2bcdsa.jpg" alt="fxp2bcdsa" width="402" height="502" /></p>
<p><img class="aligncenter size-full wp-image-91" title="fxp3bcdsa" src="http://www.disidents.org/wp-content/uploads/2009/02/fxp3bcdsa.jpg" alt="fxp3bcdsa" width="404" height="502" /></p>
<p>O es una librería que necesitará el flashfxp final o es algo más&#8230;</p>
<p><img class="aligncenter size-full wp-image-92" title="fxp4" src="http://www.disidents.org/wp-content/uploads/2009/02/fxp4.jpg" alt="fxp4" width="530" height="75" /></p>
<p>Luego de que el Thread es creado, nos aparecerá la ventanita con el mensaje: &#8220;c:\windows\system32&#8243;, esto es lo que me hizo sospechar de la actividad de este ejecutable. Es una falla de programación importante, ya que se da a conocer muy sencillamente, parece que el programador tenía pocos recursos para poder darse cuenta cuando la DLL estaba cargada en memoria&#8230; <img src='http://www.disidents.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Ahora veremos el segundo ejecutable.</p>
<p>Una vez que nuestro amigo está descomprimido veremos que al cargarlo está hecho en C, por eso mismo carga nuestra DLL, que se trata nada más ni nada menos de las MFC, librerías runtime necesarias. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Este EXE, descomprimirá el FlashFXP final, pero además agregará la descompresión de un downloader&#8230; <img src='http://www.disidents.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  para fines non santos&#8230;</p>
<p><img class="aligncenter size-full wp-image-97" title="fxp5" src="http://www.disidents.org/wp-content/uploads/2009/02/fxp5.jpg" alt="fxp5" width="575" height="146" /></p>
<p>El ejecutable de FlashFXP será descomprimido en c:\windows\ bajo el nombre de setup.exe</p>
<p><img class="aligncenter size-full wp-image-103" title="fxp6" src="http://www.disidents.org/wp-content/uploads/2009/02/fxp6.jpg" alt="fxp6" width="573" height="209" /></p>
<p>En esta imagen, podemos ver como ejecuta a FlashFXP original y a su vez, descomprime y crea el downloader, cuyo nombre es aleatorio.</p>
<p>Finalmente, tratará de ejecutar el Downloader, como veremos acá:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-104" title="fxp7" src="http://www.disidents.org/wp-content/uploads/2009/02/fxp7.jpg" alt="fxp7" width="539" height="75" /></p>
<p>Por último el proceso termina, llamando a ExitProcess. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Entonces si queremos nuestro EXE final de FlashFXP, directamente lo buscamos en la carpeta Windows de nuestro sistema.</p>
<p>Nos damos cuenta que el EXE es el original, porque al hacer botón derecho y propiedades, veremos los datos originales de la aplicación. Lo cuál ante un usuario atento, se dará cuenta que los otros ejecutables no son los originales. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Es importantísimo poder tener firmado los ejecutables de nuestras aplicaciones, además de poder tener la información guardada como propiedades del ejecutable, de manera que un usuario puede verificar la autenticidad de varias maneras.</p>
<p>Siempre hay que estar atento a actividades extrañas, como por ejemplo la ventana que sale a modo de información avisando que la DLL ya fue creada, para poder continuar la descompresión&#8230;. como lo vimos anteriormente.</p>
<p>Eso es todo, espero que les haya servido y gustado. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Nos vemos la próxima.</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/02/05/solo-quiero-bajar-algo-por-ftp-con-flashfxp-xd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solucionando un CrackME de Hispasec!</title>
		<link>http://www.disidents.org/2009/01/20/solucioncrackinghispasec/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=solucioncrackinghispasec</link>
		<comments>http://www.disidents.org/2009/01/20/solucioncrackinghispasec/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 10:35:10 +0000</pubDate>
		<dc:creator>noukeys</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Cracking]]></category>
		<category><![CDATA[Desafío]]></category>
		<category><![CDATA[Hispasec]]></category>
		<category><![CDATA[Ingeniería Inversa]]></category>
		<category><![CDATA[noukeys]]></category>
		<category><![CDATA[Reto Hispasec]]></category>

		<guid isPermaLink="false">http://www.disidents.org/?p=38</guid>
		<description><![CDATA[  En el presente escrito se abordará la resolución del CrackME de hispasec, llamado a partir de ahora crackme o reto, detallando las siguientes partes.  ¿Qué se pretende?  Encontrando la zona de interés.  Análisis del algoritmo.  Generación de un fichero válido.  Fallos de diseño.  Despedida y cierre.   El crackme y el fichero de licencia [...]]]></description>
			<content:encoded><![CDATA[<p>  En el presente escrito se abordará la resolución del CrackME de hispasec, llamado a partir de ahora crackme o reto, detallando las siguientes partes.</p>
<ul type="disc">
<li class="MsoNormal"> ¿Qué se pretende?</li>
<li class="MsoNormal"> Encontrando la zona de interés.</li>
<li class="MsoNormal"> Análisis del algoritmo.</li>
<li class="MsoNormal"> Generación de un fichero válido.</li>
<li class="MsoNormal"> Fallos de diseño.</li>
<li class="MsoNormal"> Despedida y cierre.</li>
</ul>
<p>   El crackme y el fichero de licencia lo podeis encontrar en el siguiente enlace.</p>
<ul>
<li><a title="This external link will open in a new window" href="http://rapidshare.com/files/183931546/Ficheros.rar.html" target="_blank">CrackME!</a></li>
</ul>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">1.- ¿Qué se pretende?</td>
</tr>
</tbody>
</table>
<p>   El objetivo de este reto, es generar un fichero de licencia válido y explicar los fallos de diseño encontrados en los hilos. Quiero comentar que en este documento encontraremos lo que a mi juicio son fallos de diseño, no tienen porque coincidir con los criterios de los autores del reto.  Para la resolución de este reto se ha utilizado un depurador y un editor hexadecimal, en mi caso he optado por Ollydbg y por Hex Workshop.      </p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">2.- Encontrando la zona de interés.</td>
</tr>
</tbody>
</table>
<p>   Para llegar a la zona que nos interesa analizar, y sabiendo de antemano que necesitamos un fichero de licencia, tenemos varia maneras de abordar nuestro cometido; explicaré un par de ellas.</p>
<ul type="disc">
<li class="MsoNormal"> Localizando la función de chequeo mediante referencias a cadenas.</li>
</ul>
<p>Nada más cargar nuestro reto en el depurador, parados en el oep, buscamos referencias a cadenas con search for &gt; All referenced text strings. Obtenemos esto.</p>
<p style="text-align: center; " align="center"><img class="aligncenter size-full wp-image-56" title="img1nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img1nk.jpg" alt="img1nk" width="498" height="74" /></p>
<p>Podemos ver las cadenas &#8220;crackem.lic&#8221;, &#8220;Good job!&#8221; y &#8220;Keep trying&#8221;, es evidente que nuestro objetivo es &#8220;Good job&#8221;. Seguimos la cadena y caemos en este punto.  <img class="aligncenter size-full wp-image-57" title="img2nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img2nk.jpg" alt="img2nk" width="545" height="76" />  </p>
<p class="MsoNormal"><span lang="ES">En función de un par de comparaciones carga una de las cadenas. Seguimos el código hacia arriba, para ver donde se inicia esta función.</span></p>
<p class="MsoNormal"><span lang="ES"><img class="aligncenter size-full wp-image-58" title="img3nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img3nk.jpg" alt="img3nk" width="578" height="130" /></span></p>
<p class="MsoNormal"><span lang="ES">Aquí encontramos el inicio de la función, en la dirección 004010B0, vamos a fijarnos un momento que llama a la API CreateFileA, pero el atributo Mode es OPEN_EXISTING. </span><span>Esto es importante para el siguiente punto.</span></p>
<ul type="disc">
<li class="MsoNormal"><span lang="ES"> Localizando      la función de chequeo utilizando la API de Windows.</span></li>
</ul>
<p> </p>
<p class="MsoNormal"><span lang="ES">Ahora vamos a utilizar la API de Windows para llegar al mismo punto. Nada más cargar nuestro reto en el depurador, parados en el oep, buscamos referencias a APIs cargadas con search for &gt; Name (label) in current module. </span><span>Obtenemos esto.</span></p>
<p class="MsoNormal"><span><img class="aligncenter size-full wp-image-59" title="img4nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img4nk.jpg" alt="img4nk" width="418" height="232" /></span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span lang="ES">Vamos a poner un BP en cada API específica de ficheros.</span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">KERNEL32.CreateFileA</p>
<p class="MsoNormal">KERNEL32.GetFileSize</p>
<p class="MsoNormal">KERNEL32.GetFileType</p>
<p class="MsoNormal">KERNEL32.ReadFile</p>
<p class="MsoNormal">KERNEL32.WriteFile</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span lang="ES">Ejecutamos varias veces y vemos unas cuantas paradas antes de llegar a este BP en la dirección 004010CB, tal como vemos en esta imagen.</span></p>
<p class="MsoNormal"><span lang="ES"><img class="aligncenter size-full wp-image-60" title="img5nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img5nk.jpg" alt="img5nk" width="480" height="72" /></span></p>
<p class="MsoNormal"><span lang="ES">Seguimos el código hacia arriba, para ver donde se inicia esta función. </span><span>Encontramos el inicio en la dirección 004010B0.</span></p>
<p class="MsoNormal"><span> </span></p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">
<p class="MsoNormal"><strong><span>3.- Análisis del algoritmo.</span></strong></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span lang="ES">Como ya hemos localizado la función de chequeo, ahora vamos a centrarnos en analizarla.</span></p>
<p class="MsoNormal"><span lang="ES">La función comprueba que existe el fichero &#8220;<em>crackme.lic&#8221; </em>, mira el tamaño del fichero, crea un buffer para guardar los datos, vuelca el contenido del fichero en el buffer creado, lanza los hilos que comprueban si los datos que hemos volcado son válidos y analiza el resultado de los hilos para decidir que cadena muestra. </span><span>Esto corresponde al siguiente esquema.</span></p>
<p class="MsoNormal"><span><img class="aligncenter size-full wp-image-61" title="img6nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img6nk.jpg" alt="img6nk" width="261" height="776" /></span></p>
<p class="MsoNormal"><span lang="ES">Bueno, lo realmente interesante esta en los hilos de ejecución, así que vamos a ver que es lo que hacen los mismos. Vamos a fijarnos en el argumento Thread Function, vemos que tiene el parámetro 00401000, este es el inicio de la función que ejecuta el hilo.</span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal" style="text-align: center;"><img class="aligncenter size-full wp-image-84" title="img7nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img7nk.jpg" alt="img7nk" width="486" height="262" /></p>
<p class="MsoNormal"><span lang="ES">Los bytes del fichero llave deben ser menores de 0Ah, es decir menores de 10d, si el hilo encuentra un byte igual a FFh, termina el análisis. Si nos fijamos, la función tiene dos salidas, una en la que realiza un &#8220;XOR EAX,EAX&#8221; o lo que es lo mismo, poner EAX a 0; y otra que realiza un &#8220;MOV EAX,1&#8243; o lo que es lo mismo, poner EAX a 1.</span></p>
<p class="MsoNormal"><span lang="ES">¿Cómo conseguimos poner EAX a 1?, si solucionamos esta pregunta, tenemos solucionado el problema; para conseguir la ejecución de ese salto, debemos lograr que el resultado de AL tras la ejecución del código sea igual a 09h. </span><span>Veamos más claramente la ejecución.</span></p>
<p class="MsoNormal"><span><img class="aligncenter size-full wp-image-63" title="img8nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img8nk.jpg" alt="img8nk" width="253" height="498" /></span></p>
<p class="MsoNormal"><span lang="ES">El proceso le el primer byte del fichero, carga otro byte que utiliza para los cálculos, vamos a llamarlo byte auxiliar o aux; este byte, al principio va a estar a 0. Tras esto realiza una operación con este byte, aux = aux + 4*aux, esto lo guarda en edx. Carga en bl el dato leído del fichero y este dato junto con aux, lo utiliza para acceder a una tabla de bytes; el calculo es el siguiente desplazamiento = dato + aux * 2.</span></p>
<p class="MsoNormal"><span lang="ES">En nuestro caso necesitamos un desplazamiento de 48h, si no conseguimos cargar el 09h, el byte apuntado se convierte en el nuevo aux. </span><span>Y esto se repite hasta encontrar FFh.</span></p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">
<p class="MsoNormal"><strong><span lang="ES">4.- Generación de un fichero válido.</span></strong></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span lang="ES"> </span></p>
<p class="MsoNormal"><span lang="ES">Bueno, conociendo el algoritmo, es fácil generar un fichero válido, solo necesitamos conocer la tabla de bytes que hemos comentado anteriormente. Es la siguiente (las cabeceras de la tabla están representadas en decimal.).</span></p>
<p class="MsoNormal"><span>1 .- Bytes hexadecimales.</span></p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="376">
<tbody>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><span> </span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>0</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>1</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>2</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>3</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>4</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>5</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>6</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>7</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>8</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>9</span></strong></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>0</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>10</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>20</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>30</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>40</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>50</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>60</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>70</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>09</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>80</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal"><span>  07</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span lang="ES">Necesitamos conseguir un desplazamiento de 72d bytes. Para ello vamos a realizar las siguientes operaciones.</span></p>
<p class="MsoNormal"><span lang="ES">Aux = 0 (la primera pasada del algoritmo).</span></p>
<p class="MsoNormal"><span lang="ES">Data = 06 (Primer byte del fichero).</span></p>
<p class="MsoNormal"><span lang="ES">0 + 0*4 = 0.</span></p>
<p class="MsoNormal"><span lang="ES">6 + 0*2 = 6.</span></p>
<p class="MsoNormal"><span lang="ES">Cargamos el byte que hay con desplazamiento 6; el 04.</span></p>
<p class="MsoNormal"><span lang="ES">No es 09, por tanto lo usamos como nuevo aux.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<p class="MsoNormal"><span lang="ES">Aux = 04.</span></p>
<p class="MsoNormal"><span lang="ES">Data = 07 (Segundo byte del fichero).</span></p>
<p class="MsoNormal"><span lang="ES">4 + 4*4 = 20.</span></p>
<p class="MsoNormal"><span lang="ES">7 + 20*2 = 47.</span></p>
<p class="MsoNormal"><span lang="ES">Cargamos el byte que hay con desplazamiento 46; el 08.</span></p>
<p class="MsoNormal"><span lang="ES">No es 09, por lo tanto lo usamos como nuevo aux.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<p class="MsoNormal"><span lang="ES">Aux = 08.</span></p>
<p class="MsoNormal"><span lang="ES">Data = 01 (Tercer byte del fichero).</span></p>
<p class="MsoNormal"><span lang="ES">8 + 8*4 = 40.</span></p>
<p class="MsoNormal"><span lang="ES">1 + 40*2 = 81</span></p>
<p class="MsoNormal"><span lang="ES">Cargamos el byte que hay con desplazamiento 81; el 07;</span></p>
<p class="MsoNormal"><span lang="ES">No es 09, por lo tanto lo usamos como nuevo aux.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<p class="MsoNormal"><span lang="ES">Aux = 07.</span></p>
<p class="MsoNormal"><span lang="ES">Data = 02 (Cuarto byte del fichero).</span></p>
<p class="MsoNormal"><span lang="ES">7 + 7*4 = 35.</span></p>
<p class="MsoNormal"><span lang="ES">02 + 35*2 = 72.</span></p>
<p class="MsoNormal"><span lang="ES">Cargamos el byte que hay con desplazamiento 72; el 09.</span></p>
<p class="MsoNormal"><span lang="ES">Es 09, por lo tanto terminamos en el return que nos interesa.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<p class="MsoNormal"><span lang="ES">Si nos fijamos, el segundo hilo, utiliza exactamente la segunda función, además, la tabla de bytes no es modificada, por tanto, sólo tenemos que duplicar la cadena de bytes obtenida anteriormente y replicarla. Al final, añadimos el byte de fin que utiliza el programa, el FFh.</span></p>
<p class="MsoNormal"><span lang="ES">La cadena de bytes que necesitamos escribir para generar un fichero válido es la siguiente: <em>&#8220;0607010206070102FF&#8221;</em>. Esto lo podemos hacer con nuestro editor hexadecimal preferido. Una vez realizado esto, tenemos solucionado este reto.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">
<p class="MsoNormal"><strong><span>5.- Fallos de diseño.</span></strong></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span lang="ES">A continuación, comento lo que <span style="text-decoration: underline;">a mi juicio</span> son fallos de diseño en el algoritmo.</span></p>
<ul type="disc">
<li class="MsoNormal"><span lang="ES"> Existe      un fragmento de código, que no es necesario para la resolución del reto,</span></li>
</ul>
<p class="MsoNormal"><span>00401070   .  68 CE070000   push 7CE</span></p>
<p class="MsoNormal"><span>00401075   .  FFD6                call esi                                 ;  kernel32.Sleep</span></p>
<p class="MsoNormal"><span>00401077   .  EB 04               jmp short crackme.0040107D</span></p>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span>0040107D   &gt; \E8 67010000  call crackme.004011E9</span></p>
<p class="MsoNormal"><span lang="EN-GB">00401082   .  99                     cdq</span></p>
<p class="MsoNormal"><span lang="EN-GB">00401083   .  B9 32000000   mov ecx,32</span></p>
<p class="MsoNormal"><span lang="EN-GB">00401088   .  F7F9                idiv ecx</span></p>
<p class="MsoNormal"><span>0040108A   .  52                    push edx</span></p>
<p class="MsoNormal"><span lang="EN-GB">0040108B   .  FFD6               call esi                                 ;  kernel32.Sleep</span></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><span lang="ES">Si se ha utilizado a modo de código basura, debería de repartirse más por la función o diseñarse de alguna otra manera ya que es muy obvio comprobar que no es necesario analizarlo para la resolución del reto.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<ul type="disc">
<li class="MsoNormal"><span lang="ES"> Los      dos hilos que se lanzan para comprobar el fichero llave, utilizan la misma      función y esta hace exactamente lo miso. Podríamos haber solucionado esto      utilizando por ejemplo dos puntos de entrada para la función o una      modificación de la misma. Otra opción hubiese sido utilizar otra función      que comprobase otras propiedades del los bytes del fichero.</span></li>
</ul>
<p class="MsoNormal"><span lang="ES"> </span></p>
<ul type="disc">
<li class="MsoNormal"><span lang="ES"> Al      utilizar el segundo hilo para chequear los bytes del fichero, si no hemos      modificado la función ni hemos utilizado otra función distinta, al menos      deberíamos haber cambiado la tabla de bytes para forzar un nuevo cálculo      de la segunda parte de los bytes del fichero.</span></li>
</ul>
<p class="MsoNormal"><span lang="ES"> </span></p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">
<p class="MsoNormal"><strong><span>6.- Despedida y cierre.</span></strong></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span lang="ES">Un Saludo a los miembros de Disidents.org, al canal #crackers, a thEpOpE, a NoMuRyTo y a toda la gente que me dejo pero sabe que puede darse por saludada. Espero que no seais muy duros en las críticas de mi primera publicación.</span></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/01/20/solucioncrackinghispasec/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
