Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Erik# en 7 Enero 2009, 13:33 pm



Título: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:33 pm
Curso de PERL by Erik

1.Introducci?n
Perl es un lenguaje de programaci?n por lotes, viene de C, se ejecuta con las consolas, y se pueden hacer exploits, programas de todo tipo, virus...
Un lenguaje de scripting tipo Batch, Shell unix, Python...
En este cursillo os ense?are todo lo que teneis que saber para ser unos buenos programadores de perl, desde crear un archivo perl, hasta crear un exploit.
Lo primero que vamos a hacer sera descargarnos ActivePerl para windows desde  aqui (http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.820-MSWin32-x86-274739.msi).
Es un enlace directo...
O en linux, nos vamos a nuestro gestor de paquetes y lo buscamos.
Principalmente el curso esta dise?ado para Windows.
Muy bien, procedemos la instalaci?n, y una vez acabada, saltamos al siguiente capitulo.

Atenci?n:

Derechos reservados por la licencia Creative Commons, prohibida la venta de este manual.
(http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png) (http://creativecommons.org/licenses/by-nc-sa/3.0/)


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:33 pm
2.Como iniciar las aplicaciones

Muy bien, en PERL, para poder iniciar las aplicaciones tenemos que abrir la consola, y, alli para poder iniciar una aplicacion en perl tenemos que escribir:
Código:
perl nombredelaaplicacion.pl
Y se te activara la aplicación.

3.Las rutas en CMD

Esto, tambien nos servira para las aplicaciones en perl, si un dia, nosotros queremos cambiar de ruta en la que se esta ejecutando, solo tenemos que poner:
Código:
cd \La ruta que queremos

Podemos elegir:
Código:
cd 
Código:
cd Archivos de programa
Código:
cd Documents and Settings
Código:
cd Escritorio
Código:
cd Favoritos
Código:
cd Mis documentos
Código:
cd Desktop
Código:
cd Home/User
...
Y muchísimos más, pero estos son los más normales.

Ahora, tambien podriamos usar md, la funcion de rutas que crea esa ruta que tu deseas, por ejemplo queremos crear la ruta erik, hariamos esto:
Código:
md erik
Y crearia esa "ruta" en la ruta que estubiesemos.
Ahora queremos crearla en un lugar especifico...
Pues cambiamos de dirección con cd a donde queramos colocarla, y luego usamos md.
Muy sencillo.


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:33 pm
4.Nuestra primera aplicacion (Hello World)

Primero, siempre que hagamos código perl, pondremos al principio del todo:
Código
  1. #!/usr/bin/perl
Para informar de que es un código PERL.
Ahora, usaremos la funcion print, que es la que imprime una cadena, o un texto plano en MS-DOS:
Código
  1. #!/usr/bin/perl
  2. print "Hello World";

y ejecutamos:
Código:
perl Hello.pl
Y, ét voila, aqui tienes tu primera aplicación en perl.


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:34 pm
5.Las variables simples

Ahora, aprenderemos algo sobre las variables simples, las variables, como much?simos lenguajes, se almacenan con el $, como vemos aqui:
Código
  1. #!/usr/bin/perl
  2. $nombre = "Erik";

Otra cosa son las comillas, existen de dos maneras, las comillas simples y las comillas dobles, al declarar una variable, da igual si usamos '', que si usamos "".
Pero al declarar la variable, si que es importante...
No es lo mismo que pongamos:
Código
  1. #!/usr/bin/perl
  2. $nombre = "Erik";
  3. print "$nombre";

Que si pusieramos:
Código
  1. #!/usr/bin/perl
  2. $nombre = "Erik";
  3. print '$nombre';

El primero, imprimiria Erik, y el segundo imprimiria $nombre.
Comillas dobles son buenas, comillas simples no.

A las variables tambien les podriamos agregar otras variables o funciones.
Como por ejemplo ahora:
Código
  1. #!/usr/bin/perl
  2. $quehoraes = "Son las".  localtime();
  3. print "$quehoraes";

O este:
Código
  1. #!/usr/bin/perl
  2. $quehora = "Son las";
  3. $es = localtime();
  4. $quehoraes = $quehora."  ".$es;
  5. echo "$quehoraes";

Tambien cuando queremos mostrar una variable en print, podemos hacerlo sin poner comillas de ningun tipo:
Código
  1. #!/usr/bin/perl
  2. $nombre = "Erik";
  3. print $nombre;


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:34 pm
6.PRINTF
La funci?n PRINTF la necesitaremos para poder hacer flujos de salida con formato tipo C.
Aqui veis las tablas de numeraci?n:

%f = Notacion decimal, coma flotante "float"
%d = Entero con signo, n? decimal
%ld = n? decimal largo
%u  = n? decimal sin signo
%x  = hexadecimal
%lx = n? hexadecimal largo
%X  = hexadecimal con mayusculas
%o  = n? octal
%lo = n? octal largo
%s  = Cadena o string
%c  = un caracter del codigo ASCII
%p  = Puntero
%e  = Notacion cientifica
%%  = signo de porcentaje

Aqui un ejemplo del uso del primero de esta tabla:
Código
  1. #!/usr/bin/perl
  2. printf "%f",91.3691;


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:34 pm
7.Arrays

Los arrays es una forma de recorrer una variable con diferentes numeros, palabras, etc...
Y seleccionar el que queramos, uno al azar, o todos a la vez.
Cuando definimos un array lo hacemos con la @ delante de todo.

Código
  1. #!/usr/bin/perl
  2. @array = ('Erik', 'Madness', 'Speed', 8, 191);
  3. print @array[0];

Esto mostraria: Erik

Para mostrar todos, ponemos:
Código
  1. #!/usr/bin/perl
  2. @array = ('Erik', 'Madness', 'Speed', 8, 191);
  3. print @array;

O podriamos hacer selecciones por columnas, por ejemplo:
Código
  1. #!/usr/bin/perl
  2. $array[0]="Erik";
  3. $array[1]="Madness";
  4. $array[2]="Speed";
  5. $array[3]=8;
  6. $array[4]=191;
  7. print @array[2];

Esto mostraria: Speed

Tambien podemos hacer busquedas en un array por caracteres que contenga, por ejemplo:
Código
  1. #!/usr/bin/perl
  2. @array = ('Erik', 'Madness', 'Speed', 'Mentor');
  3. @busqueda = grep /^M/, @array;
  4. print @busqueda;

Esto mostraria: Madness Mentor

Ahora mostrariamos las palabras del array, seg?n como acabe las palabras:
Código
  1. #!/usr/bin/perl
  2. @array = ('Erik', 'Madness', 'Speed', 'Mentor');
  3. @busqueda = grep /d$/, @array;
  4. print @busqueda;

Esto mostraria: Speed

Ahora mostraremos como borrar el primer elemento del array:
Código
  1. #!/usr/bin/perl
  2. @array = ('Erik', 'Madness', 'Speed', 'Mentor');
  3. shift(@array);
  4. print @array;

Esto mostraria: Madness Speed Mentor

Ahora a?adiremos un elemento al array :
Código
  1. #!/usr/bin/perl
  2. @array = ('Erik', 'Madness', 'Speed', 'Mentor');
  3. unshift (@array, "Perl");
  4. print @array;

Esto mostraria: Perl Erik Madness Speed Mentor


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:35 pm
8.Flujo de entrada

Si queremos que  un programa sea interactivo por parte del usuario, y  que
este programa pueda recoger cierta informacion, usaremos  "STanDart
INput".

Por ejemplo, queremos preguntarle, su nombre y su edad, hariamos algo as?:
Código
  1. #!/usr/bin/perl
  2. print "?Como te llamas?:";
  3. $nombre = <STDIN>;
  4. print "?Cuantos a?os tienes?:";
  5. $edad = <STDIN>;
  6. print "Te llamas $nombre y tienes $edad a?os.";


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:35 pm
9.Archivos

En esta lecci?n que habran varias sublecciones, veremos como hacer la manipulaci?n de archivos.

9.1.Renombrar archivos

Esta funcion es muy facil, seria algo as?:
Código
  1. #!/usr/bin/perl
  2. rename ("archivo.txt", "supermegaarchivo.txt");

9.2.Abrir archivos

Sysopen se parece bastante a la funcion open salvo que es posible  cambiar
una serie de parametros como los permisos del archivo etc, su sintaxis es:

Código
  1. sysopen (REFERENCIA, "archivo que abrimos", MODO DE APERTURA, PERMISOS)

Modos de apertura:
O_RDONLY : Solo lectura
O_WRONLY : Solo escritura
O_CREAT  : Crea el archivo si no existe
O_TRUNC  : Trunca el archivo antes de leerlo o escribirlo
O_RDWR   : Escritura y lectura


Para usar varios modos a la vez usaremos pipes "|"

Crear un archivo si no existe y escribe en el, por ejemplo:

Código
  1. #!/usr/bin/perl
  2. sysopen (ARCHIVO, "archivo.txt", O_WRONLY | O_CREAT);

Para cambiar permisos, por defecto les da 666, por ejemplo:

Código
  1. #!/usr/bin/perl
  2. sysopen (ARCHIVO, "archivo.txt", O_WRONLY | O_CREAT,0666);

M?s sobre archivos en la siguiente leccion.


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:35 pm
9.3.Cerrar archivos

Para cerrar los archivos es una sintaxis, muy, muy sencilla:
Código
  1. #!/usr/bin/perl
  2. close ("archivo.txt");

9.4.Abrir procesos

Se abren de una forma parecida a los archivos:
Código
  1. #!/usr/bin/perl
  2. open(rundll32.exe, "|c:\\Windows\\");

Un ejemplo simple:
Código
  1. #!/usr/bin/perl
  2. open(LISTAR, "|dir");
  3. $listar = ();
  4. print $listar;
  5. close $listar;
  6.  

9.5.Cerrar procesos

Se cierra igual que los archivos:
Código
  1. #!/usr/bin/perl
  2. close (Proceso);


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:36 pm
10.Directorios

Ahora veremos un par de funciones que nos serviran con los directorios:

10.1.Abrir y cerrar directorios

Usaremos la funcion opendir para abrir y cerrar directorios,  de la misma
forma que lo haciamos con ficheros.
Aqui un ejemplo ofrecido por PAD ;):

