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 - Mortal_Poison

#161
Hola You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Lo más probable es que tengas algo defectuoso en tu sistema operativo y por eso no te "reconozca" los pendrives. Claro está, a nivel de software, debido que ya probaste en Ubuntu y todo funciona bien al parecer. Lo que te recomiendo es pasar tus archivos a una partición y re-instalar el Windows. Esto con el fin de que cualquier problema que se tenga, sea reparado y por consiguiente, tu sistema operativo quede funcionando de manera normal.

Un saludo.
#162
Hola a tod@s,

Un día, estaba con unas imágenes que debía identificar para realizar una tool, sin embargo, me era muy complicado contar los colores. Vamos, a veces se cuenta mal, se es daltónico(sin ánimo de discriminar o criticar ni nada por el estilo) o se está con 'pereza'. Así que realicé un script el cual reconocerá los colores de las imágenes que le pasemos.

El módulo de imagen[Image] proporciona una clase con el mismo nombre que se utiliza para representar una imagen PIL. El módulo también proporciona varias funciones de fábrica, incluidas funciones para cargar imágenes desde archivos y para crear nuevas imágenes.

Tenemos muchísima información aquí: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Como pueden ver, el módulo nos provee funciones muy potentes.

Como me encuentro en Windows, les va a pedir si o si el módulo de Image. Suele ocurrir que si te bajas el paquete, te salga un error de zlib, sin embargo, lo vamos a instalar de la siguiente manera en nuestro cmd.

Código: text
python -m pip install Pillow


Una vez hecho esto, voy a explicar cada una de las partes del código de una manera concisa y detallada. También he comentado el código, para que lo entiendan de una manera más precisa.



Ilustración 1. Inicialización.

Al inicio del script inicializamos las variables que vamos a usar. El módulo de ImageDraw e Image son importados para el reconocimiento y para trabajar con los colores de la imagen que vayamos a 'reconocer'. Además de esto, tenemos el famoso argparse, el cual determinará los argumentos del script que el usuario nos envie.


Ilustración 2. Uso de argparse y obtención de parámetros dados por el usuario.

