Esteganografía en imagenes png
Ya había explicado previamente lo que es la esteganografía y sin duda existen muchas y diversas técnicas, como me estoy volviendo fanático de Python debido a su versatilidad y la facilidad que representa para mi el escribir programas en este lenguaje usando mi móvil, pues se me ocurrió hacer un pequeño script para incrustar y comprimir archivos en imágenes png, aprovechando la forma en la que se estructuran los chunks (trozos de información) en este tipo de archivos, en cuanto pueda optimizaré el código con la librería de Android, saluDoS!
#!/usr/bin/env python
""" stegozpng es una herramienta que permite comprimir y ocultar archivos en imagenes png """
__author__ = "Jesus Gomez (ZoSemU?)"
__email__ = "hack@zosemu.com"
sversion = "0.1"
import zlib
def str_hex(texto):
t = ''
for i in range(0, len(texto)):
c = texto[i:i+1]
h = hex(ord(c))
b = h[2:len(h)]
if len(b) == 1:
t = t+'0'+b+' '
else:
t = t+b+' '
return t
def suma(data):
dtext = str_hex(data).replace(' ','')
total = 0
total = int(dtext,16)
return total
def str_int(num):
h = hex(abs(num))
h = h[2:len(h)]
if len(h) < 8:
g = 8 - len(h)
data = ''
for i in range(0,g):
data = data+'0'
data = data + h
texto = ''
for i in range(0,4):
n = i * 2
sc = data[n:n+2]
texto = texto+chr(int(sc,16))
return texto
def insert(png, filex, esteg, chunk):
if chunk == '':
chunk = 'zOSE'
x = open(png,'r')
z = open(filex,'r')
v = open(esteg,'w')
archivo = x.read()
m = len(archivo)
i1 = archivo.find('IDAT') - 4
head = archivo[0:i1]
estegr = z.read()
compac = zlib.compress(estegr,9)
lcomp = len(compac) - 4
lchunk = str_int(len(compac) - 4)
final = archivo[i1:m]
v.write(head+lchunk+chunk+compac+final)
x.close()
z.close()
v.close()
def extract(chunk, esteg, salida):
if chunk == '':
chunk = 'zOSE'
x = open(esteg,'r')
v = open(salida,'w')
archivo = x.read()
i1 = archivo.find(chunk)
lchunk = suma(archivo[i1-4:i1]) + i1 + 8
data = archivo[i1+4:lchunk]
file = zlib.decompress(data)
v.write(file)
x.close()
v.close()
def main():
print "\n=============================================================="
print "== stegozpng " + sversion + " - by ZoSemU? hack@zosemu.com =="
print "=============================================================="
accion = raw_input("Ocultar (O)/ Extraer (E)?: ")
if accion == "O" or accion == "o":
f = raw_input("Introduce el nombre de la imagen original: ")
s = raw_input("Introduce el nombre del archivo a ocultar: ")
o = raw_input("Introduce el nombre de la imagen final: ")
chunk = raw_input("Introduce el nombre del chunk a construir: ")
insert(f, s, o, chunk)
print "\nSe ha creado el archivo: "+o
if accion == "E" or accion == "e":
f = raw_input("Introduce el nombre de la imagen que contiene los datos ocultos: ")
e = raw_input("Introduce el nombre del archivo a extraer: ")
chunk = raw_input("Introduce el nombre del chunk creado: ")
extract(chunk, f, e)
print "\nSe ha extraido el archivo: "+e
main()
Y aquí lo pueden descargar.
#!/usr/bin/env python
""" stegozpng es una herramienta que permite comprimir y ocultar archivos en imagenes png """
__author__ = "Jesus Gomez (ZoSemU?)"
__email__ = "hack@zosemu.com"
sversion = "0.1"
import zlib
def str_hex(texto):
t = ''
for i in range(0, len(texto)):
c = texto[i:i+1]
h = hex(ord(c))
b = h[2:len(h)]
if len(b) == 1:
t = t+'0'+b+' '
else:
t = t+b+' '
return t
def suma(data):
dtext = str_hex(data).replace(' ','')
total = 0
total = int(dtext,16)
return total
def str_int(num):
h = hex(abs(num))
h = h[2:len(h)]
if len(h) < 8:
g = 8 - len(h)
data = ''
for i in range(0,g):
data = data+'0'
data = data + h
texto = ''
for i in range(0,4):
n = i * 2
sc = data[n:n+2]
texto = texto+chr(int(sc,16))
return texto
def insert(png, filex, esteg, chunk):
if chunk == '':
chunk = 'zOSE'
x = open(png,'r')
z = open(filex,'r')
v = open(esteg,'w')
archivo = x.read()
m = len(archivo)
i1 = archivo.find('IDAT') - 4
head = archivo[0:i1]
estegr = z.read()
compac = zlib.compress(estegr,9)
lcomp = len(compac) - 4
lchunk = str_int(len(compac) - 4)
final = archivo[i1:m]
v.write(head+lchunk+chunk+compac+final)
x.close()
z.close()
v.close()
def extract(chunk, esteg, salida):
if chunk == '':
chunk = 'zOSE'
x = open(esteg,'r')
v = open(salida,'w')
archivo = x.read()
i1 = archivo.find(chunk)
lchunk = suma(archivo[i1-4:i1]) + i1 + 8
data = archivo[i1+4:lchunk]
file = zlib.decompress(data)
v.write(file)
x.close()
v.close()
def main():
print "\n=============================================================="
print "== stegozpng " + sversion + " - by ZoSemU? hack@zosemu.com =="
print "=============================================================="
accion = raw_input("Ocultar (O)/ Extraer (E)?: ")
if accion == "O" or accion == "o":
f = raw_input("Introduce el nombre de la imagen original: ")
s = raw_input("Introduce el nombre del archivo a ocultar: ")
o = raw_input("Introduce el nombre de la imagen final: ")
chunk = raw_input("Introduce el nombre del chunk a construir: ")
insert(f, s, o, chunk)
print "\nSe ha creado el archivo: "+o
if accion == "E" or accion == "e":
f = raw_input("Introduce el nombre de la imagen que contiene los datos ocultos: ")
e = raw_input("Introduce el nombre del archivo a extraer: ")
chunk = raw_input("Introduce el nombre del chunk creado: ")
extract(chunk, f, e)
print "\nSe ha extraido el archivo: "+e
main()
Y aquí lo pueden descargar.
disculpa pero para correr este scrip que debo tener instalado por ue solo tengo python pero no me funciona se tiene que descargar algun plugin mas o algo
ResponderEliminarno hace falta nada, "python nombre_del_script.py" sólo eso, también funciona en Android mediante Sl4a.
ResponderEliminar