Código
  1. #!/usr/bin/perl
  2. opendir (DIRECTORIO, "/");
  3. foreach $nombre (readdir(DIRECTORIO))
  4. {
  5. print "$nombre\n";
  6. }
  7. closedir(DIRECTORIO);

Cuando queramos cambiar el directorio de donde andamos, solo tenemos que hacer esto:
Código
  1. #!/usr/bin/perl
  2.   $zona= "/.";
  3.   $directorio= chdir $zona;

10.2.Gestionar directorios

Para ver en que ruta estamos:
Usaremos el modulo cwd que viene con la biblioteca estanda de perl con activeperl.

Código
  1. #!/usr/bin/perl
  2. use Cwd;
  3. print getcwd();
  4.  

Ahora, si queremos crear un directorio, usariamos mkdir:

Código
  1. #!/usr/bin/perl
  2. mkdir "Nombre del directorio", 775;
  3.  

Donde 775 podriamos los permisos del directorio, por defecto seria 775.

Y para borrar directorios, lo mismo, pero usando rmdir:

Código
  1. #!/usr/bin/perl
  2. rmdir "Nombre del directorio";


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:36 pm
11.Operadores

+    Suma
   Resta
   Multiplicacion
/     Division
%     Modulacion
&     AND,  a nivel de bits
   OR, a nivel de bits