Siempre que se vaya a ejecutar el script, comenzará por el main(porque lo estamos llamando desde __name__ == '__main__). Siguiendo con la guía, tenemos dos argumentos, el de output y el de file.

En la línea de comandos cuando ejecutemos nuestro script, tendremos que hacerlo de la siguiente forma:

Código: text
python recoignize.py -o "C:/Users/Mortal/Desktop/Name_Directory" -f "C:/Users/Mortal/Desktop/Nombre_De_La_Imagen.png"


Si el directorio no existe, se creará, no se preocupen.

Notemos que llamamos a logic_images(args) y le pasamos nuestros argumentos.

Vamos por pedazos, como Jack el destripador.


Ilustración 3. Obteniendo información de nuestra imagen.

Como podemos notar, lo que hacemos es obtener nuestra imagen(args.file) y luego operar con PIL_IMAGE_FILE, ya que es la que abre nuestra imagen. Además de eso, obtenemos el tamaño del alto y ancho y los multiplicamos. En la línea 36 ponemos la condición de que si no llegase a existir el directorio que proporcionamos, que se cree.

De la línea 40 a la línea 47 lo que hacemos es obtener la información(colores) de nuestra imagen y posteriormente, hacer nuestra condición para ver si restamos pixeles a nuestra imagen o ya trabajamos con ellos.


Ilustración 4. Asignar a nuestro diccionario los pixeles.

En nuestro diccionario quedarían los pixeles con el identificador de 'col' para acceder a él.
Si no me entendieron, sabemos que los diccionarios son de este estilo:
Código: python
capitales = {'Scripting':'Python', 'Programacion':'PHP'}


Si notan, poseemos clave-valor en un diccionario, para acceder a cada uno de esos datos, accedemos por la clave.

En el caso de los pixeles con 'col' vendría siendo lo mismo.


Ilustración 5. Guardar los colores analizados en imagenes separadas.

En la Ilustración 5. podemos notar que lo que hacemos es hacer unos cálculos con los píxeles(más información en los comentarios) y luego, pasamos a guardar las imágenes de los colores que analizamos de nuestra imagen principal en porcentajes y en formato png. Añado que, luego de eso, también se añade a la lista de sorted_all_colors, el color y el porcentaje, para luego ordenarlo. Esto con el fin de que más adelante, lo usaremos para crear nuestra "torta" de los colores y para ello ocupamos una torta, por ello se crea una imagen de tipo círculo.


Ilustración 6. Guardamos cada uno de los colores en nuestro círculo.

En la Ilustración 6. observamos que hacemos varias cosas, entre ellas, crear y modificar nuestro círculo(ángulo de inicio, ángulo de fin, relleno, entre otros) y también creamos un archivo .json que contiene el código RGB del color y el número del mismo. Además de eso, nuestra torta que contiene los colores usados por la imagen se llama torta.png. Como les mencioné, en los comentarios está muchísimo más detallado y bueno, espero que les sea de utilidad.

A continuación, les dejo el código completo.


Código: python

#!/usr/bin/env python
#-*- coding: utf-8 -*-

### Mortal_Poison ###
### https://www.youtube.com/VIINVIDEOSHD ###
### https://www.viinacademy.com ###
### https://underc0de.org/foro/profile/Mortal_Poison ###

## Importamos las librerías necesarias.
import os
import json
from PIL import ImageDraw
from PIL import Image
import argparse

# Inicializamos.
porcentaje_minimo = 0.5 # Porcentaje de color en el archivo que se agregará.
transparent_pixels = True # Usaremos pixeles transparentes.
circle_size_create = 500 # Tamaño de archivo circular en pixeles.
color_files_flag = True # Obtener resultados con archivos de imagen.
   
file_for_results = True # Obtendremos resultados con JSON.
format_for_results = 'hex'  # Lo hacemos porque conocemos que el formato es hex - rgb - rgba.
json_extension = '.json' # Nuestros resultados tendrán la extensión en json.

## Diccionario para nuestros pixels.
dictionary_for_colors = {}
## Lista de los colores ordenados.
sorted_all_colors = []
   

   
## Nuestra función.
def logic_images(args):
    ## Abrimos nuestra imagen ##
    global pixels_per_image
    PIL_IMAGE_FILE = Image.open(args.file)
    ## Obtenemos el tamaño y lo multiplicamos(alto por ancho).
    pixels_per_image = PIL_IMAGE_FILE.size[0] * PIL_IMAGE_FILE.size[1]
    ##Si no llegase a existir el directorio, lo creamos :).
    if not os.path.isdir(args.output):
        os.makedirs(args.output)
    ## Declaramos nuestra variable global, porque la tenemos local.
   
    ## Obtenemos la información de nuestra imagen con un loop.
    for pixels_rgba in PIL_IMAGE_FILE.getdata():
        if pixels_rgba[3] == 0:
            if transparent_pixels == True:
                pixels_rgba = (0, 0, 0, 0)
            else:
                pixels_per_image -= 1
                continue
        try:
            ## Asignamos en nuestro diccionario el pixel rgba junto al identificador col.
            col = dictionary_for_colors[pixels_rgba]['col']
            # Incrementamos nuestro col.
            dictionary_for_colors[pixels_rgba] = {'col': col + 1}
       
        except:
            dictionary_for_colors[pixels_rgba] = {'col':1}
     
    ## Recorremos nuestro diccionario.
    for color in dictionary_for_colors:
         ## De nuestro diccionario de los pixeles que obtuvimos, lo vamos a multiplicar y lo dividimos entre el flotanto de el total de píxeles.
        percentage_of_color = dictionary_for_colors[color]['col'] * 100 / float(pixels_per_image)
        # Ahora condicionamos, si la anterior variable es mayor o igual a nuestro porcentaje mínimo(qu es del 0.5) entonces...
        if percentage_of_color >= porcentaje_minimo:
            # Además, condicionamos si vamos a obtener los resultavos en formato de imagen, entonces...
            if color_files_flag == True:
                # Creamos una nueva imagen, le asiganmos el modo,tamaño y los colores.
                img = Image.new('RGBA', (100, 100), (color[0],color[1],color[2],color[3]))
                # Aqi asignamos el porcentaje de color para posteriormente guardarlas.
                file_name = 'Per_Color_%03.4f.png' % percentage_of_color
                # Ahora las guardamos en nuestro directorio de salida en formato PNG.
                img.save(os.path.join(args.output,file_name),format="png")
            # Para un mayor orden, se me ocurrió ordenar los colores. Abrimos nuestra lista con los datos respectivos.
            sorted_all_colors.append({'color':color,'number':percentage_of_color})
    # Por último, ordenamos con sort.
    sorted_all_colors.sort(key=lambda k: k['number'],reverse=True)
   
    # Creamos un círculo para mostrar los resultados como en una torta de resultados.
    circle = Image.new('RGBA', (circle_size_create,circle_size_create), (0,0,0,0))
    _current_angle = 0
    # Mediante el loop y los colores ordenados, lo recorremos...
    for x in sorted_all_colors:
        # Lo multiplicamos para expandirlo.
        _current_pieslice_angle = x['number'] * 3.6
        # Dibujamos nuestro circulo y además, lo llenamos de los colores que están en nuestra lista de colores ordenados.
        ImageDraw.Draw(circle).pieslice([10, 10, circle_size_create-10, circle_size_create-10], _current_angle, _current_angle + _current_pieslice_angle, fill=(x['color'][0],x['color'][1],x['color'][2],x['color'][3]))
        # Acumulamos.
        _current_angle += _current_pieslice_angle
     
        # Condicionamos, si vamos a obtener los resultados en .json entonces...
        if file_for_results == True:
            # Si el formato del color de resultados además es hex, entonces...
            if format_for_results == 'hex':
                x['color'] = '#%02x%02x%02x' % (x['color'][0],x['color'][1],x['color'][2])
            elif format_for_results == 'rgb':
                x['color'] = (x['color'][0],x['color'][1],x['color'][2])
    # Guardamos nuestro círculo, en donde hemos elegido guardar todo y le llamamos torta en formato png.
    circle.save(os.path.join(args.output,"torta.png"),format="png")
   
     # Condicionamos, si vamos a obtener los resultados en .json entonces... RECORDAR QUE SIEMPRE ESTÁ EN TRUE.
    if file_for_results == True:
        # Guardamos nuestro archivo de JSON en un archivo de json llamado colors.json.
        with open(os.path.join(args.output,"colors"+json_extension), 'w') as outfile:
            json.dump(sorted_all_colors, outfile)
   
    # Al finalizar todo el proceso, imprimimos, analizado.
    print("Analizado correctamente. Verificar la ruta de salida.")
#logic_images()


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-o','--output', help='Output of the colors.')
    parser.add_argument('-f','--file', help='Image to Scan colors.')
    args = parser.parse_args()
    # -f -> La imagen de la cual queremos obtener los colores.
    # -o -> Directorio para obtener los colores(se obtienen separados).
    logic_images(args)



if __name__ == '__main__':
    main()



Añado que reconoce muy bien las imágenes, pero tiene un margen de error, pero bueno, ya podrán modificarlo a sus necesidades.
Les dejo una imagen de cómo funciona y además, de sus resultados.

Analizaremos la siguiente imagen de Underc0de:


Ilustración 7. Imagen de underc0de a analizar.

Lanzamos nuestro script de la siguiente forma:

Código: python
python recoignize.py -o "C:/Users/Mortal/Desktop/results_for_scan" -f "C:/Users/Mortal/Desktop/logo_underc0de.png"



Ilustración 8. Imagen analizada de underc0de.

Como podremos notar, ¡nos saca los colores que usa el logo del foro de underc0de!. Pero no es todo, abramos el archivo de colors.json:


Ilustración 9. Archivo JSON de la imagen analizada.


Ilustración 10. Torta con los respectivos colores de la imagen.


Como vemos, funciona todo perfecto. Se puede calibrar más, de hecho, tengo aún otra versión que la estoy modificando para que sea un poco más potente. Espero que hayan podido observar el potencial de Python y de sus ventajas que nos brinda.

Cualquier comentario/duda/sugerencia será bien recibid@.

Un saludo.
[/font]
#163
Debates, Reviews y Opiniones / Re:Tools para Doxing
Noviembre 04, 2017, 09:41:53 PM
Hola You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Un gusto que te haya gustado.

Un saludo.
#164
Debates, Reviews y Opiniones / Re:¿Qué opinan de Java?
Noviembre 04, 2017, 09:40:10 PM
Hola You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

La verdad que Java en lo que respecta por ejemplo a JSP, nunca me ha gustado y me parece que es realmente tedioso. Pero como todo, ventajas y desventajas tendremos en los lenguajes de programación.

Por otra parte, te doy la razón, de hecho, Java es una 'fusión' entre C# y C++.

Un saludo y gracias por comentar ;D.
#165
Python / [PARTE 1] ¡Aprende Python Avanzado!
Noviembre 04, 2017, 09:35:00 PM

Hola a tod@s,

Hoy les traigo un aporte de Python Avanzado,donde asumo que ya conocen y tienen buenas bases de Python. Estos tutoriales también los llevaré a mi canal donde los explicaré con voz, por si a alguien le interesa. Además de eso, también mostraré las vulnerabilidades que se cometen cuando se programan en éstos lenguajes de Scripting, ya sea PHP, Python(con sus frameworks) y entre otros(será en otro hilo).

Comencemos...


Ilustración 1. Guido van Rossum

No sé ustedes, pero yo vi esa imagen y se me vino a la mente Kevin Mitnick(por su parecido físico xd).

Por la década de los 80's, cuando se creo éste lenguaje de scripting que muchos amamos, comenzó a evolucionar con su misma filosofía: proporcionar un lenguaje de programación que fuera multiparadigma con legibilidad y productividad. La cuestión es, la gente solía ver a Python como un lenguaje de Scripting y no como lo anterior. Sin embargo, las empresas pioneras en ese entonces, notaron que con Python podían construir cualquier tipo de sistema. Y así fue como se convirtió en lo que hoy conocemos: en un lenguaje de Scripting.

Cabe aclarar que abarcaré todo desde la última versión de Python, la 3.x.x.

Python 3, a pesar de sus nuevas y emocionantes características, todavía no es adoptado en la comunidad. Notemos en You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login donde observamos la compatibilidad de los paquetes más populares en Python 3, fue llamada Python 3 Wall Of Shame. Es un poco triste, pero esto pasa con cualquier versión de cualquier lenguaje de programación: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Esta situación está cambiando poco a poco, de hecho, si notan, en la página los paquetes enumerados se están poniendo de color verde, precisamente porque se está avanzando en este aspecto.

La gente suele comentar: "los paquetes de Python 2 a la versión de Python 3 no se encuentran". Pues cuando la página esté totalmente verde como un trébol, ésta gente no tendrá excusa para aprovechar el máximo potencial de la versión de Python 3. A pesar de todo, tienen razón. He desarrollado herramientas(que son privadas pero que he presentado en conferencias) que están en Python 2.x por su compatibilidad. El problema radica en que, permutar una aplicación existente en Python 2.x a Python 3.x resulta un completo problema. Pero como existen páginas para convertir migraciones de Oracle a Mysql, también las hay en Python. Claro está, esto no garantiza un 100% de que todo funcionará correctamente(porque lo he comprobado) sino más bien de migrarlo y verificar todo de nuevo. La herramienta para transformar el código de Python 2.x a Python 3.x se llama You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


Ilustración 2. Mongomering Berns aludiendo a las empresas.

Ahora imaginen, si a mi me cuesta un poco, a las organizaciones un proceso como esos les va a costar el doble o incluso el triple, y eso ellas no lo pueden permitir.


Ilustración 3. Arquitecto de Software.

Sin embargo, realizar un cambio de estos lo podemos hacer mediante metodologías de diseños de arquitectura de software, como por ejemplo la orientada a You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login o You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login, donde se puede conseguir un objetivo bastante grande y con muy buenos resultados. No me centraré en cuáles diseños de Arquitectura de Software existen, de esto, existen estudios hasta posdoctorados.

Sin embargo, yo recomendaría a las empresas hacerlo, los beneficios que trae Python 3 es verdaderamente fabuloso. Basémonos en el You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login éste es el que nos indica qué va a ocurrir con Python 2 y por qué migrar a Python 3. Se comenta en el artículo que ya no habrá versión 2.8 en la versión de Python y que además, en un momento determinado a posteriori, proyectos principales como Django, Numpy y Flask eliminarán la compatibilidad con la versión 2.x y solo estarán disponibles en la versión 3. Es un aspecto muy importante que quería tocar, por el hecho que muchos de los desarrolladores se abstienen a migrar a una versión de Python 3.

Principales diferencias entre Python 2 y Python 3

Mostraré las principales diferencias que existen con ejemplos, recordando a un amigo que una vez me dijo: "ese código no sirve, da error por todo". Lo que no se dió cuenta, era que estaba en Python 3 y no en Python 2.

Para los que no estén familiarizados, por favor remitirse al siguiente You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


  • Cambios de Sintaxis.
  • Cambios de librerías.
  • Cambios de tipos de datos y también de colecciones.

Comencemos por los cambios de sintaxis, en Python 2 imprimir un mensaje sería lo siguiente:
Código: python
print "El mundo caerá en caos"


Mientras que en Python 3:
Código: python
print("El mundo caerá en caos")


Obviamente, si intentamos ejecutar con Python 2 el código de Python 3, nos generará error y viceversa.


Ilustración 4. Ejecutando con Python 3 un mensaje con la sintaxis de Python 2.

Esa es una de las diferencias, además de:
print ya no es una declaración sino una función, esa es la razón por lo que el paréntesis ahora es obligatorio.
➡ Las excepciones cambiaron: from except exc, var a except, exc como var.
➡ El operador de comparación <> ha sido removido y cambiado a !=.
➡ La función sort() y las listas con método sorted() ya no aceptan el argumento You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
➡ Las expresiones de divisiones entre enteros como por ejemplo 3/2, retornará flotantes. Para ello debemos usar el operador //. Esto es muy bueno, porque podemos hacer una división como: 10//7 y el resultado será 1.

Compatibilidades entre versiones

Realmente se torna complicado cuando queremos hacer esto. Sin embargo, vale la pena. La mejor manera hasta ahora para definir cómo puede cambiar la compatibilidad en el futuro es mediante You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

SemVer describe un estándar que es ampliamente aceptado a nivel mundial para marcar el alcance del cambio en el código mediante el especificador de la versión que consiste en solo tres números. También ofrece algunos consejos de cómo manejar las políticas para desaprobar esto. Podemos obtener más detalles en su página oficial, donde nos indica el formato MAYOR, MENOR o PATCH dependiendo el número de versión.

La compatibilidad muchas veces la podemos agregar en un fichero llamado You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login, de hecho, hay mucha información acerca de esto:
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Si vemos el código de You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login en el proyecto de GitHub, nos damos cuenta que es de la siguiente forma:

Código: python
# -*- coding: utf-8 -*-
import sys
## Condición para verificar la versión de Python.
if sys.version_info < (3, 0, 0):
    import urlparse  # Si es menor a la 3.0

    def is_string(s):
        return isinstance(s, basestring)  # noqa
## Sino, usamos la librería de Python 3.
else:
    from urllib import parse as urlparse  # noqa

    def is_string(s):
        return isinstance(s, str)


Esa es una forma muy conveniente para las dependencias de librerías y asumir la compatiblidad en nuestros proyectos de Python.

Hablemos de Jython


Ilustración 5. Logo de Jython.

Nos permite usar sin problemas las clases de Java dentro de nuestros módulos de Python. You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login  utilizar sin problemas las clases de Java dentro de sus módulos de Python. Tenemos que Jython es multiplataforma, posee velocidad y memoria y además, también tiene sincronismo multihilo. You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login uno de los frameworks también está intentando promover e incentivar para que Jython se encuentre en el mundo de Java.

Hablemos de IronPython


Ilustración 6. Logo de IronPython.

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login nos permite integrar Python al Framework de .NET. El proyecto es apoyado por Microsoft, donde trabajan los desarrolladores líderes de IronPython. Es una implementación bastante importante para la promoción de un idioma. Además de Java que posee una de las comunidades desarrolladoras más grandes que existen, .NET no es la excepción. También creo que vale la pena resaltar que Microsoft proporciona un conjunto de herramientas de desarrollo gratuitas que convierten a Visual Studio en un IDE de Python completo. Esto se logra con plugins desarrollados como PVTS(Python Tools for Visual Studio) de Visual Studio y está disponible como código fuente abierto. Lo puedes descargar del siguiente You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


Hablemos de PyPy


Ilustración 7. Logo de PyPy.

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login es probablemente una de las implementación más emocionantes, ya que su objetivo es volver a escribir código Python en Python. En PyPy, el intérprete de Python está escrito en Python. Tenemos una capa de código C que lleva a cabo el trabajo de nuts and bolts para la implementación CPython de Python. Sin embargo, en la implementación de PyPy, esta capa de código C se reescribe totalmente en Python puro. ¿Qué significa esto? significa que puede cambiar el comportamiento del intérprete durante el tiempo de ejecución e implementar patrones de código que no podrían hacerse fácilmente en CPython. En la actualidad, PyPy apunta a ser totalmente compatible con la versión de Python 2.7, mientras que PyPy3 es compatible con la versión de Python 3.2.5.

Command Shells para Python

Existen varios, sabemos que python al instalarlo trae un command line, sin embargo, aquí van otros.

bpython

bpython posee una interfaz elegante para el intérprete de Python. Éstos son algunos de las cosas que podemos obtener con bpython:
• Resaltado de sintaxis en línea
• Autocompletar similar a Readline con sugerencias que se muestran a medida que escribe
• Autoindentación(para las personas que dicen que odian python por su indentación  ::) )
• Soporte de Python 3
• Listas de parámetros esperados para cualquier función de Python

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


