Mostrando las entradas con la etiqueta ubuntu. Mostrar todas las entradas
Mostrando las entradas con la etiqueta ubuntu. Mostrar todas las entradas

miércoles, 11 de febrero de 2015

Como leer Numeros Magicos con C (file signatures)

En esta ocasión aprenderemos a leer los números mágicos de un archivo,esto funciona para saber el tipo de archivo de un archivo,si así como suena ya que algunas ocasiones podemos deducir el tipo de archivo solo por su extension,por ejemplo podemos tener una imagen con este nombre:

imagen.png

Pero que tal si es formato .jpg o incluso un vídeo o audio,esto no es muy importante,para el usuario,pero a la hora de programar algo de bajo nivel o incluso de nivel usuario,por ejemplo una GUI si no seleccionamos el archivo correcto tendríamos un error,por ejemplo un reproductor de música o vídeo que le mandemos una imagen como ruta,esto causaría el cierre de la aplicación o en sistemas débiles el congelamiento de todo el sistema.

Bueno también en ocasiones tenemos archivos sin extensión,con el nombre por ejemplo:

archivo

En Unix si tiene permisos de ejecución lo mas seguro es que sea un programa,pero en ocasiones son archivos multimedia,como dije el usuario no se debe preocupar por esto ya que si tienen un explorador potente como por ejemplo Dolphin de KDE el lee los Magic Numbers y si tenemos una imagen sin extensión la detecta:



Como vemos detecta los archivos,pero si quisiéramos crear un explorador necesitaríamos usar números mágicos y no filtro por extensión.

En esta ocasión vamos a hacer este trabajo usando C,ya que lo vamos a usar en el sistema,si lo quisiéramos usar por ejemplo en Android lo podemos hacer en Java o usando el NDK.

Bien vamos a leer el archivo en modo binario y vamos a leer los primeros 8 bytes que serian 8 char,los primeros 8 char del archivo,luego los vamos a imprimir en pantalla,hay caracteres Hex que no se pueden imprimir asi que solo imprimiremos los que se puedan.


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <ctype.h>

#define BYTES 8 // Numero de bytes

void readFile(char *file); // Funcion que leera el archivo,le pasamos el nombre

int main(int argv,char *argc[])
{
    if (argv>1)
        readFile(argc[1]); // Le pasamos el nombre del archivo que indiquemos en el argumento
    return 0;
}

void readFile(char *file)
{
    char nums[BYTES]; // Definimos un array de n bytes
    int i;
    FILE *fp = fopen(file,"rb"); // Abrimos el archivo en modo binario y lectura
    fread(nums,1,BYTES,fp); // Lemos los primeros n bytes
    for (i=0;i<BYTES;i++) // Recorremos el array
    {
        if (isgraph(nums[i]))  // Si se puede imprimir
            printf("Nums %c\n",nums[i]); // Lo imprimimos
    }

    fclose(fp);
    return;
}


Ahora vamos a usarlo:


Como vemos en el primer archivo use una imagen png con extensión jpg y no hubo problema al detectar el tipo de archivo,en el segundo use un .pdf y efectivamente es .pdf.

Algunos archivos no simplemente van a decir PNG o PDF,por ejemplo el numero magico de un mp3 es ID3:


Algunos números mágicos los podemos encontrar aquí:

https://en.wikipedia.org/wiki/List_of_file_signatures

Y eso nos sirve para definir un array de comprobacion,por ejemplo para el mp3,seria en HEX:

49 44 33

Que solo serian 3 bytes,3 char:

Veamos:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#include <ctype.h>

#define BYTES 8 // Numero de bytes

typedef enum _boolean {FALSE,TRUE} boolean; // Tipo boolean

void readFile(char *file); // Funcion que leera el archivo,le pasamos el nombre

boolean isMp3(char *file); // Funcion para saber si es mp3

int main(int argv,char *argc[])
{
    if (argv>1){

        readFile(argc[1]); // Le pasamos el nombre del archivo que indiquemos en el argumento
        if(isMp3(argc[1])) // Vemos si es mp3
            printf("%s es mp3\n",argc[1]);
        else
            printf("%s no es mp3\n",argc[1]);
    }
    
    return 0;
}

boolean isMp3(char *file)
{
    const int lenNum = 3; // Numero de Bytes
    char nums[lenNum]; // array que contendra los numero magicos
    char id[] = {0x49,0x44,0x33}; // Numeros magicos del mp3
    int i;
    boolean flag = TRUE; // Este sera el valor de retorno
    FILE *fp = fopen(file,"rb"); // Abrimos el archivo
    fread(nums,1,lenNum,fp); // Lemos los primeros 3 bytes
    for (i=0;i<lenNum;i++) // Recorremos el array
    {
        if(nums[i] != id[i]) // Si no son iguales 
        {
             flag = FALSE; // Cambiamos el valor de retorno
             break; // rompemos el bucle
        }
    }
    fclose(fp); // Cerramos el archivo
    return flag; // Regresamos el valor
}