&&    AND, y logico
||    OR logico
   Separador de comas
..    Operadore de rango de lista
**    Exponenciacion (el valor de la izq se eleva a la potencia de la derecha)
=~    Coincidencia de patrones (comprueba si los elementos son verdaderos)
?~    Coincidencia de patrones (comprueba si los elementos son falsos)
<< >> Operadores de esplazamiento
?and: Operador condicional "juntos"
++ Autoincremento
-- Autodecremento

_____________________________________________

gt    Mayor que
lt    Menor que
eq    Igual a
le    Menor o igual que
ge    Mayor o igual que
ne    Distinto a
cmp   Retorno de comparacion

_____________________________________________

>     Mayor que
<     Menor que
==    Igual a  " comparando es distinto a = que es asignacion "
<=    Menor o igual a
>=    Mayor o igual a
!=    Distinto a
<=>   Retorno de comparacion

_____________________________________________

\a   Pitido
\b   Retroceso
\e   Escape
\E   Acaba con \Q, \L y \U
\f   Salto de pagina
\l   El siguiente caracter estara en minuscula
\L   Todos los siguientes caracteres estaran en mayusculas
\n   Linea nueva
\Q   Introduce una barra inversa en trosos los caracteres siguientes no alfanumericos
\r   Retorno de carro
\t   Tabulador
\u   El siguiente caracter estara en mayuscula
\U   Todos los siguientes caracteres estaran en mayuscula
\v   Tabulador vertical
\007 Caracter de timbre en octal
\x07 Caracter de timbre en hexadecimal
\cC  Ctrl+C


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:36 pm
12.Sistema

En este capitulo aprenderemos a trabajar con el sistema operativo.
Primero, vamos a ver como mostrar los datos de la ruta donde andamos.

Código
  1. #!/usr/bin/perl
  2. system("dir");

Esto, en mi ordenador imprime
Código:
 El volumen de la unidad C es PRESARIO
 El n?mero de serie del volumen es: DC5F-B9AA

 Directorio de C:\

16/05/2008  14:39    <DIR>          AppServ
03/08/2008  10:40    <DIR>          Archivos de programa
03/08/2008  12:44             5.384 area.pl
02/08/2008  16:36                 2 AUTOEXEC.BAT
03/08/2008  19:03                34 backdoorbyerik.pl
29/11/2004  21:53                 0 CONFIG.SYS
10/01/2008  22:09    <DIR>          Dev-Cpp
03/08/2008  12:39             1.672 erikcgi.pl
25/06/2008  15:16    <DIR>          Documents and Settings
02/08/2008  17:33                 0 Exploit.pl
03/08/2008  12:39             1.672 explorar.pl
03/08/2008  12:39                 0 fake.pl
21/04/2008  13:57    <DIR>          Fraps
01/07/2008  15:13            20.480 KrewsCode X - Unban ID.exe
09/05/2008  23:56    <DIR>          midi
07/04/2008  14:22    <DIR>          My Music
06/07/2008  20:19    <DIR>          NVIDIA
13/12/2007  21:26    <DIR>          passwordbas
01/08/2008  12:18    <DIR>          pb
30/07/2008  20:20    <DIR>          Perl
12/06/2008  13:48    <DIR>          Program Files
30/07/2008  19:00                41 prueba.pl
30/07/2008  20:41    <DIR>          Python25
28/07/2008  23:53               407 pythong.cfg
28/07/2008  23:49            21.457 pythong.html
24/03/2008  20:38    <DIR>          ruby
25/03/2008  20:31    <DIR>          rubyprogram
17/09/2007  18:14    <DIR>          Setup
10/10/2007  08:45    <DIR>          sp3v
01/05/2008  00:18    <DIR>          TCWIN
01/07/2008  01:05    <DIR>          Temp
25/06/2008  15:20    <DIR>          USERDATA
03/08/2008  17:40    <DIR>          WINDOWS
              12 archivos         51.149 bytes
              21 dirs  74.581.889.024 bytes libres

