<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Article RSS Feed</title>
    <link>http://your-web-site.com/rss/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>The main blog feed for my Web site.</description>
    
    
        <item>
          <title>Scanner de puertos TCP</title>
          <description>&lt;img src=&quot;http://dl.dropbox.com/u/2943110/blog/portscanner.png&quot; alt=&quot;&quot; /&gt;
	&lt;p&gt;Con la billetera vacia me aventure a buscar oportunidades en VWorker. Habia un monton de proyectos pero la mayoria es &amp;#8220;Agregar X a wordpress&amp;#8221; y los mas interesantes te piden tener experiencia, o sea,  haber realizado una cantidad de trabajos en la plataforma.&lt;/p&gt;


	&lt;h2&gt;Port scanner&lt;/h2&gt;


	&lt;p&gt;Este proyecto no solicitaba experiencia y me pareció entretenido. Comence a codearlo en C++ e identifiqué 2 clases:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;span style=&quot;color:blue;&quot;&gt;portknock&lt;/span&gt;: Representa un intento de conexión a un par (&lt;strong&gt;address&lt;/strong&gt;, &lt;strong&gt;port&lt;/strong&gt;), que comenzo en el instante &lt;strong&gt;start_time&lt;/strong&gt;.&lt;/li&gt;
		&lt;li&gt;&lt;span style=&quot;color:blue;&quot;&gt;portscanner&lt;/span&gt;: Monitorea una colección de portknocks y retorna tuplas (&lt;strong&gt;address&lt;/strong&gt;, &lt;strong&gt;port&lt;/strong&gt;, &lt;strong&gt;event type&lt;/strong&gt;) cuando se produce un evento.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Eventos de Port scanner&lt;/h2&gt;


	&lt;p&gt;Hay dos tipos:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;span style=&quot;color:green;&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CONNECTED&lt;/span&gt; (OPEN)&lt;/span&gt;: Portscanner logro establecer una conexión.&lt;/li&gt;
		&lt;li&gt;&lt;span style=&quot;color:red;&quot;&gt;&lt;span class=&quot;caps&quot;&gt;TIMEOUT&lt;/span&gt;&lt;/span&gt;: &lt;strong&gt;current_time&lt;/strong&gt; &amp;#8211; &lt;strong&gt;start_time&lt;/strong&gt; &amp;gt;= &lt;strong&gt;timeout&lt;/strong&gt;, se espero suficiente tiempo y no hubo respuesta.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Un intento de conexión rechazado es tratado como &lt;span class=&quot;caps&quot;&gt;TIMEOUT&lt;/span&gt;, esto podria mejorarse creando un evento &lt;span class=&quot;caps&quot;&gt;REFUSED&lt;/span&gt;. Finalmente Portscanner retornará una lista de eventos y finalizará cuando no haya mas portknocks en el.&lt;/p&gt;


	&lt;h2&gt;Show me the code&lt;/h2&gt;