iPython

IPyhton (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login) proporciona un shell de comandos de Python extendido. Entre sus características, enumeraré las que son más interesantes:
• Introspección dinámica de objetos
• Acceso al shell del sistema desde el prompt
• Soporte directo de creación de perfiles
• Instalaciones de depuración

Ahora, IPython es una parte del proyecto más grande conocido como You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login que proporciona notebooks interactivos con código en vivo que puede ser escrito en muchos idiomas distintos.

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

ptpython

ptpython es un proyecto open source, la implementación de las utilidades básicas del núcleo está disponible como un paquete separado llamado prompt_toolkit. Esto permite crear varias interfaces interactivas de línea de comandos que estéticamente son agradables. A menudo se suele comparar con bpython en el aspecto de funcionaldiades, pero la principal diferencia es que habilita un modo de compatibilidad con IPython y su sintaxis habilita características adicionales como %pdb,%cpaste o %perfil.

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Para finalizar les comentaré de varios debuggers que uso cuando me estoy dando cabezasos contra la pared al no encontrar por qué me sale error :-\.

Debugging In Python

La depuración de código es un elemento esencial en el proceso de desarrollo de software. Muchos programadores/desarrolladores pueden pasar la mayor parte de su vida utilizando únicamente registros extensos como sus principales herramientas de depuración, pero la mayoría de los desarrolladores profesionales prefieren confiar en algún tipo de depurador para sus tareas diarias. Python, ya viene con un depurador interactivo incorporado llamado pdb, para los que no lo conocían, pueden consultar en el siguiente You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Loginmás información. Se puede invocar desde la línea de comandos en el script existente, por lo que Python ingresará a la depuración post-mortem si el programa sale anormalmente(muy común xd):

Código: python
python -m pdb Mortal_Poison.py


Éste tipo de depuración post-mortem si bien es útil, no abarca todos los escenarios. Pragmáticamente solo es útil cuando la aplicación existente posee alguna excepción si se produce el error. En muchos casos, el código defectuoso se comporta de forma anormal pero no se cierra inesperadamente(no sé si se acuerden de lo de los temas de errores en tiempo de ejecución / compilación). En esos casos, podemos indicarle a el debugger que se establezca en una línea de código específica, para ello usamos:

Código: python
import pdb; pdb.set_trace()


Esto hará que el intérprete de Python inicie la sesión del depurador en esa línea de cñidugi, Es muy útil cuando tenemos problemas de localizar y a primera vista, también nos es muy familair con el depurador de GNU(GDB). Como sabemos, Python es un lenguaje dinámico y la sesión de pdb es muy similar a una sesión de intérprete ordinaria. Es decir, el desarrollador no solo se limita a localizar el código debuggeado sino que también puede realizar importaciones a módulos o también, invocar cualquier código.