En el directorio C:\

Ahora, tambien podemos hacer que en vez de salir en la pantalla DOS, salga en un archivo llamado sistema.txt en tu directorio:

Código
  1. #!/usr/bin/perl
  2. system("dir > sistema.txt");

Ahora, miraremos algunas funciones como Pause :)

Código
  1. #!/usr/bin/perl
  2. print "Hola, buenos dias, que tal esta?\n";
  3. system("pause");
  4. print "et voila";
  5. system("pause>nul");


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:37 pm
13.Bucles While y For...

Bien, en este capitulo, aprenderemos while y for, sentencias muy usadas, y for, una sentencia que ya hemos visto en el Mail bomber en este mismo subforo.

La sintaxis de while es:

Código
  1. while (condicion)
  2.   {
  3.      (sentencia que se cumple)
  4.   }

Por ejemplo, un ejemplo simple de entendimiento rapidito:
Código
  1. #!/usr/bin/perl
  2. $erik = 1;
  3. while($erik <=50)
  4. {
  5. print "Este es el mensaje numero $erik\n";
  6. $erik++;
  7. }

Ya sabemos como va While, ahora nos vamos con Don For.

Aqui vemos la sintaxis de for:
Código
  1. for (valor de variable; condicion; expresion de control)
  2. {
  3. (sentencia)
  4. }

Y aqui el ejemplo final de for:

Código
  1. #!/usr/bin/perl
  2. for ($erik=1;$erik<10;$erik++)
  3. {
  4. print "Este es el numero $erik";
  5. }

Ahora, aparte de lo basico de siempre, os voy a ense?ar un par de tecnicas para el bucle for, aver si os sirve:

Como nos saltamos 1 numero:
Código
  1. #!/usr/bin/perl
  2.   for ($erik=1;$erik<10;$erik++)
  3.   {
  4.     if ($erik==5) #Cuando llegue a 5
  5.     {
  6.       next; #pasa al 6
  7.     }
  8.     print "$erik\n";
  9.   }
  10.  

Esto haria que cuando llege al numero cinco, ese numero, no lo imprima y pase directamente del 4 al 6.

Y ahora, algo que sirve para joder mucho a la gente en el sentido hack.
Un bucle infinito =).

Código
  1. #!/usr/bin/perl
  2. for(;;)
  3. {
  4. print "You are Fucked!\n";
  5. }
  6.  


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:37 pm
13.1.Continuaci?n de bucles (IF & Foreach)

IF, es uno de los bucles m?s usados en todos los programas, sirve para que si una condici?n es correcta o incorrecta haga una sentencia.
Sintaxis:
Código
  1. #!/usr/bin/perl
  2. if(condicion)
  3. {
  4. (sentencia)
  5. }

Aqui un ejemplo:
Código
  1. #!/usr/bin/perl
  2. $erik = "Administrador";
  3. if($erik == "Administrador")
  4. {
  5. print "Correcto, erik, es administrador";
  6. }

Tambien, existe una forma de a?adir ELSE un bucle que si la primera sentencia es erronea o correcta, exponga otro resultado:
Sintaxis:
Código
  1. #!/usr/bin/perl
  2. if(condicion)
  3. {
  4. (sentencia)
  5. }
  6. else {
  7. (sentencia)
  8. }

Aqui un ejemplo real:
Código
  1. #!/usr/bin/perl
  2. $erik = "Usuario";
  3. if ($erik == "Administrador")
  4. {
  5. print "Correcto es administrador";
  6. }
  7. else {
  8. print "Correcto es usuario";
  9. }

En este ejemplo, devolveria Usuario, porque no es administrador.
Y por ultimo Elseif, aqui lo veis.
Sintaxis:
Código
  1. #!/usr/bin/perl
  2. if(condicion)
  3. {
  4. (sentencia)
  5. }
  6. elseif(condicion) {
  7. (sentencia)
  8. }
  9. else {
  10. (sentencia)
  11. }

Y no hace falta un ejemplo, y si lo quereis lo pediis :).

FOREACH:

Esta sentencia es parecida a FOR, pero esta se utiliza para los arrays:
Código
  1. #!/usr/bin/perl
  2. @admins = ("Erik", "Eriks", "Otros...");
  3. print "Los admins son: ";
  4. foreach $admins (@admins)
  5. {
  6. print $admins;
  7. }

Para hacer un ordenado alfabetico hariamos la sentencia sort:
Código
  1. #!/usr/bin/perl
  2. @admins = ("Eriks", "Erik", "Otros...");
  3. print "Los admins son: ";
  4. foreach $admins (sort @admins)
  5. {
  6. print $admins;
  7. }