void readFile(char *file)
{
    char nums[BYTES]; // Definimos un array de n bytes
    int i;
    FILE *fp = fopen(file,"rb"); // Abrimos el archivo en modo binario y lectura
    fread(nums,1,BYTES,fp); // Lemos los primeros n bytes
    for (i=0;i<BYTES;i++) // Recorremos el array
    {
        if (isgraph(nums[i]))  // Si se puede imprimir
            printf("Nums %c\n",nums[i]); // Lo imprimimos
    }

    fclose(fp);
    return;
}

Con esa funcion que definimos logramos saber si un archivo es mp3,igual lo podemos hacer con un mp4 solo que wikipedia nos dice que hay dos posibilidades,veamos:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#include <ctype.h>

#define BYTES 8 // Numero de bytes

typedef enum _boolean {FALSE,TRUE} boolean; // Tipo boolean

void readFile(char *file); // Funcion que leera el archivo,le pasamos el nombre

boolean isMp3(char *file); // Funcion para saber si es mp3

boolean isMp4(char *file);

int main(int argv,char *argc[])
{
    if (argv>1){

        readFile(argc[1]); // Le pasamos el nombre del archivo que indiquemos en el argumento
        if(isMp4(argc[1])) // Vemos si es mp3
            printf("%s es mp4\n",argc[1]);
        else
            printf("%s no es mp4\n",argc[1]);
    }
    
    return 0;
}

boolean isMp4(char *file)
{
    const int lenNum = 4; // Numero de Bytes
    char nums[lenNum]; // array que contendra los numero magicos
    char id1[] = {0x22,0x67,0x70,0x35}; // Numeros magicos del mp4
    char id2[] = {0x66,0x74,0x79,0x70}; // Numeros magicos del mp4(otra posibilidad)
    int i;
    boolean flag = TRUE; // Este sera el valor de retorno
    FILE *fp = fopen(file,"rb"); // Abrimos el archivo
    fread(nums,1,lenNum,fp); // Lemos los primeros 4 bytes para probar el primer id
    for (i=0;i<lenNum;i++) // Recorremos el array
    {
        if(nums[i] != id1[i]) // Si no son iguales 
        {
             flag = FALSE; // Cambiamos el valor de retorno
             break; // rompemos el bucle
        }
    }
    if (flag == FALSE) // Si la bandera es FALSE probamos el siguiente id
    {
        flag = TRUE; // Cambiamos el flag a TRUE
        fseek( fp, 4, SEEK_SET ); // Nos movemos 4 bytes a la derecha ya que no nos sirven estos : 00 00 00 nn
        fread(nums,1,lenNum,fp); // Lemos los segundos 4 bytes
        for (i=0;i<lenNum;i++) // Recorremos el array
        {
            if(nums[i] != id2[i]) // Si no son iguales 
            {
                flag = FALSE; // Cambiamos el valor de retorno
                break; // rompemos el bucle
            }
        }
    }
    fclose(fp); // Cerramos el archivo
    return flag; // Regresamos el valor
}

boolean isMp3(char *file)
{
    const int lenNum = 3; // Numero de Bytes
    char nums[lenNum]; // array que contendra los numero magicos
    char id[] = {0x49,0x44,0x33}; // Numeros magicos del mp3
    int i;
    boolean flag = TRUE; // Este sera el valor de retorno
    FILE *fp = fopen(file,"rb"); // Abrimos el archivo
    fread(nums,1,lenNum,fp); // Lemos los primeros 3 bytes
    for (i=0;i<lenNum;i++) // Recorremos el array
    {
        if(nums[i] != id[i]) // Si no son iguales 
        {
             flag = FALSE; // Cambiamos el valor de retorno
             break; // rompemos el bucle
        }
    }
    fclose(fp); // Cerramos el archivo
    return flag; // Regresamos el valor
}

void readFile(char *file)
{
    char nums[BYTES]; // Definimos un array de n bytes
    int i;
    FILE *fp = fopen(file,"rb"); // Abrimos el archivo en modo binario y lectura
    fread(nums,1,BYTES,fp); // Lemos los primeros n bytes
    for (i=0;i<BYTES;i++) // Recorremos el array
    {
        if (isgraph(nums[i]))  // Si se puede imprimir
            printf("Nums %c\n",nums[i]); // Lo imprimimos
    }

    fclose(fp);
    return;
}