Lamentablemente, la primera experiencia con pdb puede ser un poco abrumadora y frustante, debido a la existencia de comandos crípticos de depuración de letras cortas como h, b, s, n, j y r. En caso de duda, el comando help pdb escrito durante la sesión del depurador proporcionará un uso extenso e información adicional que nos proporcionará ayuda. La sesión del depurador en pdb también es muy simple y no proporciona funciones adicionales, como la finalización de pestañas o el resaltado del código. Afortunadamente, hay pocos paquetes disponibles en PyPI que proporcionen tales características disponibles a partir de shells de Python alternativos mencionados anteriormente.

Los ejemplos más notables son:
• You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login: Paquete separado basado en iPython.
• You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login: Paquete separado basado en ptpython.
• You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login: Incluido con bpython.

Si desean mucha más información acerca de esto, podemos recurrir a la You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


Además de eso, también existen otros debuggers que he tenido la oportunidad de usar y son los siguientes:

  • You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
  • You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
  • You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


Ahora si vamos a lo que nos compete.




La capacidad de escribir código de una manera eficiente yo diría que viene naturalmente con el tiempo. Me acuerdo que al principio, escribía el código todo en la clase principal o solo en un archivo. Luego aprendí conceptos que me sirvieron para ser mejor coder, como herencia, abstracción, a organizar por paquetes/módulos, entre otr@s. Vamos, recuerda tu primer programa, te aseguro que será como el mío, dan ganas de llorar :'(. Sin entrar en detalles, cuando se poseen programas con sintaxis obtusa, API's poco claras o estándares poco convenciales, es cuando entramos a mejorar. Python desde su versión más antigua hasta la versión actual(3.6.3) ha realizado muchísimas mejores en el lenguaje, para que sea más claro, más comprendible, más limpio y mucho más fácil de escribir. Les enseñaré:

• contextlib y with.
• Comprensión de listas.
• Iteradores y generadores.
• Descriptores y propiedades.
• Los Decoradores.

Python como sabrán, nos proporciona un gran conjunto de tipo de datos. De la misma forma que es para las colecciones, lo es para los tipos numéricos.
Existen algunas diferencias poco conocidas por los desarrolladores, pero no tienes más opción que aprender. Las cosas cambia cuando se trata entre colecciones y strings(cadenas). Quisiera mencionar que algunos patrones de código que parecen intuitivos y simples para los principantes(newbies) generalmente son considerados no-pythonics(no pythónicos) por los programadores más experimentados porque son ineficientes o son muy detallados. Patrones como por ejemplo: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login que es usado para resolver problemas comunes, a menudo parecen ser solo estética. Realmente está mal. Como siempre, estaremos sujetos en que la comunidad de Python esté lleno de mitos y estereotipos de cómo funcionan las cosas. Sin embargo, profundizando solo tú y nadie más que tú, podrás saber cuáles de las declaraciones que se hacen realmente son ciertas y objetar las demás.

El tema de las strings o cadenas puede resultar cierta confusión para los programadores que están acostumbrados a programar solo en la versión de Python 2. En Python 3, SOLO hay un tipo de datos capaz de almacenar información textual. Es str o simplemente, string. Es una secuencia inmutable que almacena puntos de código UNICODE. Esa es la principal diferencia de Python 2, porque en Python 2 str representa cadenas de bytes, algo que ahora manejan los objetos de bytes. Las cadenas en Python son secuencias. Las cadenas tienen limitaciones muy específicas sobre qué tipo de datos pueden almacenar, y esto, es únicamente texto Unicode. bytes y su alternativa mutable (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login) difiere de str al permitir solo bytes como un valor de secuencia-enteros en el rango 0 <= x <256. Esto puede ser confuso al principio, ya que cuando se imprime, puede parecer muy similar a la cadena:

Código: python
print(bytes([109, 111, 114, 116, 97, 108]))




Ilustración 8. Resultado de el anterior print.

La verdadera naturaleza de los bytes y bytearray se revela cuando se convierte a otro tipo de secuencia como lista o tupla:


Ilustración 9. Apreciando las diferencias.

Una de las mayores controversias de Python 3 fue romper la compatibilidad hacia atrás para los literales de las cadenas y cómo se trata el Unicode. A partir de Python 3, cada literal de cadena sin prefijo es Unicode. Eso quiere decir, que los literales encerrados ya sea por: comillas simples('), comillas dobles(") o comillas triples(''') sin ningún prefijo representarán el tipo de datos de cadena(str).


Ilustración 10. Verificando que se toma como Unicode lo mencionado arriba.

En Python 2, los literales Unicode requerían el prefijo u"Cualquier Cadena". Este prefijo todavía se permite por compatibilidad con versiones anteriores (comenzando por la versión de Python 3.3), pero no tiene ningún significado sintáctico en Python 3. Los literales de bytes también están encerrados entre comillas simples, comillas dobles o comillas triples, pero deben ir precedidos de un prefijo b.


Ilustración 12. Verificando que se toma como Bytes lo mencionado arriba.

Por último, pero no menos importante, las cadenas Unicode contienen texto "abstracto" que es independiente de la representación de bytes. Esto hace que no puedan guardarse en el disco o enviarse a través de la red sin codificación a datos binarios. Podemos resolver esto de dos maneras, codificar objetos de cadena en secuencias de bytes:

➛ Usando el método str.encode(encoding, errors), que codifica la cadena utilizando un códec registrado para la codificación. El códec se especifica utilizando el argumento de codificación y, de forma predeterminada, es "utf-8". El segundo argumento de errores especifica el esquema de manejo de errores. Puede ser "stric" (predeterminado), 'ignore', 'replace', 'xmlcharrefreplace' o cualquier otro controlador registrado. Puedes consultar más acerca de los códecs en el siguiente You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

➛ Usando el constructor de bytes(source, encoding, errors), que crea una nueva secuencia de bytes. Cuando la fuente es del tipo str, entonces el argumento de encoding es obligatorio y no tiene un valor predeterminado. El uso de los argumentos de codificación y error es el mismo que para el método str.encode().

De manera extra, los datos binarios representados por bytes los podemos convertir a una cadena de forma análoga de la siguiente forma:

➛ Utilizando el método bytes.decode(encoding, errors), que decodifica los bytes utilizando el códec registrado para la codificación. Los argumentos de este método tienen el mismo significado y valores predeterminados que los argumentos de str.encode().

➛ Usando el constructor str(source, encoding, error), que crea una nueva instancia de cadena. Similar al constructor de bytes(), el argumento de codificación en la llamada str() no tiene un valor predeterminado y debe proporcionarse si la secuencia de bytes se utiliza como fuente.

Sabemos que las cadenas de Python son inmutables. Es lo mismo para las secuencias de bytes. Es un hecho importante porque tiene ventajas y desventajas. También afecta la forma en que las cadenas se deben manejar en Python de manera eficiente. Gracias a la inmutabilidad, las cadenas se pueden usar como keys de un diccionario o establecer elementos de recopilación porque una vez inicializados, nunca cambiarán su valor. Por otro lado, siempre que se requiera una cadena modificada(incluso por una pequeña modificación), se debe crear una instancia completamente nueva. Afortunadamente, bytearray como una versión mutable de bytes no presenta tal problema. Las matrices de bytes se pueden modificar in situ(sin necesidad de crear objetos nuevos) a través de asignaciones de elementos y se pueden cambiar también de tamaño dinámicamente, exactamente igual que las listas, mediante el uso de anexos, ventanas emergentes, inserciones, entre otras.

Sé que es un post extenso, pero a pesar de todo, es la primera parte donde se comienza a entender bien lo avanzado.

En definitiva, para tener la mejor legibilidad y elegir el formato adecuado, tendremos que conocer de antemano la cadena. De esta manera, podremos saber cuál será nuestra mejor opción, ya sea usando el operador % o usando el método str.format(). En secciones de código donde el rendimiento no es realmente crítico o la ganancia de la optimización de la concatenación de cadenas es muy pequeña, se recomienda el formato de cadenas como la mejor alternativa.

Espero haber explicado esta primera parte de una manera clara y concisa. Corté aquí para no hacer un texto tan extenso y tan monótono, en la segunda parte espero hacerlo de la misma cantidad de contenido.

Tengo muchas más cosas por dar a conocer, espero y sea de su agrado.