O usar reverse que seria el contraria de sort :).

Gracias, aqui acaban los bucles, proxima lecci?n veremos las subrutinas :).


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:37 pm
14.Subrutinas

Las subrutinas es un trozo de código que se puede llamar en cualquier y momento, y que es necesario que este en uso para poder complementar un código perl por funciones.
Os lo explicare con mis propias palabras, en un codigo que se puede llamar cuando lo necesites.

Aqui la sintaxis:

Código
  1. #!/usr/bin/perl
  2. sub nombre_de_la_subrutina
  3. {
  4. (sentencia)
  5. }
  6.  

Y para llamarlas usaremos el caracter &, por ejemplo

Código
  1. #!/usr/bin/perl
  2. sub erik
  3. {
  4. print "Hola\n";
  5. }
  6. &erik;
  7. print "Adios";
  8.  

O tambien la podemos llamar mediante el:
Código
  1. #!/usr/bin/perl
  2. sub erik
  3. {
  4. print "Hola\n";
  5. }
  6. erik();
  7. print "Adios";
  8.  

mi_subrutina();


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:38 pm
15.Hexadecimal a Binario

En esta lección, aprenderemos como pasar una cifra hexadecimal a binario.
Código
  1. #!/usr/bin/perl
  2. $binario = join('', unpack('B*', "\x191"));
  3. print "$binario\n";
  4.  

Esto pasaria el numero 191 hexadecimal a un numero binario, esto imprimiria:0000000000110001001110010011000100001010
Aqui tenemos un programilla codeado para el cursillo, es un pasador de hexadecimales a binarios:
Código
  1. #!/usr/bin/perl
  2. print "Introduce el numero hexadecimal que deseas pasar a binario:";
  3. $binn = <STDIN>;
  4. $binario = join('', unpack('B*', "\x$binn"));
  5. print "El numero binario es: $binario\n";

Pero no os olvideis que esto seria descendente, para hacerlo ascendente, solo hace falta poner la funcion B* en minuscula:
b* y listo.

Código
  1. #!/usr/bin/perl
  2. print "Introduce b* si deseas binario ascendente, introduce B* si deseas binario descendente:";
  3. $bin = <STDIN>;
  4. print "Introduce el numero hexadecimal que deseas pasar a binario:";
  5. $binn = <STDIN>;
  6. $binario = join('', unpack("$bin", "\x$binn"));
  7. print "El numero binario es: $binario\n";

Aqui le hemos añadido que se pueda elegir B* o b* :).

Final de esta lección.


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:38 pm
16.Variables locales y globales

Definici?n de perl.org:

Por defecto  todas las variables estan definidas de forma global, es decir
se puede acceder a ellas desde cualquier punto de un programa, pero es po-
sible que queramos que solo afecte a un trozo de codigo,  para ello usare-
mos la clave "local" que localiza una variable dentro de un trozo de codi-
go y "my" que se suele usar mas  y es mas recomendable, sirve  para decla-
rar variables en un trozo de codigo como puede ser una subrutina

Código
  1. #!/usr/bin/perl
  2. sub erik
  3. {
  4. my $nombre = "erik";
  5. print "Admin: $nombre\n";
  6. }
  7. my $admin = "Admin";
  8. print "$admin: erik\n";
  9. &erik;
  10.  


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:38 pm
17.Switch

Switch es muy utilizado para crear men?s y poder hacer elecciones:

Código
  1. #!/usr/bin/perl
  2. use Switch;
  3. $variable = <valor>;
  4. switch ($variable) {
  5. case 1 { print "<menu>" }
  6. case 2 { print "<menu>" }
  7. case 3 { print "<menu>" }
  8. case 4 { print "<menu>" }
  9. else { print "ERROR" }
  10. }
  11.  


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:39 pm
18.Begin End & Goto

Podemos hacer que se ejecute algo al principio de todo teniendo  prioridad
ante los demas, y  todo gracias a  BEGIN y con END podemos tener  el mismo
resultado pero en este caso se ejecutara al final.

Por ejemplo:
Código
  1. #!/usr/bin/perl
  2. print "2\n";
  3. BEGIN {print "1\n"}
  4. END {print "4\n"}
  5. print "3\n";
  6.  

Esto si no tubieras el begin y el end mostraria: 2 1 4 3
Pero gracias al begin y end muestra: 1 2 3 4 :)

Y luego GOTO, que es una sentencia que lo que hace es ir hacia una parte del código que ya ha sido repetida o que esta en el final, o donde queramos, sintaxis:
Código
  1. #!/usr/bin/perl
  2. Inicio:
  3. print "Volvemos al inicio";
  4. goto Inicio;

Esto imprimiria Volvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicioVolvemos al inicio

Infinitas de veces hasta que el PCLI se petara (Perl Command Line Interpreter).


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:39 pm
19.Sleep, Ignore & Alarm

Estas tres funciones pertenecen a las funciones denominadas "timer" (denominado por mi  ;D).
Sleep, lo que hace es parar el proceso el tiempo que desees, por ejemplo:

Código
  1. #!/usr/bin/perl
  2. print "De aqui 10 segundos te dire la contraseña";
  3. sleep 10;
  4. print "Despues de estos 10 segundos la contraseña a sido codificada: 10010010100101101010010101001010010101

Luego esta ignore, lo que hace es ignorar las alarmas o alguna función, nosotros la pondremos con alarm:

Código
  1. #!/usr/bin/perl
  2. {
  3. $war{ALRM} = sub  { die "Fallaste"};
  4. print "Escribe la contraseña antes de 5 segungos:\n";
  5. $war{ALRM} = 'IGNORE';
  6. print "Como hemos usado ignore, puedes tomarte el tiempo que necesites\n";
  7. $pass = <STDIN>;
  8. };
  9. if ($@ =~ /Fallaste/){
  10. print "Has fallado";
  11. }

y ahora alarm, lo que hace es que si en ese "x" tiempo no haces la funcion te salta.

Código
  1. #!/usr/bin/perl
  2. {
  3. $war{ALRM} = sub  { die "Fallaste"};
  4. print "Escribe la contraseña antes de 5 segungos:\n";
  5. $pass = <STDIN>;
  6. };
  7. if ($@ =~ /Fallaste/){
  8. print "Has fallado";
  9. }
  10. else {
  11. print "Contraseña correcta";


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:39 pm
20.Encriptaci?n en B64

Primero de todo, tenemos que activar el modulo MIME::Base64:
Código
  1. #!/usr/bin/perl
  2. use MIME::Base64;

Una vez activado este modulo, podemos ver 2 opciones diferentes, codificar, descodificar.
Vamos con la codifiaci?n:
Activamos el modulo B64.

Código
  1. #!/usr/bin/perl
  2. use MIME::Base64;
  3. $encoded = encoded_base64('El texto');
  4. print $encoded;

Ya hemos cifrado la primera b64, ahora veremos como descodificar:
Código
  1. #!/usr/bin/perl
  2. use MIME::Base64;
  3. $decoded = decoded_base64('El texto');
  4. print $decoded;

Ya esta, recibimos el resultado, ahora, vamos a ver un ejemplo de un sistema que codifique y descodifique, aqui lo vemos:

Código
  1. #!/usr/bin/perl
  2. use MIME::Base64;
  3. print "Que texto desea codificar?:";
  4. $cod = <STDIN>;
  5. print "Que texto desea descodificar?:";
  6. $descod = <STDIN>;
  7. $encoded = encode_base64($cod);
  8. $decoded = decode_base64($descod);
  9. print "$encoded\n";
  10. print "$decoded";

Fin de la lecci?n del modulo B64.


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:40 pm
21.Die

Se que una lecci?n para una sola funci?n es poco, pero ami esta funci?n me parece muy interesante por el solo hecho de avisarte formalmente de un error.

Cuando una subrutina o una configuraci?n de modulos, conexi?n etc... no te sale bien, usamos la funci?n die.
Die lo que hace es que si la conexi?n no salio bien, salta un mensaje y se acaba el programa.

Aqui un ejemplo de die en nuestro programa el mail bomber:
Código
  1. #!/usr/bin/perl
  2. use Net::SMTP;
  3. $smtp = Net::SMTP->new('error',
  4. Hello => 'error',
  5. Timeout =>25,
  6. Debug   =>1,
  7. );
  8. die "No se ha podido conectar al servidor";

Como veis, die declara que no se efectuo la conexion y se acaba el programa.


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:40 pm
22.Conversiones de bases numericas

De hexadecimal a decimal:

Código
  1. #!/usr/bin/perl
  2. print hex ("contenido");
  3.  

De octal a decimal:

Código
  1. #!/usr/bin/perl
  2. print oct ("cifra");
  3.  

De decimal a ASCII:

Código
  1. #!/usr/bin/perl
  2. print chr("cifra");

Y como pusimos en una lección anterior de hexadecimal a binario:

Código
  1. #!/usr/bin/perl
  2. print "join('', unpack('B*', "\x191"));

EDIT: Ahora me acorde de otra funcion de conversión era ord, para pasar de ASCII a octal y otros...

Código
  1. #!/usr/bin/perl
  2. print ord("cifra o caracteres");
  3.  

Proxima lección, funciones numericas como RAND, restas, multiplicaciones...


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:40 pm
22.Funciones numericas

Como veis en el titulo, vamos a hablar de este tipo de funciones numericas:
- Rand
- Rand transformado
- Sumas
- Restas
- Divisiones
- Multiplicaciones
- Potencias
- Raices cuadradas
- Valores absolutos
- Restos

1.Rand:
Lo que la  funci?n numerica rand hace es elegir un numero flotante del 0 al numero que quieras.

Código
  1. #!/usr/bin/perl
  2. print rand(80);

2.Rand transformado:
Es lo mismo que antes solo que puedes elegir numeros octales, caracteres ASCII, colocando su referente delante de todo:

Código
  1. #!/usr/bin/perl
  2. print oct(rand(80));

3.Sumas:
Las sumas se efectuan usando el caracter +:

Código
  1. #!/usr/bin/perl
  2. $suma = 9+9;
  3. print $suma;

4.Restas:
Las restas se efectuan usando el caracter -:

Código
  1. #!/usr/bin/perl
  2. $resta = 9-9;
  3. print $resta;

5.Divisiones:
Las divisiones se efectuan usando el caracter /:

Código
  1. #!/usr/bin/perl
  2. $division = 81/9;
  3. print $division;

6.Multiplicaciones:
Las multiplicaciones se efectuan usando el caracter *:

Código
  1. #!/usr/bin/perl
  2. $multi = 9*9;
  3. $multi;

7.Potencias:
Hay dos tipos de efectuar potencias, usando el sistema exp para conseguir la potencia a cualquier numero:

Código
  1. #!/usr/bin/perl
  2. $pot = exp 8;
  3. print $pot;

Y luego, elevar un numero a una potencia, aqui vemos como se hace:

Código
  1. #!/usr/bin/perl
  2. $pot = 5 ** 2;
  3. print $pot;

Esto se llamaria 5 a la 2 o 5 al cuadrado.

8.Raices cuadradas:
La raiz cuadrada al igual que C se utiliza sqrt, pero en perl no necesitamos la libreria math.h:

Código
  1. #!/usr/bin/perl
  2. $raizcuadrada= sqrt 81;
  3. print $raizcuadrada;
  4.  

9.Valor absoluto:
El valor absoluto se obtiene usando la funcion abs por ejemplo:

Código
  1. #!/usr/bin/perl
  2. print abs(-90);

10.Como sacar el resto:
El resto se obtiene usando el caracter %:

Código
  1. #!/usr/bin/perl
  2. $resto = 14 % 51;
  3. print $resto;


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:41 pm
23.Localtime

Al principio del curso vimos que usabamos la funcion localtime, actualmente, vamos a ense?aros a representarla con las definiciones que querrais, la sintaxis seria algo as?:

Código
  1. #!/usr/bin/perl
  2. ($sec,$min,$hor,$day,$mon,$year,$wday,$yday,$isdst)=localtime(time);
  3. print "$sec,";
  4. print " $min, ";
  5. print "$hour, ";
  6. print "$isdst, ";
  7. print "$year, ";
  8. print "$mon, ";
  9. print "$wday, ";
  10. print "$yday, ";
  11. print "$mday.";
  12.  

Como veis, ya indica cada cosa que es, imaginaos que ahora queremos hacer una aplicacion que muestro, hora:minuto:segundo.

Código
  1. #!/usr/bin/perl
  2. ($sec,$min,$hor)=localtime(time);
  3. print "$hor: $min: $sec";

?t voila!


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:41 pm
24.Variables argumentativa

Las variables argumentativasson las que se consiguen escribiendo como si fuera un metodo get, por ejemplo:

Código
  1. #!/usr/bin/perl
  2. print "Te llamas $ARGV[0]";

Pero claro, para conseguir el resultado de esa variable argumentativa, necesitamos escribir al ejecutar el archivo.pl esto:

nombre.pl Erik

En este caso seria eso.
Pueden a?adirles tantas argumentativas como quieran.
Si no ha quedado claro, crean un nuevo tema y preguntais all


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:41 pm
25.Conexi?n a Sockets

A petici?n de rockox, pondre como hacer una conexi?n a sockets y una conexion a una ip, puerto y tcp remoto.
Primero, usaremos el modulo Socket.

Lo declaramos as?:

Código
  1. use IO::Socket;

Y luego, para acceder la conexi?n tenemos que introducir los datos, primero lo haremos por variables argumentativas como vemos en la lecci?n 24 y luego por variables simples usando <STDIN>.

Código
  1. #!/usr/bin/perl
  2. use IO::Socket;
  3. $conexion= IO::Socket::INET->new(PeerAddr, $ARGV[0], PeerPort, $ARGV[1],  Proto, 'tcp');

Aqui, hariamos algo as?, por ejemplo le llaremos conexion.pl, escribiriamos esto en el cmd:
conexion.pl "ip" "puerto" (sin comillas)

Y se conectaria a esa ip y puerto.
Luego por variables simples:


Código
  1. #!/usr/bin/perl
  2. use IO::Socket;
  3. print "Introduce la ip:";
  4. $ip = <STDIN>;
  5. print "\nIntroduce el puerto:";
  6. $puerto = <STDIN>;
  7. $conexion= IO::Socket::INET->new(PeerAddr, $ip, PeerPort, $puerto,  Proto, 'tcp');

Y listo.

En la lecci?n 26, veremos complementaciones a los sockets (scanner de puertos, mail bomber...)


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:42 pm
26.Enviar mensajes a una direcci?n [CHAT]

Bueno, aqui os pondre como poder enviar mensajes a una direcci?n ip para poder contactarte con el, primero yo lo hare local, as?, podremos ver mejor y probarlo y m?s adelante lo haremos remoto.

Empezamos con el que envia mensajes:

Código
  1. #!/usr/bin/perl
  2. use IO::Socket;
  3. $sock = new IO::Socket::INET (LocalHost => 'localhost',
  4. LocalPort => 1100,
  5. Proto     => 'tcp',
  6. Listen    =>  6,
  7. Reuse     => 1
  8. );
  9. die "No se ha podido crear el socket: $!\n" unless $sock;
  10. $conexion= $sock -> accept();
  11. $conexion->send($ARGV[0]);
  12. close ($conexion);
  13.  

Esto lo que hace es mandar un mensaje a la direccion 127.0.0.1 al puerto 1100 con el protocolo tcp, veremos que hemos usado una variable argumentativa, en la leccion 24 y 25 vemos algun ejemplo, emplearlo ;).

