Autor Tema: Whatsapp Metadata Extractor  (Leído 42235 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado sanko

  • Recién llegado
  • *
  • Mensajes: 30
  • Karma: +2/-1
  • ¿Puedes?
    • Ver Perfil
    • StrikeGeek
Whatsapp Metadata Extractor
« : mayo 14, 2013, 12:16:28 pm »
Código: [Seleccionar]
· WhatsApp Metadata Extractor :
       - main_manage.py (main de consola en forma de cliente)
       - DB_Extractor.py (extrae los metadatos de la BD)
       - metaimg_extractor.py (extrae los metadatos de los .jpg encontrados)


main_manage.py :
Código: python [Seleccionar]
# -*- coding: utf-8 *-*
import DB_Extractor, metaimg_extractor

class WhatsApp_Extractor():

    def __init__(self):
        self.__opt()

    def __opt(self):
        #Uncomment the OPTION that you want to use

        #self.__opt1()  #-> DB METADATA EXTRACTOR
        self.__opt2()  #-> IMG METADATA EXTRACTOR
        #self.__opt3()  #-> BOTH, OPT1 AND OPT2

    def __opt1(self):
        print "DB METADATA"
        print "------------"
        DB_Extractor.DB_Extractor()
        print "------------"

    def __opt2(self):
        print "IMG META"
        print "------------"
        metaimg_extractor.IMG_Meta()
        print "------------"

    def __opt3(self):
        print "DB METADATA"
        print "------------"
        DB_Extractor.DB_Extractor()
        print "------------"
        print "\nIMG META"
        print "------------"
        metaimg_extractor.IMG_Meta()
        print "------------"

WhatsApp_Extractor()


DB_Extractor.py :
Código: python [Seleccionar]
# -*- coding: utf-8 *-*
#Script to extract the metadata from the WhatsApp crypted DB
import sqlite3
from Crypto.Cipher import AES

class DB_Extractor():

    def __init__(self):
        self._manage_do()

    def _manage_do(self):
        try:
            self.__DB_Breaker('msgstore.db.crypt')
            self.__DB_conn()
            self.__SQL_Consulter()
            #Log exporter
        except:
            print "Error starting the script"

    def __DB_Breaker(self, DBPath):
        self.DBPath = DBPath
        #breaking the hash
        f = open(self.DBPath, 'rb')
        key = "346a23652a46392b4d73257c67317e352e3372482177652c"
        #triying to break the hash
        try:
            key = key.decode('hex')
            cipher = AES.new(key, 1)
            decoded = cipher.decrypt(f.read())
            #Saving into a new db file
            try:
                decoded_DB = open('metadb.db', 'wb')
                decoded_DB.write(decoded)
                decoded_DB.close()
                print "metadb.db has been created in the same directory"
            except:
                print "An error has ocurred creating the decoded DB"
        except:
            print "Error decoding the hash"


    def __DB_conn(self):
        #triying to connect with the sqlite database
        try:
            self.conn = sqlite3.connect('metadb.db')
            self.consult = self.conn.cursor()
        except:
            print "An error has ocurred connecting with the SQLite DB"


    def __SQL_Consulter(self):
        #Divided in :
            # Messages
            # Chat_list

        def __Messages():
            #SQLConsult
            try:
                self.consult.execute("SELECT key_remote_jid, key_from_me, \
                remote_resource, status, datetime(timestamp), data, media_url, media_mime_type, \
                media_size, latitude, longitude FROM messages;")

            except:
                print "An error has ocurred doing the SQL Consult"

            def __Shower():
                #Message details
                #nota : parsear status, comprobar si yo envio o recivo

                for data in self.consult:
                    try:
                        print "\nMessages Details:"
                        print "----------------------"

                        if str(data[2]):
                            if str(data[1]) == '1':
                                print "From: me"
                                print "To: %s(group), integrant: %s"%(str(data[0]), str(data[2]))
                            else:
                                print "From: %s(group), integrant: %s"%(str(data[0]), str(data[2]))
                                print "To: me"
                        else:
                            if str(data[1]) == '1':
                                print "From: me"
                                print "To: " + str(data[0])
                            else:
                                print "From: " + str(data[0])
                                print "To: me"

                        print "Status: " + str(data[3])
                        print "Timestamp: " + str(data[4])
                        print "Message: " + str(data[5])
                        print "Media content: %s, type: %s, size: %s"%(str(data[6]), str(data[7]), str(data[8]))
                        print "Location(Lat: %s, Long: %s)"%(str(data[9]), str(data[10]))
                        print "----------------------"

                    except:
                        continue
                        print "ERROR showing message details"

            __Shower()


        def __Chat_list():
            #SQLConsult
            try:
                self.consult.execute("SELECT id, \
                key_remote_jid FROM chat_list;")

            except:
                print "An error has ocurred doing the SQL Consult"

            def __Shower():
                #Chat list details
                for data in self.consult:
                    try:
                        print "\nChat_list"
                        print "ID: " + str(data[0])
                        print "Number: " + str(data[1])
                        print "----------------------"
                    except:
                        continue
                        print "ERROR showing chat list details"

            __Shower()

        #Initializing
        __Messages()
        __Chat_list()


metaimg_extractor.py :
Código: python [Seleccionar]
# -*- coding: utf-8 *-*
import os, exif

class IMG_Meta():

    def __init__(self):
        try:
            self.__Media_extractor()
            print "------------------------------------------------------\n"
            self.__Profile_extractor()
        except:
            print "An error has ocurred starting the script"
    def __Media_extractor(self):
        try:
            images = os.listdir('Media/WhatsApp Images/')
        except:
            print "An error has ocurred listing the files into the directory"

        def __Shower():
            for i in images:
                print "-------------"
                print i
                obj = exif.extract_EXIF('Media/WhatsApp Images/%s' % i)
                print "-------------"

        __Shower()

    def __Profile_extractor(self):
        try:
            images = os.listdir('Profile Pictures/')
        except:
            print "An error has ocurred listing the files into the directory"

        def __Shower():
            for i in images:
                print "-------------"
                print i
                obj = exif.extract_EXIF('Profile Pictures/%s' % i)
                print "-------------"

        __Shower()



Saludos.
IN-Seguridad Informática & Programación
StrikeGeek.org | Underc0de.org
Si has encontrado útil este articulo recuerda que puedes ayudarnos con tu donación voluntaria la cual ayudará al staff y a la mantención del foro.

Desconectado sanko

  • Recién llegado
  • *
  • Mensajes: 30
  • Karma: +2/-1
  • ¿Puedes?
    • Ver Perfil
    • StrikeGeek
Re:Whatsapp Metadata Extractor
« Respuesta #1 : mayo 14, 2013, 12:17:20 pm »
Si algún moderador/admin pudiera revisar por qué el DB_Extractor no sale coloreado pues mejor, si no, no hay problema
IN-Seguridad Informática & Programación
StrikeGeek.org | Underc0de.org

Desconectado WHK

  • 吴阿卡
  • Administrador
  • Aportador
  • *****
  • Mensajes: 555
  • Karma: +15/-3
  • Coder
    • Yahoo Instant Messenger - yan_uniko_102
    • Ver Perfil
    • WHK
    • Email
Re:Whatsapp Metadata Extractor
« Respuesta #2 : mayo 17, 2013, 09:43:10 am »
Si, es un bug del geshi, intentaré repararlo, gracias por avisar.
Mi WEB - The Hacktivism is not a crime - Si no lo hago yo, que lo hagan otros -

Desconectado WINTX

  • Staff
  • Usuario regular
  • ******
  • Mensajes: 128
  • Karma: +3/-2
  • WINTX
    • Ver Perfil
Re:Whatsapp Metadata Extractor
« Respuesta #3 : mayo 30, 2013, 12:45:01 pm »
Alguien me dice para que sirve el código de python estoy comenzando con python y bueno alguien me lo explica :3

Desconectado WHK

  • 吴阿卡
  • Administrador
  • Aportador
  • *****
  • Mensajes: 555
  • Karma: +15/-3
  • Coder
    • Yahoo Instant Messenger - yan_uniko_102
    • Ver Perfil
    • WHK
    • Email
Re:Whatsapp Metadata Extractor
« Respuesta #4 : mayo 30, 2013, 04:25:08 pm »
Es un código que se separa en dos partes, la parte de la librería la cual se encagra de realizar todas las funcionalidades y el main que se encarga de llamar a las funciones.

Lo que hacen en si es abrir el archivo "metadb.db" de Watsapp el cual es un archivo de base de datos SQLITE, realiza una query para obtener todos los datos y lo devuelve.

La segunda librería se encarga de obtener los datos EXIF de una imagen.
EXIF es un estandard, son varios strings que van escritos dentro de un archivo de imagen y da mucha información como por ejemplo cuando se construyó, con que programa fué hecho, etc etc.
Código: [Seleccionar]
obj = exif.extract_EXIF('Profile Pictures/%s' % i)

http://es.wikipedia.org/wiki/Exchangeable_image_file_format

Hay varios programas y lenguajes que usan exif, por ejemplo php tiene una función para extraer los datos exif de una foto.
Mi WEB - The Hacktivism is not a crime - Si no lo hago yo, que lo hagan otros -

Desconectado sanko

  • Recién llegado
  • *
  • Mensajes: 30
  • Karma: +2/-1
  • ¿Puedes?
    • Ver Perfil
    • StrikeGeek
Re:Whatsapp Metadata Extractor
« Respuesta #5 : junio 08, 2013, 09:43:15 pm »

Código: [Seleccionar]
obj = exif.extract_EXIF('Profile Pictures/%s' % i)


El script importado lo hicimos para grampus, usamos pyexiv y lo podeis encontrar en su repo -> https://bitbucket.org/grampusteam/grampus/src/3ba1273572c71c8ba88c6ed902848fa693c246b5/Grampus/Clases/Exif.py?at=master
IN-Seguridad Informática & Programación
StrikeGeek.org | Underc0de.org


. . . . . . . .