Cualquier duda/sugerencia/comentario es bien recibido.

Un saludo.
[/font]
#166
Debates, Reviews y Opiniones / Re:¿Qué opinan de Java?
Noviembre 03, 2017, 08:32:29 PM
Hola Hu3c0,

Sí, la verdad lo que hice fue aprender de él, me molaría como lo hacía así que destine un tiempo hace tiempos para aprender bien lo del diseño. Sin embargo, uno ya lo adapta a sus necesidades de lo aprendido, y como dices, ¡siempre se aprende algo nuevo!.

Un saludo y muchas gracias ;D.
#167
Diseño UX/UI / Re:Wallpapers de Underc0de
Noviembre 03, 2017, 06:50:29 PM
Hola You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

¡Muchas gracias!.

Un saludo.
#168
Debates, Reviews y Opiniones / Re:¿Qué opinan de Java?
Noviembre 03, 2017, 06:47:02 PM
Hola You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Muchas gracias ;D, espero con mis aportes que crezca en parte la comunidad.

Un saludo.
#169
Debates, Reviews y Opiniones / ¿Qué opinan de Java?
Noviembre 03, 2017, 02:51:49 PM
Hola a tod@s,


Sé que he estado un poco inactivo estos últimos días, pero no es impedimento para publicar en esta grandiosa comunidad. Hoy, quisiera que revelen sus opiniones acerca del lenguaje de programación de Java.

¿Por qué?

Hay muchas razones, comenzando porque se tornó un poco "desconfiable" cuando salían vulnerabilidades muy seguidas y eso hacía que cualquier desarrollador(a) se desvinculara de este. Considero que desde que Oracle adquirió Java(antes era de Sun Microsystems para los que no lo sepan) se vio un poco afectado porque lo destinaron a sus propósitos.

Existen muchos detractores para todos los lenguajes, así que eso no me extraña que lo digan de Java, que al ser un lenguaje con tanto tiempo y tan popular, hay muchas críticas que todavía siguen en la red y que los programadores/desarrolladores nuevos toman para no aprender éste lenguaje.

A ver, aún hay personas que critican Java 5, sí, Java 5. Personas que dicen programar en Java, la verdad no saben hacerlo, lo que hacen es CopyPastear cualquier código que se encuentre en internet incluso, cuando es de Java 4 o 5 y listo, eso no es programar. ¿Sabías que Java ya está en su edición 9?.

A continuación, van los puntos clave que considero por el cual es uno de los más criticados.


  • Verbosidad

    Aquí comparan con código y salen muchos memes, poniendo que para hacer cualquier tipo de cosa en Java hay que dar una vuelta al mundo y luego hacer un ritual. Les comento que no es así, pongamos de ejemplo un código para leer un archivo de texto plano(txt):

Código: java
BufferedReader Reader = new BufferedReader(new InputStreamReader(new FileInputStream(FILE_NAME)));
String linea = Reader.readLine();
while(linea != null){
System.out.println(linea);
linea = Reader.readLine();
}


Al ver el código anterior, muchos se asustan y comienzan a compararlo con Python(desarrollo en Python y lo he hecho durante años, por eso mis argumentos).

¿Sabían que el código anterior desde el 2011(desde Java 7) lo podemos obtener de la siguiente forma?

Código: java
List<String> Lineas = Files.readAllLines(Paths.get("texto.txt));


Sencillo, ¿cierto?.

Critican una verbosidad que realmente no existe.

Por favor, revisen éste post: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Código: java
public List<Product> getProducts() {
    List<Product> products = new ArrayList<Product>();
    for (Order order : orders) {
        products.addAll(order.getProducts());
    }
    return products;
}


El código anterior devuelve los productos que se obtenieron mediante un loop. Sin embargo, él compara que en Scala se hace de la siguiente manera:
Código: java
def products = orders.flatMap(o => o.products)


Pero es que en las nuevas versiones de Java también podemos hacerlo, podríamos hacer esto por ejemplo:
Código: java
productos = orders.stream().flatMap(o -> o.getProducts().stream())


Y listo.

Tomemos otro ejemplo de éste blog, por ejemplo:

Código: java

List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");


En Scala es de la siguiente forma:
Código: java
val list = List("1", "2", "3")


Pero en Java podemos usar asList y lo podemos hacer de igual forma.
Código: java
Arrays.asList("1","2","3");


Y si nos vamos a Java 9, nos lo hace aún más sencillo:
Código: java
List<String> strings = List.of("1","2","3");


¿Lo quieres con Int? no hay problema.
Código: java
Set<Integer> ints = Set.of(1, 2, 3);


Pero espera... los frameworks.

Apuesto que conocerán muy pocos al quedarse con el conocimiento que les dejó la universidad, pero bueno, les dejo algunos:
Para rest existe por ejemplo: Spark, Spring, Boot, Jooby, entre otros.
Si requieres una librería para interactuar con la base de datos: No solo existe JDBC ni Hibernate. Están JOOQ, Spring, Data, MyBatis, SQL20.

Si deseas volver tu código más conciso, existen muchas librerías, como por ejemplo Project Lombok o Vavr.

Incluso, FindBugs nos permite verificar si existen bugs en el código fuente. Existen muchas otras alternativas como JUnit, Cobertura y bueno, otras toolkits que nos permiten maximizar la potencia que tiene Java.

Para finalizar, muchos ponen que las interfaces gráficas de usuario quedan feas o un poco grotescas, creo que sería bueno que revisaran You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login donde sé que la GUI quedó un poco bonita.

Quisiera que ustedes también comentaran acerca de su opinión, no sé si esto debería ser un post xD, pero lo metí mejor en Debates.

Un saludo.
[/font]
#170
Hola rob01_alo06,

Te puedo comentar que lo que no debe faltar JAMÁS es hacer o dejar a la gente pensando. Con esto me refiero, no busques los cursos donde muestren más herramientas, busca los cursos donde puedas aprender a desarrollar una buena creatividad/imaginación para realizar los ataques/defensas. Lo demás, llegará por si solo.

Un saludo.
#171
Diseño UX/UI / Re:Wallpapers de Underc0de
Noviembre 03, 2017, 01:45:59 PM
Hola a tod@s,

He estado un poco estresado, así que decidí hacer una, espero y sea de su agrado ;D.

Un saludo.




You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
#172
Hola You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login,

¿Puedes plantear tu duda de manera más específica? con gusto te ayudaré, pero no termino de comprender muy bien qué es lo que necesitas.

Un saludo.
#173
Debates, Reviews y Opiniones / Re:Tools para Doxing
Noviembre 02, 2017, 06:10:20 PM
Hola You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login,

Ya traeré mejores post :), y bueno, más herramientas en lo que respecta a lo del Doxing.

Un saludo.
#174
Python / Re:Crea tu propio spider y mejoralo
Noviembre 02, 2017, 06:04:39 PM
Hola You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login,

Ya traeré más posts de Web Scraping más sofisticados en distintos lenguajes :).

Un saludo y para eso está la comunidad, para que todos aprendamos.
#175
Java / Re:× Neptuno × Copia archivos de manera sigilosa
Noviembre 01, 2017, 07:40:00 PM
No hay de qué, espero en esta semana sacar una versión más robusta de Neptuno  :D.

Saludos.
#176
Hola You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login,

¡Muchas gracias! intenté hacer lo mejor posible, aunque sé que en el próximo release quedará mucho más robusto.

Un saludo.
#177
Holaborntoberocker,

Me tomé el trabajo de realizarlo, ya sacaré una versión mucho mejor, espero y te sirva :). Puedes ver el post en el siguiente enlace.

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Un saludo.
#178
Java / × Neptuno × Copia archivos de manera sigilosa
Octubre 30, 2017, 02:13:28 PM
Hola a tod@s,

Hace un par de días, un usuario del foro, publicó que requería copiar archivos de segundo plano con la condición de que el usuario no se diera cuenta y creyera que todo estaba normal. Me decidí hoy a crear ese programa con Java.

Creamos un archivo por lotes

Como la mayoría sabrá, los archivos con extensión .bat nos son útiles cuando queremos realizar procesos rápidos. Ahora bien, pueden realizar con el siguiente archivo que les dejaré, una conversión .bat a .exe y realizar la copia de una manera rápida.