Y podremos ver desde un programa como telnet los mensajes que se reciben :).


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:42 pm
27.Anonymous mail

Código
  1. #!/usr/bin/perl
  2. use Net::SMTP;
  3. print "Introduzca el mailhost al que desea solicitar la conexion:";
  4. $mailhost = <STDIN>;
  5. print "Introduzca el email que desea utilizar:";
  6. $emailfrom = <STDIN>;
  7. print "Introduzca el email que desea bombear:";
  8. $emailto = <STDIN>;
  9. print "Introduzca el asunto del correo:";
  10. $asunto = <STDIN>;
  11. print "Introduzca el mensaje que desea enviar (Puede usar secuencias de escape (\\n, \\a...)):";
  12. $sms = <STDIN>;
  13. $smtp = Net::SMTP->new("$mailhost",
  14. Hello => "$mailhost",
  15. Timeout =>25,
  16. Debug   =>1,
  17. );
  18. die "No se ha podido conectar al servidor";
  19. print $smtp->domain,"\n";
  20. $smtp->mail("$emailfrom");
  21. $smtp->to("$emailto");
  22. $smtp->data();
  23. $smtp->datasend("To: $emailto");
  24. $smtp->datasend("From: $emailfrom");
  25. $smtp->datasend("Subject:$asunto\n");
  26. $smtp->datasend("$sms");
  27. $smtp->dataend();
  28. $smtp->quit();
  29.  