Así podemos crear un biblioteca con todas las extensiones para usarlas en un programa.

Eso es todo :D
Leer más...

viernes, 16 de enero de 2015

Como convertir un string a binario con C

Esto es especificamente con C o C++,pero especificamente con C,en este caso hacemos uso del poderoso Union y de punteros:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>

typedef struct _byte { /* Estructuramos 8 bits para un Byte */
    unsigned a: 1;
    unsigned b: 1;
    unsigned c: 1;
    unsigned d: 1;
    unsigned e: 1;
    unsigned f: 1;
    unsigned g: 1;
    unsigned h: 1;
} byte;

typedef union _charbits { /* Unimos un char(caracter) con un Byte */
    char ch;
    byte bits;
} charbits;

void decode(byte b)/* Esta funcion decodifica el char en 8 bits */
{
    printf("%2u%2u%2u%2u%2u%2u%2u%2u  ",b.h,b.g,b.f,b.e,b.d,b.c,b.b,b.a);
}

void readString(const char *str)/* Esta funcion simplemente lee la string como un array de punteros a char y los decodifica char a char con la funcion de arriba*/
{
    charbits word;
    while(*str) 
    {
        word.ch = *str;
        decode(word.bits);
        *str++;
    }
    printf("\n");
}

int main(int argv,char **argc) /* Iniciamos el main */
{
    if (argv > 1)
        readString(argc[1]);
    else
        printf( "Uso : %s <Palabra>",argc[0]);
    return 0;
}

Para compilar metemos el codigo en un archivo por ejemplo:

decode.c


Y compilamos:

gcc -o decode decode.c

./decode "Tiempo de Tux"

 0 1 0 1 0 1 0 0   0 1 1 0 1 0 0 1   0 1 1 0 0 1 0 1   0 1 1 0 1 1 0 1   0 1 1 1 0 0 0 0   0 1 1 0 1 1 1 1   0 0 1 0 0 0 0 0   0 1 1 0 0 1 0 0   0 1 1 0 0 1 0 1   0 0 1 0 0 0 0 0   0 1 0 1 0 1 0 0   0 1 1 1 0 1 0 1   0 1 1 1 1 0 0 0  


Eso es todo.
Leer más...

Como añadir ppa/repos a Ubuntu

En este tutorial aprenderemos a añadir repositorios a ubuntu los conocidos en ubuntu como ppa,esto para instalar programas que no se encuentran en los sources del sistema,nos llamados main,universe,etc.

Para añadir un ppa vamos a launchpad,o al paquete que quieran instalar,en este caso vamos a probar con Shutter:

https://launchpad.net/~shutter

 Vamos a donde dice:

Personal package archives  y PPA for:


Ahora tenemos dos opciones la manera manual y la manera sencilla,veamos ambas:

Manera manual:

Vamos a donde dice Technical details about this PPA:

Seleccionamos la versión de nuestro sistema,en mi caso 14.04:



Copiamos lo que esta en el pre,en este caso:

deb http://ppa.launchpad.net/shutter/ppa/ubuntu trusty main 

deb-src http://ppa.launchpad.net/shutter/ppa/ubuntu trusty main 

Y ahora lo añadimos al sources.list de nuestro sistema:

Para ello abrimos una terminal la buscamos en el menu de programas o tecleamos ctrl+alt+t:

Ahora escribimos:


sudo nombre_de_nuestro_editor_de_texto /etc/apt/sources.list

Por ejemplo:

sudo nano /etc/apt/sources.list

Y añadimos las lineas al archivo,podemos añadir un comentario comenzando la linea con un hash:



Ahora solo guardamos,en este caso:

ctrl+o


ctrl+x

Por ultimo actualizamos las fuentes,pero primero tenemos que añadir las llaves de confianza:


En la pagina vamos abajo de donde estaban los deb,hay algo que dice:

Signing key:
Copiamos el segundo numero ya que esta dividido asi:

numero1/numero2
Copiamos el mas largo y escribimos:

gpg --keyserver keyserver.ubuntu.com --recv-keys numero2 
y
 gpg --export --armor numero2 | sudo apt-key add -  

Ahora si actualizamos:

sudo apt-get update

Y el paquete ya esta listo para se instalado,solo lo buscamos como paquete,con el comando:

apt-cache search paquete
O vemos en la paguina ppa donde dice:

Overview of published packages

Filtrando los resultados para nuestra versión de ubuntu:


Eso es todo para instalar usamos(en este caso shutter):

sudo apt-get install shutter

Como ven no es método rápido,para lo que recomiendo usar este método es solo para ver si el paquete esta disponible para nuestra versión ya que si no es así podemos detener conflictos en los paquetes,o no se instalara simplemente.

Manera automatica o rapida:

Para hacer el mismo procedimiento pero de manera rapida tenemos que añadir la ppa directamente con un comando linux especial para esto.

Primero vamos a la pagina del ppa y a donde dice:

Adding this PPA to your system

Esta un texto en negrita,en este caso como ejemplo usaremos shutter:

ppa:shutter/ppa


Ahora abrimos una terminal,la buscamos en menú de aplicaciones,y escribimos:

 sudo add-apt-repository ppa

En este caso:

sudo add-apt-repository ppa:shutter/ppa
Presionamos enter y actualizamos los repos:

sudo apt-get update

Y listo solo necesitamos buscar el paquete e instalarlo,en este caso:

sudo apt-cache search Shutter

sudo apt-get install shutter

Eso es todo.

Leer más...

lunes, 12 de enero de 2015

Como instalar Android Studio en Ubuntu

Android Studio sigue avanzando y lo mas seguro es que remplace a eclipse y su plugin para el desarrollo android,yo en lo personal me gusta mas eclipse(por la costumbre),pero aun así es buena practica probar las distintas manera de desarrollar en este caso para Android,así que vamos a instalarlo en Ubuntu,en mi caso la version 14.04.

Primero arbrimos una terminal:

ctrl + Alt + T

Ahora añadimos el ppa de Android Studio:

sudo add-apt-repository ppa:paolorotolo/android-studio

Actualizamos los repos:

sudo apt-get update

Y finalmente instalamos:

sudo apt-get install android-studio

Este paquete es un poco extraño ya que no es android studio en si,sino que es un instalador,un pequeño script que instala el paquete original guardado en,por ejemplo:

 https://dl.google.com/dl/android/studio/ide-zips/1.0.1/android-studio-ide-$VERSION-linux.zip

Lo descarga con wget,lo mueve a /opt y crea lo necesario para que se muestre en el menu de aplicaciones y el sistema.

Cuando termine lo podremos ejecutar:



Eso es todo.






Leer más...

jueves, 31 de julio de 2014

Como encriptar carpetas en Linux con GPG

En esta ocasión vamos a aprender como encriptar una carpeta en Linux,en mi caso Ubuntu 14.04 pero lo podemos hacer con cualquier distribucion de Linux,solo necesitamos tener instalada la herramienta GnuPG que quiere decir : GNU Privacy Guard.

Bien en muchos sistemas con Linux ya biene instalado pero en otros no asi que lo verificamos:

Abrimos una terminal y escribimos:

 which gpg; if [[ $? -eq 0 ]]; then echo "Instalado"; else echo "No instalado"; fi

 Si no lo tenemos instalado buscamos como instalarlo para nuestra distribución de Linux,de hecho el programa que vamos a usar es gpg-zip,que se instala junto a gpg,en sistemas como Gentoo no se si se instale por las flags usadas al compilar asi que revisar bien a la hora de instalar.

Tutorial


Vamos a ver un ejemplo,tengo un codigo en C importante:


Ahora voy a encriptar esa carpeta,en mi caso estoy usando Dolphin en mi caso este explorador de archivos cuenta con una Terminal empotrada,asi que solo la abro:



En otro caso abren una terminal y van al destino donde tienen la carpeta a encriptar:

Bien ahora encriptamos,nosotros vamos a usar una frase para volver a desencriptar(cifrado simétrico) este usa CAST5, esa opcion la llamamos con el parametro -c:

El programa,así vamos hasta el momento:

gpg-zip -c 
Ahora solo debemos mostrar el nombre de salida,al igual que otros programas usamos el parametro -o,asi:

-o salida.gpg
Y por ultimo el nombre de la carpeta,en mi caso prueba,asi queda la linea entera:

gpg-zip -c -o salida.gpg prueba
Al ejecutar esto nos pide una contraseña en GUI:


La escribimos y la reafirmamos y con eso nos crea el fichero cifrado:



Con esto podemos borrar la carpeta original,y podemos ver que es fichero cifrado:


Ahora como lo desencriptamos, con el parametro -d seguido del nombre del gpg,en este caso:

 gpg-zip -d salida.gpg
Nos pide la contraseña y vuelve a "crear" el directorio,eso es todo en este caso usamos un cifrado muy común ya que solo usamos contraseña y tar lo que seria como un comprimido con contraseña(no es asi),pero gpg va mas haya con cifrado asimétrico,firmas,etc.