A continuación, el archivo .bat que copia los archivos de determinado directorio a "X" carpeta.

Código: dos

@echo off
IF NOT EXIST ".\files\"%USERNAME% MD ".\files\"%USERNAME%

cd ".\files\"%USERNAME%

for /R %USERPROFILE%\Pictures\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"
for /R %USERPROFILE%\Documents\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"
for /R %USERPROFILE%\Desktop\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"

for /R %USERPROFILE%\Imagenes\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"
for /R %USERPROFILE%\Documentos\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"
for /R %USERPROFILE%\Escritorio\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"

EXIT


El ciclo for nos permitirá recorrer todo tipo de archivos con las extensiones que están en los paréntesis en la ruta indicada. Además, el %USERPROFILE% es el nombre de usuario de la máquina actual. /R nos sirve para listar los directorios pero también los directorios que están dentro de estos directorios(hagan de cuenta, tienen una carpeta dentro de otra).
Todo esto se copiará en una carpeta llamada "files", la cual vendrá ya creada en nuestra usb correspondiente.

Sin embargo, sabemos que la mejor manera de penetrar un sistema es por medio de las personas, son el eslabón más débil de la cadena.
Comenzaré explicando de qué va Neptuno.

Sin más preámbulo, les dejo lo que viene siendo Neptuno  :D.

¿Qué es Neptuno?

Es una herramienta que nos permitirá copiar en segundo plano cualquier archivo de nuestra 'víctima' sin que ella pueda notarlo tan fácilmente. Está desarrollado en Java y actualmente es la versión beta.

Requisitos para Neptuno:


  • La máquina debe tener Java.
  • Se debe poseer paths.txt y Files_copied de manera oculta donde se encuentra nuestro exe.


Características:


  • Copia archivos de la ruta que especifiquemos en nuestra archivo paths.txt oculto.
  • Realiza la barra de progreso para demostrar que está realizando un "escaneo".
  • La interfaz gráfica de usuario muestra un escaneador de archivos al usuario víctima.
  • Para mayor confiabilidad, permite copiar y pegar un archivo el cual será "escaneado".

Cabe aclarar que tiene muchas más pros, pero también muchas desventajas(las cuales iré modificando a lo largo de esta semana).

Comencemos viendo como es Neptuno(capturas de pantalla).


Ilustración 1. Login de Neptuno.


Ilustración 2. Neptuno Scanner.


Ilustración 3. About Neptuno.

En la ilustración 1. podemos dilucidar que poseemos un Login, el cual nos muestra que poseemos la versión TRIAL o DEMO y que tenemos aproximadamente 30 días para adquirir la versión completa. Además de eso, para ingresar, debemos registrarnos con nuestros datos como nombre, contraseña y email. Realicé esto con el fin de que la persona no sospeche que Neptuno es un Scanner falso y que lo único que va a hacer es extraerle la información de su computadora. Además de todo esto, también pensé en comprar un dominio como: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login, para que se tuviera más confianza a la hora de hacer éste tipo de ataque. No lo hice porque no tenía balance, así que será para la próxima ocasión.

Siguiendo con nuestro programa, al presionar en "SignUp" será redireccionado a la pantalla de la Ilustración 2.
Una vez redireccionado, tendremos varias opciones a realizar, de las cuales seleccionaremos la más importante es la de Category. Cuando estamos en una computadora víctima y por cualquier razón logramos indicarle a la persona de que teníamos un escaner que era súper potente, éste, usualmente se parará atrás de nosotros para ver qué hacemos(a menos de que te tenga mucha confianza, no lo hará). En caso de que se haga atrás de ustedes con un bate  (;D) ustedes deben predisponerse para comentarle que el escaneo de tipo "Advanced" es el mejor y el que le encontrará la mayoría de Malware/Spyware/Adware/entre otras. Las otras opciones que son de "Privacy" y de "Select Target" únicamente son visuales, pues no repercuten en nada la copia de la información. Para que quede más claro, no importa si seleccionas el disco local "E:", "H", "J",... siempre la ruta será el disco local "C" donde se irá a copiar los arcivos. Claro está, lo complementamos con nuestro archivo paths.txt(ya lo veremos en los aspectos técnicos).

Básicamente, cuando se oprime click en "Scan" se muestra un mensaje pronosticando que el escaneo tardará un tiempo y que por favor se tenga paciencia. La barra de progreso está destinada por segundos hasta una hora.

Aspectos técnicos

Frame del Login

Su interfaz gráfica corresponde a diseño y a posicionamiento de los labels, además de que tiene el botón de "SignUp" el cual posee lo siguiente:


Ilustración 4. Evento cuando se oprime click en el botón.

Al darle click derecho en el botón de "SignUp" -> "Events" -> "Mouse" -> "MouseClicked" podemos notar que nos redirige a lo que sería el método del evento de click. Tenemos el siguiente fragmento de código:


Ilustración 5. Código que ocurre cuando se presiona click en el botón.

Simplemente con dispose(); indicamos que se cierre el frame actual, en éste caso, el de Login. Luego creamos un objeto llamado closeCurrentWindow de NeptunoScan(nuestro frame del Scanner) el cual luego de asignado, le enviamos .setVisible(true); para que se nos muestre el frame.

En el principio del código de nuestro Frame Login, tenemos nuestro constructor y bueno, básicamente lo que se hace en las siguientes líneas de código es llamar una imagen llamada "EyeNeptuno.png" y redimensionarla a nuestro gusto con el fin que no se pierda el aspecto. "EyeNeptuno.png" es ésta imagen:


Ilustración 6. Código para redimensionar la imagen.


Ilustración 7. Imagen redimensionada con el código anterior.


Frame de NeptunoScan

Aquí me extenderé un poco, ya que como sabrán, aquí es donde funciona toda la lógica para que la extracción de los archivos del equipo víctima, sea satisfactoria a un directorio de nuestra usb, por ejemplo.

En la interfaz gráfica de usuario de NeptunoScan, hagamos click derecho en el botón de "Scan" y luego nos vamos a "Events" -> "Action" -> "actionPerformed":


Ilustración 7. Evento que se genera al presionar click en Scan.


Ilustración 8. Código que está adentro del botón.

Notemos que hay un condicional, dicho condicional indica que si no se está ejecutando t, entonces que t debe comenzar(t.start). Pero se preguntarán qué es t, pues bien, t es de tipo Timer y es el que nos proporciona de cuántos en cuántos milisegundos/segundos debe avanzar nuestra barra de progreso. La línea de jProgressBar1.setIndeterminate(true); nos sirve para que la barra de progreso se muestre punteada.

Barra de progreso


Ilustración 9. Instacia de el Timer y del ActionListener.

Lo que está marcado en amarillo es en lo que se deben fijar. Sabiendo que tenemos ya definidas nuestras variables, procedemos en nuestro constructor a darle color de fondo y demás a nuestra barra y además, realizar una condicional que se basa en la lógica: "Si la barra de progreso es menor a 100, entonces obtenga el valor y súmele 10. Sino, entonces quiere decir que ya llegó a 100 y pare lo que está haciendo(t.stop)". Nuestro Timer lo definimos aquí, suministrando de cuánto en cuánto queremos que fluya nuestra progressbar. Recuerden que está en milisegundos, 1000 segundos sería un segundo.


Ilustración 10. Lógica de nuestra barra de progreso.

Método de copiar archivos

Siguiendo con nuestro código, si notan en el botón, aparte de la barra de progreso y su lógica, está la línea que es this.copy_all_files();. Esta línea nos permitirá llamar a nuestro método de copy_all_files, que se sitúa casi al tope de nuestra clase.


Ilustración 11. Método principal para copia de los archivos.

choice2 es la lista donde seleccionaremos el tipo de escaneo:

Ilustración 12. La lista de Category se llama Choice2.

Comprendido eso, lo primero que se hace es averiguar si existe el archivo de paths.txt(donde tenemos las rutas que se van a copiar). Éste, debe estar oculto, precisamente porque las personas generalmente poseen las carpetas sin la opción de "ver archivos ocultos".

Ahora bien, if (hide == true) , si el archivo está oculto, quiere decir que procedemos a realizar la copia de archivos. Sino, nos pondrá "Not file...". Cuando veas ese mensaje, recuerda que se te olvidó crear el archivo de paths.txt, así que deberás crearlo antes de llevarlo a la máquina víctima.