Tiene el mismo c?digo que el mail bomber, pero lo quitamos el bucle for :).


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:42 pm
28.Bomb Mailer

Código
  1. #!/usr/bin/perl
  2. use Net::SMTP;
  3. print "Buenas, cuantos mails bombs deseas hacer:";
  4. $n = <STDIN>;
  5. print "Introduzca el mailhost al que desea solicitar la conexion:";
  6. $mailhost = <STDIN>;
  7. print "Introduzca el email que desea utilizar:";
  8. $emailfrom = <STDIN>;
  9. print "Introduzca el email que desea bombear:";
  10. $emailto = <STDIN>;
  11. print "Introduzca el asunto del correo:";
  12. $asunto = <STDIN>;
  13. print "Introduzca el mensaje que desea enviar (Puede usar secuencias de escape (\\n, \\r...)):";
  14. $sms = <STDIN>;
  15. for ($a=1;$a<=$n;$a++) {
  16. $smtp = Net::SMTP->new("$mailhost",
  17. Hello => "$mailhost",
  18. Timeout =>25,
  19. Debug   =>1,
  20. );
  21. die "No se ha podido conectar al servidor";
  22. print $smtp->domain,"\n";
  23. $smtp->mail("$emailfrom");
  24. $smtp->to("$emailto");
  25. $smtp->data();
  26. $smtp->datasend("To: $emailto");
  27. $smtp->datasend("From: $emailfrom");
  28. $smtp->datasend("Subject:$asunto\n");
  29. $smtp->datasend("$sms");
  30. $smtp->dataend();
  31. $smtp->quit();
  32. }


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 13:42 pm
29.Escaner de puertos

Código
  1. #!/usr/bin/perl
  2. use IO::Socket;
  3. print "IP o HOST: ";
  4. $iphost=<STDIN>;
  5. for($puertos=21;$puertos<=270;$puertos++)
  6.   {
  7. $sock = IO::Socket::INET->new(PeerAddr, "$iphost", PeerPort, "$puertos",   Proto, 'tcp');
  8. if ($sock) {      
  9.    print "$puertos Abierto\n";
  10.     } else {  
  11.     print "$puertos Cerrado\n";
  12.     }
  13.   }


Título: Re: Curso de programación en Perl
Publicado por: Erik# en 7 Enero 2009, 21:00 pm
30.Escaner de puertos de X a Y

Código
  1. #!/usr/bin/perl
  2. use IO::Socket;
  3. print "IP o HOST: ";
  4. $iphost=<STDIN>;
  5. print "Puerto de inicio: ";
  6. $puertoi = <STDIN>;
  7. print "Puerto final: ";
  8. $puertof = <STDIN>;
  9. for($puerto = $puertoi;$puerto<$puertof;$puerto++)
  10.   {
  11. $sock = IO::Socket::INET->new(PeerAddr, "$iphost", PeerPort, "$puerto",   Proto, 'tcp');
  12. if ($sock) {      
  13.    print "El puerto $puerto esta abierto\n";
  14.     } else {  
  15.     print "El puerto $puerto esta cerrado\n";
  16.     }
  17.   }