&lt;pre class=&quot;brush: cpp&quot;&gt;
  portscanner sc(5);
  std::list&amp;lt;struct portscanner_event&amp;gt; events;
  std::list&amp;lt;struct portscanner_event&amp;gt;::iterator it;

  ...

  while(sc.wait_events(&amp;#38;events) != 0) {
      for(it = events.begin(); it != events.end(); it++) {
          switch((*it).type) {
              case OPEN:
                  output &amp;lt;&amp;lt; (*it).addr &amp;lt;&amp;lt; &quot;:&quot; &amp;lt;&amp;lt; (*it).port &amp;lt;&amp;lt; std::endl;
                  break;
              case TIMEOUT:
                  break;
          }
      }
  }

&lt;/pre&gt;
Este extracto lo que hace es imprimir solo los pares &lt;strong&gt;address&lt;/strong&gt;:&lt;strong&gt;port&lt;/strong&gt; que estan abiertos.

	&lt;h2&gt;Mutacliente&lt;/h2&gt;


	&lt;p&gt;Antes de hacer mi oferta al empleador le pregunte si prefería alguna plataforma en particular y respondió que daba igual mientras funcione. Le mostre un video de este programa funcionando y su necesidades cambiaron abruptamente, ahora lo queria para Windows con una User Interface grafica. Hasta ahi llego el proyecto. Para que no se pierda prefiero liberarlo en mi blog.&lt;/p&gt;


	&lt;h2&gt;Mejorable (o defectos)&lt;/h2&gt;


	&lt;p&gt;Port scanner realiza todos los intentos de conexión de una vez y si son muchos podria conllevar a un colapso, debido a algún limite en el sistema. Por ejemplo: el numero de sockets.&lt;/p&gt;


	&lt;h2&gt;Código completo&lt;/h2&gt;


	&lt;p&gt;&lt;a href=&quot;/portscanner.tar.gz&quot;&gt;Port scanner&lt;/a&gt;&lt;/p&gt;</description>
          <pubDate>Sun, 25 Dec 2011 00:00:00 GMT</pubDate>
          <guid>http://your-web-site.com/news/2011/12/25/scanner-de-puertos-tcp/</guid>
          <link>http://your-web-site.com/news/2011/12/25/scanner-de-puertos-tcp/</link>
        </item>
    
        <item>
          <title>Audios de instantsfun.es en mp3</title>
          <description>&lt;h2&gt;Audios de instantsfun.es en mp3&lt;/h2&gt;


	&lt;p&gt;&lt;img src=&quot;http://dl.dropbox.com/u/2943110/blog/boton.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


	&lt;p&gt;¿Te gustaría tener los sonidos de instantsfun.es en tu lista de reproducción?&lt;/p&gt;


	&lt;p&gt;Este script para bash extraerá todos los mp3 de &lt;a href=&quot;http://instantsfun.es&quot;&gt;instantsfun.es&lt;/a&gt; automáticamente y los guardará en un directorio llamado &lt;strong&gt;collection&lt;/strong&gt;. Solo necesitas tener instalado:
 * wget
 * swftools&lt;/p&gt;


	&lt;h2&gt;Implementación&lt;/h2&gt;


&lt;div style=&quot;font-size:1em;&quot;&gt;#!/usr/bin/env bash
# (c) 2010 &amp;#8211; Felipe Astroza &amp;#8211; felipe(at)astroza.cl&lt;br&gt;
# Under GPLv2, see &lt;span class=&quot;caps&quot;&gt;LICENSE&lt;/span&gt;&lt;br&gt;
&lt;span class=&quot;caps&quot;&gt;SOURCE&lt;/span&gt;_HOST=http://instantsfun.es/swf&lt;br&gt;
function prepare() {&lt;br&gt;
&amp;nbsp;    &lt;span class=&quot;caps&quot;&gt;WGET&lt;/span&gt;=$(which wget);&lt;br&gt;
&amp;nbsp;    if [ $? != 0 ]; then echo &amp;#8220;Please install \&amp;#8221;wget\&amp;#8221;&amp;#8221;; exit 1; fi&lt;br&gt;
&amp;nbsp;    &lt;span class=&quot;caps&quot;&gt;SWFEXTRACT&lt;/span&gt;=$(which swfextract);&lt;br&gt;
&amp;nbsp;    if [ $? != 0 ]; then echo &amp;#8220;Please install \&amp;#8221;swftools\&amp;#8221;&amp;#8221;; exit 1; fi&lt;br&gt;
&amp;nbsp;    mkdir -p tmp collection&lt;br&gt;
}&lt;br&gt;
function cleanup() { rm -fr tmp; }&lt;br&gt;
function get_swf_list() { echo $(cat $1 | grep swf | awk &amp;#8216;BEGIN {FS=&amp;#8221;\&amp;#8221;&amp;#8220;}; {print $6}&amp;#8217;);}&lt;br&gt;
function get_index() { wget -q $1 -O tmp/index; echo &amp;#8220;tmp/index&amp;#8221;; }&lt;br&gt;
prepare &lt;br&gt;
echo &amp;#8220;InstantsFunGet &amp;#8211; (C) 2010 Felipe Astroza&amp;#8221;&lt;br&gt;
echo -n -e &amp;#8220;Reading index\r&amp;#8221;&lt;br&gt;
&lt;span class=&quot;caps&quot;&gt;SWFLIST&lt;/span&gt;=$(get_swf_list $(get_index $SOURCE_HOST))&lt;br&gt;
&lt;span class=&quot;caps&quot;&gt;TOTAL&lt;/span&gt;=$(echo $SWFLIST|wc -w); cur=1&lt;br&gt;
for swf in $SWFLIST; do&lt;br&gt;
&amp;nbsp;    name=$(echo $swf | awk &amp;#8216;BEGIN {FS=&amp;#8221;.&amp;#8221;}; {print $1}&amp;#8217;)&lt;br&gt;
&amp;nbsp;    echo -e -n &amp;#8221;\r[$cur of $TOTAL]\e[0K $name&amp;#8221;&lt;br&gt;
&amp;nbsp;    $WGET -q $SOURCE_HOST/$swf -O tmp/$swf&lt;br&gt;
&amp;nbsp;    sound_id=$($SWFEXTRACT tmp/$swf|grep Sound:|awk &amp;#8216;{print $5}&amp;#8217;)&lt;br&gt;
&amp;nbsp;    $SWFEXTRACT -s $sound_id tmp/$swf -o collection/$name.mp3&lt;br&gt;
&amp;nbsp;    cur=$(($cur+1))&lt;br&gt;
done&lt;br&gt;
cleanup&lt;br&gt;
&lt;/div&gt;

	&lt;p&gt;&lt;a href=&quot;http://felipe.astroza.cl/instantsget.tar.gz&quot;&gt;Descargar script&lt;/a&gt;&lt;/p&gt;


	&lt;h2&gt;Trabajos derivados&lt;/h2&gt;


	&lt;p&gt;Me alegra saber que ya hay dos trabajos derivados:&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://blog.gon.cl/post/862&quot;&gt;Instants Chile Get&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.glatelier.org/2010/12/labs-instants-chile-get-improved-descarga-todos-esos-momentos&quot;&gt;Instants Chile Get Improved&lt;/a&gt;&lt;/p&gt;</description>
          <pubDate>Sat, 08 May 2010 00:00:00 GMT</pubDate>
          <guid>http://your-web-site.com/news/2010/05/08/audios-de-instantsfun-es-en-mp3/</guid>
          <link>http://your-web-site.com/news/2010/05/08/audios-de-instantsfun-es-en-mp3/</link>
        </item>
    
        <item>
          <title>Facebook en la consola</title>
          <description>&lt;h2&gt;Facebook en la consola&lt;/h2&gt;


	&lt;p&gt;Con el fin de aprovechar las notificaciones &lt;span class=&quot;caps&quot;&gt;SMS&lt;/span&gt; de facebook, escribí un programa para cambiar el estado de un usuario (a.k.a. ¿En qué estas pensando?). Puede ser llamado por otros programas o por ti mismo y es bastante simple de utilizar:&lt;/p&gt;


	&lt;p&gt;bc. fbsset.py &lt;status&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://dl.dropbox.com/u/2943110/blog/status1.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;http://dl.dropbox.com/u/2943110/blog/status2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


	&lt;h2&gt;settings.py&lt;/h2&gt;


	&lt;p&gt;Su uso requiere completar algunas variables:&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;api_key y secret_key&lt;/strong&gt;: Valores que da Facebook al crear tu aplicación&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;user&lt;/strong&gt;: Usuario Facebook (email)&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;password&lt;/strong&gt;: Contraseña del usuario&lt;/p&gt;


	&lt;h2&gt;Características&lt;/h2&gt;


	&lt;p&gt;&lt;img src=&quot;http://dl.dropbox.com/u/2943110/blog/status5.png&quot; alt=&quot;&quot; /&gt;
Primera vez&lt;/p&gt;


	&lt;p&gt;Las versiones previas demoraban al menos 13 segundos en cambiar de estatus, esta versión demora menos tiempo luego de ser ejecutado por primera vez. Recordar el último token y session_key creado es la manera de no tener que iniciar una sesión cada vez que es utilizado.&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://dl.dropbox.com/u/2943110/blog/status4.png&quot; alt=&quot;&quot; /&gt;
Segunda vez&lt;/p&gt;


	&lt;h2&gt;Resultado&lt;/h2&gt;


	&lt;p&gt;Un mensaje gratis a tu celular (notificación de algún evento, por ejemplo)
&lt;img src=&quot;http://dl.dropbox.com/u/2943110/blog/status3.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


	&lt;h2&gt;Código de fuente&lt;/h2&gt;


	&lt;p&gt;&lt;a href=&quot;http://felipe.astroza.cl/fbstatus.tar.gz&quot;&gt;fbstatus.tar.gz&lt;/a&gt;&lt;/p&gt;</description>
          <pubDate>Mon, 15 Mar 2010 17:55:39 GMT</pubDate>
          <guid>http://your-web-site.com/news/2010/03/15/facebook-en-la-consola/</guid>
          <link>http://your-web-site.com/news/2010/03/15/facebook-en-la-consola/</link>
        </item>
    
        <item>
          <title>Crea tu propio "Virtual Kernel" en Linux</title>
          <description>&lt;p&gt;Un kernel tradicional gestiona los recursos de una máquina y presta servicios a través de la interfaz de llamadas a sistema (syscalls), ¿Qué dirias si te mostrara como hacer lo segundo?. Comenzaré por algunas descripciones importantes:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;span style=&quot;color:blue;&quot;&gt;Linux ptrace&lt;/span&gt;: Es un mecanismo que permite controlar la ejecución, cambiar registros y modificar la memoria de un proceso hijo.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;span style=&quot;color:blue;&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PTRACE&lt;/span&gt;_SYSEMU&lt;/span&gt;: Es una petición soportada por ptrace en algunas arquitecturas (en el port de Linux x86 funciona perfecto, en el port x86_64 no) que permite que un proceso vigilado por su padre no sea atendido por el kernel al realizar una llamada a sistema, sino por su proceso padre, lo que facilita la emulación de un sistema.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt;&lt;/h2&gt;


	&lt;p&gt;&lt;acronym title=&quot;User Mode Linux&quot;&gt;UML&lt;/acronym&gt; utiliza, si es posible, &lt;span class=&quot;caps&quot;&gt;PTRACE&lt;/span&gt;_SYSEMU para atender los procesos que corren bajo su dominio. Una &amp;#8220;virtual machine&amp;#8221; con &lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt; consiste de una versión de Linux que corre como un proceso ordinario sobre un sistema Linux. Este proceso ordinario vigila y manipula a los procesos que se corran bajo el, como un kernel. Cómo administra recursos que solo puede asignar el sistema Linux anfitrión podría ser tema para un articulo futuro, nosotros solo nos enfocaremos en la emulación de llamadas a sistema. Nuestro pequeño kernel tendra solo dos llamadas:&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;print: Imprime una cadena de máximo 128 bytes y&lt;/li&gt;
		&lt;li&gt;exit: Finaliza al proceso que hizo la llamada.&lt;/li&gt;
	&lt;/ol&gt;


	&lt;h2&gt;Código de vkern&lt;/h2&gt;


&lt;pre class=&quot;brush: cpp&quot;&gt;
int main(int c, char **v)
{                        
       pid_t pid;       
       int status, syscall_nro;
       long addr;              
       char data[5];           
       data[4] = 0;            

       if(c &amp;lt; 2) {
               fprintf(stderr, &quot;Use: %s &amp;lt;programa&amp;gt;\n&quot;, v[0]);
               return 1;                                    
       }                                                    

       if(fork() == 0) { /* Proceso hijo */ 
               /* Cada vez que este proceso recibe una señal, se detiene y se notifica al proceso padre.
                * Una syscall produce una SIGTRAP en este proceso gracias a TRACEME.                   
                */                                                                                      
               ptrace(PTRACE_TRACEME, 0, NULL, NULL);                                                   

               /* Reemplazo la imagen de proceso por el archivo en v[1] */
               if(execv(v[1], v + 1) == -1) {                             
                       fprintf(stderr, &quot;Invalid program image\n&quot;);        
                       return 1;                                          
               }

       } else { /* Proceso padre */

               do {
                       pid = wait(&amp;#38;status);
                       if(pid == -1 || WIFEXITED(status)) {
                               puts(&quot;+ Instancia de VKern terminada.&quot;);
                               return 0;
                       }

                       if(WSTOPSIG(status) == SIGTRAP) {
                               /* La convención dice que el numero de la llamada va en el registro EAX, ORIG_EAX es 
                                * la posición de ese EAX en la estructura user (la copia de los registros del proceso al detenerse).
                                */
                               syscall_nro = ptrace(PTRACE_PEEKUSER, pid, ORIG_EAX * sizeof(long), NULL);
                               printf(&quot;+ Numero de syscall: %d:\n&quot;, syscall_nro);

                               switch(syscall_nro) {
                                       case 0:
                                               ptrace(PTRACE_KILL, pid, NULL, NULL);@
                                               printf(&quot;\t%d: Terminando proceso..\n&quot;, pid);
                                                break;
                                        case 1:
                                                addr = ptrace(PTRACE_PEEKUSER, pid, EBX * sizeof(long), NULL);
                                                sys_print(pid, addr);
                                                break;

                                        default:
                                                puts(&quot;\tSyscall no soportada&quot;);
                                                break;
                                }
                                /* La siguiente syscall será emulada */
/* (1) */                               ptrace(PTRACE_SYSEMU, pid, NULL, NULL);
                        }
                } while(1);
        }

        return 0;
}
&lt;/pre&gt;

	&lt;p&gt;La primera llamada que realiza el proceso hijo luego de comenzar a ser vigilado es &lt;strong&gt;execv&lt;/strong&gt; y es luega de esta que el proceso padre solicita que las llamadas del hijo sean emuladas (1).&lt;/p&gt;


	&lt;h2&gt;Programa de ejemplo&lt;/h2&gt;


&lt;pre class=&quot;brush: cpp&quot;&gt;
#define SYSCALL __asm__ (&quot;int $0x80&quot;)

/* Wrappers a llamadas de sistema */

void print(char *message)
{
        __asm__ volatile(&quot;movl %0, %%ebx\n&quot; 
                        &quot;movl $1, %%eax&quot; : &quot;=m&quot; (message));
        SYSCALL;
}

void __exit()
{
        __asm__ volatile(&quot;movl $0, %eax&quot;);
        SYSCALL;
}

/* _start es el simbolo de la primera función ejecutada, el &quot;C runtime support&quot; declara 
 * y define esta función para luego llamar al estandar main.
 */ 
void _start()
{
        print(&quot;Hola VKern!\n&quot;);
        __exit();
}
&lt;/pre&gt;
p. El ejemplo escribe &amp;#8220;Hola Vkern!&amp;#8221; usando la llamada print y finaliza con exit.

	&lt;h2&gt;Probando Vkern&lt;/h2&gt;


	&lt;p&gt;Luego de compilar ambas partes, probemos Vkern con el ejemplo.&lt;/p&gt;


&lt;pre&gt;felipe@leibniz:~/Vkern$ make
gcc -m32 vkern.c -o vkern
gcc -m32 -c ejemplo.c -o ejemplo.o
ld -melf_i386 ejemplo.o -o ejemplo

felipe@leibniz:~/Vkern$ ./vkern ./ejemplo
+ Numero de syscall: 11:
        Syscall no soportada
+ Numero de syscall: 1:
        14374: print syscall: Hola VKern!
+ Numero de syscall: 0:
        14374: Terminando proceso..
+ Instancia de VKern terminada.
&lt;/pre&gt;

	&lt;p&gt;La primera syscall (11) corresponde a execv del proceso hijo, esa llamada es tratada por el kernel anfitrion. Las posteriores son tratadas por Vkern.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;/vkern.tar.gz&quot;&gt;Codigo de fuente&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Espero que les haya parecido entretenido, los invito a extenderlo y postear aquí. Para mayor información vean:
	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://linux.die.net/man/2/ptrace&quot;&gt;man ptrace&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;Código de fuente de &lt;span class=&quot;caps&quot;&gt;UML&lt;/span&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/p&gt;</description>
          <pubDate>Sun, 24 Jan 2010 00:00:00 GMT</pubDate>
          <guid>http://your-web-site.com/news/2010/01/24/crea-tu-propio-virtual-kernel-en-linux/</guid>
          <link>http://your-web-site.com/news/2010/01/24/crea-tu-propio-virtual-kernel-en-linux/</link>
        </item>
    
    
  </channel>
</rss>