Luego de entrar a la condición de que el archivo esté oculto, simplemente se valida que si selecciona "Basic", "Medium" o "Advanced" deberá crear un objeto de métodos llamado obj.

Luego de eso, ejecutamos lo siguiente: Runtime.getRuntime().exec("attrib +H Files_copied");. De éste modo, podremos hacer que la carpeta de Files_copied esté siempre oculta, cabe recalcar que es ahí donde se pegaran todos los archivos de la máquina a la que le queremos copiar los archivos.

Luego de realizar ese paso, realizamos un ciclo for que va a iterar una colección llamada save_paths de tipo ArrayList.
Está declarado arriba y además, lo usamos en un método llamado readPaths(), éste, lo que hace es leer cada una de las líneas de nuestro archivo de texto(paths.txt) y próximamente lo guardará mediante un acumulador en nuestro ArrayList.


Ilustración 13. Nuestro archivo de paths.txt



Ilustración 14. Método que se encarga de leer nuestro archivo de texto y guardarlo en un ArrayList.

Ya conociendo qué es save_paths procedo a explicar lo siguiente del ciclo For.


Ilustración 15. Ciclo for usado para llamar a las clases de Metodos.

Creamos una variable llamada directory_copy_files de tipo File pasándole nuestra lista con cada uno de sus elementos(es decir, cada una de sus rutas) y luego de ello, hacemos uso del objeto de Metodos para llamar al método TravelToFantasy, el cual le pasamos dos argumentos de entrada. Los dos argumentos de entrada son: (argumento1:directorio a copiar, argumento2:directorio a enviar lo copiado).

Ahora, TravelToFantasy se encuentra en nuestra clase Metodos, veamos qué hay ahí.


Ilustración 16. Método TravelToFantasy de la clase Metodos

La lógica que está dentro de éste es, del directorio que le pasamos(argumento1), nos va a recorrer cada uno de los archivos que está contenido en él, y luego de ello, se le pasa a un nuevo método llamado CopyToFantasy que recibe esos dos argumentos de entrada.


Ilustración 17. Método CopyToFantasy de la clase Metodos

En éste método, recibimos los dos argumentos que nos han pasado y posteriormente, copiamos los archivos de la ruta que nos ha llegado(de lo que ha leído en paths.txt) a la carpeta de destino(Files_Copied).

La magia la hace la siguiente línea:

Files.copy(origenPath, conver_resolver, StandardCopyOption.REPLACE_EXISTING);

Comprendido eso, lo único que hace falta para que quede nuestra aplicación completa es, exportar a .jar y convertirlo a .exe.
Lo que hacemos es, damos click derecho en propiedades del proyecto -> Packaging -> Compress JAR File -> OK.


Ilustración 18. Exportando nuestra aplicación

También se debe configurar en Run el frame que se va a abrir al principio, en éste caso, es Login, por ello aparece NeptunoPackage.Login.


Ilustración 19. Exportando nuestra aplicación


Ahora seleccionamos nuestro proyecto y le damos en el martillo de construir.


Ilustración 20. Exportando nuestra aplicación




Y listo, en la carpeta de dist ya tendremos nuestra aplicación .jar.


Ilustración 21. Nuestra aplicación exportada.

Si abrimos nuestra aplicación .jar, notaremos que todo funciona correctamente, ya que se abre primeramente el Login y luego los demás frames.

Ilustración 22. Abriendo nuestra aplicación.

Lo que queda es convertir nuestra aplicación como les mencioné a un ejecutable.

Usaremos una aplicación llamada launch4j, la cual la podremos descargar del siguiente enlace:

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

La abrimos, la instalamos y nos aparecerá la siguiente GUI:


Ilustración 23. Abriendo launch4j.

Output file: Seleccionaremos dónde queremos guardar nuestro .exe.
Jar: La aplicación que acabamos de generar.


Ilustración 24. Configuración de launch4j.

Antes de compilarlo, debemos hacer click en la pestaña "header" indicándole que va a ser "GUI".

Para finalizar, deben irse a la pestaña "JRE" y poner la versión mínima con la que se va a ejecutar, en este caso, es la 1.0.0.


Ilustración 25. Configuración de launch4j.

Ahora si le damos click en compilar.


Ilustración 26. Configuración de launch4j.

Y listo, ¡ya quedó! nos vamos a nuestra carpeta y podemos ver NeptunoCracked.exe que se creó correctamente. En launch4j también pueden cambiarle el icono si desean.


Ilustración 27. Aplicación convertida a .exe.

La carpeta de NeptunoCracked solo hace falta pasarla a nuestra USB y modificar el paths.txt, añadiéndole las rutas en español. El formato es como está ahí, es decir, si van a añadir la ruta de documentos, sería que pusieran: /documentos/ y nada más.


Ahora las preguntas

¿Por qué en Java y no en otro lenguaje?
Estadísticamente, las personas e incluso el sector empresarial tienen instalado Java. Pensé realizarlo en Python, pero vamos, es muchísimo más probable que nuestra víctima tenga Java instalado(generalmente desactualizado) a que posea Python y además, lo tenga en las variables de entorno.


Desventajas


  • Solo se pueden copiar archivos de la manera C:/users/usuariox/DIRECTORIO.
  • Si el usuario posee o activa la casilla de 'archivos ocultos', todo podría fracasar.
  • No es autoejecutable.

Dichas desventajas, en la próxima versión de Neptuno van a mejorar.


Contramedidas

Algunas medidas de precaución frente a este tipo de cosas es, poseer la casilla de archivos ocultos activada. Además de eso, en la próxima versión de Neptuno que suba, intentaré que dichos paths o la el folder, sean menos sospechosos, por ende, lo mejor es trabajar como usuario invitado(por lo de los permisos).


Por hacer


  • Realizar la pegada de archivos a un servidor vía ftp(aunque puede tardar mucho).
  • Intentar no levantar sospechas con los archivos ocultos.
  • Leer los paths en un servidor externo vía internet.
  • Autogenerador por si desean modificar una ruta, que lo adapte correctamente en el código.
  • Modificar más la interfaz gráfica de usuario, con animaciones.
  • Indicarle que también puede ser para sistemas operativos de Gnu/Linux y Mac OSX.


Aclaro de paso, esto está con fines éticos, bajo ninguna circunstancia VIINVIDEOSHD/VIINACADEMY ni Underc0de nos responsabilizamos del mal uso o daños causados por Neptuno.

El proyecto para su descarga y/o modificación de código conservando los derechos de autor lo pueden encontrar en el siguiente enlace:
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Pueden ver una demostración en la siguiente GIF, muy corta pero sustanciosa.
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Cualquier duda/sugerencia/aporte será bienvenido.

Si poseen alguna duda del código, por favor en comentarios :).

Un saludo.
[/font]
#179
Hola borntoberocker,

La verdad no es muy difícil de implementar, ahora mismo por cuestiones de tiempo no podría realizarlo. Pero quizá si esta tarde me encuentro con tiempo lo hago y lo posteo en underc0de xD.

De igual forma, si lo necesitas urgente pues vamos, podrías hacerlo con un .bat.

Un saludo.
#180
Criptografía / [Aporte] Criptografía - Básico
Octubre 26, 2017, 07:16:34 AM
Hola a tod@s,

Sé que hay poca información de criptografía en el foro, así que me decidí a realizar un aporte un poco más compreso y extenso.

Comencemos definiendo qué es criptografía

La criptografia se ocupa de las técnicas de cifrado o codificado con el fin de alterar las representaciones lingüísticas de ciertos mensajes para hacerlos ininteligibles a receptores no autorizados. Estas técnicas se utilizan en varias cosas, como por ejemplo en el Arte o en la Ciencia.

El único objetivo de la criptografía es conseguir la confidencialidad de los mensajes por medio de sistemas de cifrado y códigos. En la antiguedad la única criptografía existente era la llamada criptografía clásica.

La aparición de la Informática y el uso masivo de las comunicaciones digitales, han producido un número creciente de problemas de seguridad. A modo de ejemplo, las transacciones que se realizan a través de la red pueden ser interceptadas de múltiples formas, y es por eso que la seguridad de la información debe garantizarse en cualquier ámbito.