Aqui un script para realizar lo que vimos en esta entrada de una manera facil:

Solo usamos,para desencriptar:

Nombre_script.sh -d nombre.gpg

Para encriptar:

Nombre_script.sh -e carpeta
No cancelar en fase de encriptacion,que borra el folder y no deja respaldo gpg.

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/bin/bash

function decripta()
{
    echo "Desencriptando $1"
    gpg-zip -d $1
    if [[ $! -eq 0 ]];
    then
        echo "Hecho"
    else
        echo "Algo salio mal :("
        exit
    fi
    rm $1
}

function encripta()
{
    echo "Encriptando $1"
    gpg-zip -c -o $1.gpg $1
    if [[ $! -eq 0 ]];
    then
        echo "Hecho"
    else
        echo "Algo salio mal :("
        exit
    fi
    rm -rf $1
}

function help()
{
    echo "Uso : $0 [-e] Encriptar
                   [-d] Desencriptar
                                     Archivo"

}

case $1 in
    -e)
        if [[ $2 == '' ]];
        then
            help;
        else
            encripta $2
        fi
    ;;
    -d)
        if [[ $2 == '' ]];
        then
            help;
        else
            decripta $2
        fi
    ;;
    '')
        help
    ;;
esac

Eso es todo :D
Leer más...

jueves, 10 de julio de 2014

Eliminar Pelota que Rebota en KDE imposible

Este tutorial es para poder eliminar el elemento de la pelota roja en el escritorio de KDE,esta pelota esta bien si queremos darle un toque colorido al escritorio,pero lo feo comienza si la configuramos así:


Con rebote automático y con mucha fuerza de rebote,y ni hablar si la encogemos a un tamaño muy pequeño.

Su eliminación es casi imposible y no solo eso,crea un loop que consume mucho cpu :O

Bien para eliminarla vamos a hacerlo desde la consola Konsole,la abrimos y escribimos:

Antes que nada cerramos lo mas importante que estemos haciendo por si algo sale mal:

Eliminamos el escritorio:

kquitapp plasma-desktop

Editamos la configuración:

Con nuestro editor de texto favorito,por ejemplo vim(desde la misma terminal):

vim ~/.kde/share/config/plasma-desktop-appletsrc

O desde un programa gráfico:

kate ~/.kde/share/config/plasma-desktop-appletsrc &

o

gedit ~/.kde/share/config/plasma-desktop-appletsrc &


Buscamos:

AutoBounceEnabled=true



Y lo cambiamos por

AutoBounceEnabled=false

Reiniciamos plama:

 plasma-desktop

Buscamos la pelota y ahora si la quitamos:


Leer más...

miércoles, 23 de abril de 2014

Como instalar Brackets en Ubuntu 14.04

Brackets es un editor open source para desarrollo web,es de adobe y en teoría es pariente de dreamweaver.

Yo no soy programador o diseñador web pero aun así hay que saber un poco de todo,y si he hecho algunas cosas en HTML5,CSS3,Javascript usando algunas herramientas OpenSource pero hasta ahora este es el que mas me ha gustado(y no es publicidad),simplemente hay que reconocer que este es un gran editor.

Lo que me gusto de este editor es:

Plugins(extensiones),hechos por la comunidad para extender el editor y fácil instalación:



Temas,uno puede programar a blanco y negro pero los temas nos animan mas a trabajar:






Autocompletado de palabras(se extiende a javascript,JQueryMobile gracias a plugins).


Vista previa en vivo:

Cada vez que guardemos(Ctrl+S) recarga la pagina que estamos creando en el editor que abre al iniciar la vista en vivo(el que tengamos configurado en el sistema por defecto):


Vista de imágenes,al colocar una url de una imagen,sea en css,javascript o html,nos da una previsualizacion:





Entre muchas mas cosas.

Tutorial de instalacion:

Bien podemos hacerlo por PPA,con unos simples comandos:

Abrimos una terminal y escribimos:


sudo add-apt-repository ppa:webupd8team/brackets


sudo apt-get update

sudo apt-get install brackets

O podemos hacerlo desde el .deb:

Bajamos el paquete .deb:


http://brackets.io/ 

Luego abrimos una terminal y nos pasamos a la carpeta de Descargas(o donde descargue los archivos su navegador):

cd Descargas

Y escribimos para instalar:

sudo dpkg -i Brackets.*.deb && sudo apt-get -f install
Buscamos en el Dash:





Eso es todo :D

Y recuerda si te sirvió y tienes cuenta de google dale google aya abajo





Leer más...