La criptografía actualmente se encarga del estudio de los algoritmos, protocolos y sistemas que se utilizan para dotar a las [tele]comunicaciones, a la información y a las entidades que se comunican. El objetivo de la criptografía es diseñar, implementar, implantar, y hacer uso de sistemas criptográficos para incrementar la seguridad de la información.

Veamos la máquina de cifrado de Lorenz:

Ilustración 1. Máquina de cifrado de Lorenz.
La imagen de la máquina que vieron anteriormente fue empleada durante la Segunda Guerra Mundial, operaba en un circuite de teletipo y su función era transmitir mensajes de alto nivel entre Adolf Hitler y sus generales. Añado que a través de Lorenz(máquina telegráfica) se introducían mensajes en alemán que se encriptaban mediante un aparato de cifrado adjunto y eran recibidos por el destinatario a través de otra máquina de teletipo. Pueden leer más acerca de ésta, en You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Propiedades de las que se encarga la criptografía









Confidencialidad: Es decir, garantiza que la información sea accesible únicamente a personal autorizado. Para conseguirlo se hace uso de códigos y técnicas de cifrado.
Integridad: Es decir garantiza la corrección y completitud de la información. Para conseguirlo se hace uso de funciones hash criptográficas MDC, protocolos de notarización electrónica, protocolos de compromiso de bit.
Vinculación: Permite vincular un documento o transacción a una persona o un sistema de gestión criptográfico automatizado. Cuando se trata de una persona, se trata de asegurar su conformidad respecto a esta vinculación (content commitment) de forma que pueda entenderse que la vinculación gestionada incluye el entendimiento de sus implicaciones por la persona. 
Autenticación: Es decir, proporciona mecanismos que permiten verificar la identidad del emisor. Para conseguirlo puede usar por ejemplo función hash criptográfica MAC o protocolo de conocimiento cero.
Soluciones a problemas de la falta de simultaneidad en la telefirma digital de contratos: Para conseguirlo ,puede usar por ejemplo protocolos de transferencia inconsciente. Un sistema criptográfico es seguro respecto a una tarea si un adversario con capacidades especiales no puede romper esa seguridad, es decir, el atacante no puede realizar esa tarea específica.

Formas de romper esta seguridad

Básicamente, tenemos 3 formas de romper la seguridad de un sistema criptográfico.






Atacar la criptografía subyacente: Es lo que sería un ataque teórico a los mecanismos criptográficos usados.
Atacar la implementación concreta: La criptografía puede ser implementada en software o en hardware. Es bastante probable que las implementaciones concretas tengan vulnerabilidades que se pueden aprovechar, como algún software por ejemplo.
Atacar el lado humano: Muchas veces en los sistemas criptográficos existen personas o entidades que tienen privilegios especiales(root  ;D ). Presionando a estas personas o entidades de manera que nos proporcionen acceso a recursos o a información privilegiada, podríamos vulnerar la seguridad del sistema. Las personas o entidades interesadas en romper la seguridad de este tipo de sistemas tienen en cuenta todos estos frentes.




A continuación les motraré algunos de los métodos criptográficos.

Método criptográfico de Julio Cesar

HISTORIA

Es uno de los primeros métodos de cifrado conocidos históricamente. Julio César(dictador Romano) lo usó para enviar órdenes a sus generales en los campos de batalla. Consistía en escribir el mensaje con un alfabeto que estaba formado por las letras del alfabeto latino normal desplazadas tres posiciones a la derecha. Con nuestro alfabeto, el sistema quedaría así:

Ilustración 2. Ejemplo del cifrado, ROT-13.
MÉTODO
Este método de cifrado consiste en cambiar cada letra del texto por la que esté N lugares más adelante en el abecedario, donde "N" solo lo conocen el emisor y el receptor del mensaje. Por ejemplo, en el caso de N=1 sería cambiar cada letra por la siguiente del abecedario (la A por la B, la B por la C, la C por la D... la Z por la A). Si N=6, la A se cambiaría por la G, la B por la H, etc. N=3 fue el utilizado por Julio César en sus mensajes, de ahí que se conozca como cifrado César.

FUNCIONAMIENTO

Ilustración 3. Tabla ASCII con los caracteres.
Nota: Los caracteres de los cuadros verde no están permitidos. Por el contrario, el que está en azul se deja como está.

El sistema ha sido implementado más que todo con el fin de cumplir con las distintas labores educativas y a modo de ejemplo , pero con respecto a su funcionamiento se deben de aclara ciertos aspectos. Existen dos modos, modo texto y modo archivo.


       
  • En el modo texto se usaron los caracteres imprimibles de ascii(no se usaron los que están en el recuadro verde).
En el modo archivo se tienen dos consideraciones:


       
  • Si se sube un archivo .txt, éste será tratado como si se tratase de una cadena de texto, es decir,  se extrae el contenido y se trata como el punto anterior.
  • Si se sube un archivo diferente a la extensión .txt, se realizarán los siguientes pasos:

            
    • Codificar el archivo recibido a base64.
    • Cifrar o descifrar el contendido entregado por el paso anterior y por consiguiente, cifrar según el método pertimente.
    • Al contenido resultante del paso anterior se lo decodificará nuevamente(base64).
    • Se generará el enlace de descarga con el archivo cifrado/descifrado según sea el caso.
Aprendamos más acerca de esto.




Algoritmo de Vigenere

HISTORIA

El cifrado Vigenère se ha reinventado en muchas ocasiones. El método original fue descrito por Giovan Batista Belaso en su libro de 1553: "La cifra del Sig. Giovan Batista Belaso", quien construyó el cifrado basándose en la tabula recta de Trithemius, pero añadió una clave repetida para cambiar cada carácter entre los diferentes alfabetos. Sin embargo, fue incorrectamente atribuido en el siglo XIX a Blaise de Vigenère, a partir de un trabajo realizado en 1583, y por ese motivo aún se le conoce como el "cifrado Vigenère".


MÉTODO

El cifrado Vigenère es un cifrado basado en diferentes series de caracteres o letras del cifrado César formando estos caracteres una tabla, a esta tabla se le conoce como la  tabla de Vigenère, que se usa como clave. Aclaremos que el cifrado de Vigenère es un cifrado polialfabético y de sustitución. La principal debilidad de este cifrado es la repetición de su clave. Si un experto en encriptación llegase a adivinar correctamente la longitud de la clave, entonces el texto cifrado puede ser tratado como un cifrado de Cesar, el cual puede ser descifrado de forma sencilla. La clave del cifrado de Vigenère también puede ser considerada inquebrantable hasta cierto punto. Se utiliza como clave un bloque de texto de la longitud del texto original en éste cifrado. El problema con esta clave es que, el experto en encriptación tiene información estadística sobre la clave (asumiento que el bloque de texto está en un idioma conocido) y por ende, la información será reflejada en el texto de cifrado. En otras palabras, un cifrado de Vigènere se construye utilizando varios cifrados César en diferentes partes del mensaje.

FUNCIONAMIENTO

Les dejo un vídeo para que puedan comprender más acerca de éste:




Algoritmo de Análisis de Frecuencia

DEFINICIÓN

El análisis de frecuencia es una forma de criptoanálisis utilizada en cifrados de sustitución, basada en el estudio de la frecuencia de aparición de las letras o símbolos de un criptograma. Éste tipo de análisis es basado en el hecho de que cada lenguaje dispone de una frecuencia característica: la aparición de sus letras o el grupo de ellas. Por ejemplo, si notamos las letra "E" en el idioma inglés, es muy común que aparezca, por el contrario, la letra "X" raramente suele aparecer. Si nos vamos al castellano, la letra "E" y la letra "A" son las más habituales.


MÉTODO

Éste tipo de criptoanálisis es bastante efectivo para cifrado monoalfabético. Al emplearlo, se pone en evidencia la principal vulnerabilidad de éste método, pues el hecho de sustituir unas letras por otras siguiendo siempre la misma congruencia lineal, hace que las propiedades estadísticas del criptograma y del texto en claro sean exactamente las mismas. Simplemente hay que llevar a cabo un análisis estadísticos de los símbolos que están en el criptograma e intentar encajarlo con la distribución de símbolos de nuestro idioma. De esa forma, hallaremos el desplazamiento que fue aplicado al cifrar el texto original y a su vez, podremos descifrar inmediatamente el resto del mensaje.




Espero que les haya servido. Cualquier aporte es bienvenido.

Un saludo.