#!/usr/bin/env python # -*- coding: utf-8 -*- """ hex.py Author : Alexandre Norman - norman@xael.org """ import os, sys ############################################################################ def readbin_file(file): #fd=open(file,'b') fd=open(file,'r') # Return full FILE in memory... # Beware ! readed=fd.read() fd.close() return readed ############################################################################ def temporary_directory(): """ Dumb function to return the place where to put temporary informations. """ return '/tmp' ############################################################################ def temporary_filename(prefix='rand_',suffix='.an', create=True): """ Return a temporary unique filename in the form /tmp/rand_2004-05-11.92194015.an Filename is created (if create is equal to true) in order to be sure that it is unique. You have to destroy it after use. prefix : string suffix : string create : boolean """ import random, datetime ddate=str(datetime.date.today()) filename='/' while os.access(filename, os.F_OK): filename=os.path.join(temporary_directory(), prefix+'.'+ddate+'.' \ +str(random.randint(10000000,99999999))+'.'+suffix) if create==True: file=open(filename,'w') file.close() return filename ############################################################################ def print_head(file, offset, nb=100): aff="" aff2="" head="" for i in range(offset, offset+nb): ori=hex(ord(file[i]))[2:].rjust(3) aff=aff+ori+" " if ord(file[i])>31 and ord(file[i])<128: aff2=aff2+file[i] else: aff2=aff2+"." if (i-offset) % 20 == 0 and (i-offset)!=0: head=head+hex(i-20).ljust(10)[2:]+" "+aff+" "+aff2+"\n" aff="" aff2="" return head ############################################################################ def compare(file1, file2): file_ori=readbin_file(file1) file_del=readbin_file(file2) aff="" aff2="" aff3="" aff4="" for i in range(len(file_ori)): ori=hex(ord(file_ori[i]))[2:].rjust(3) act=hex(ord(file_del[i]))[2:].rjust(3) if ori==act: aff=aff+ori+" " aff3=aff3+"." else: aff=aff+ori+"*" aff3=aff3+"*" if ord(file_ori[i])>31 and ord(file_ori[i])<128: aff2=aff2+file_ori[i] else: aff2=aff2+"." if ord(file_del[i])>31 and ord(file_del[i])<128: aff4=aff4+file_del[i] else: aff4=aff4+"." if i % 20 == 0 and i!=0: print hex(i-20).ljust(10)[2:], aff, aff2, aff3, aff4 aff="" aff2="" aff3="" aff4="" return ############################################################################ # MAIN ------------------- if __name__ == '__main__': header=[] # Jpeg header... jpeg={'name':'jpeg', 'extension':'jpg', 'head':chr(255)+chr(216), 'offset':0, 'size':2000000} header.append(jpeg) name="recup_" ind=0 # Arguments if len(sys.argv)==1: print """Usage: """+sys.argv[0]+""" [usb_device_filename] """ sys.exit(0) # Get filename #file=readbin_file(sys.argv[1]) fd=open(sys.argv[1], 'r') temp=temporary_filename('recup_','jpg') # For each type of file for type in header: lookfor=type['head'] sizeof=type['size'] offset=type['offset'] cname=type['name'] extension=type['extension'] fd.seek(0) # Check the whole file fdread="nope" off=0 #for i in range(len(file)): while len(fdread)!=0: fd.seek(off) fdread=fd.read(len(lookfor)) # if pattern is found... GREAT if fdread==lookfor: fname=name+str(ind)+"."+extension out=open(temp,'w') # Read file fdimg=open(sys.argv[1], 'r') fdimg.seek(off-offset) img=fdimg.read(sizeof) fdimg.close() out.write(img) out.close() # Verify integrity of the file... pipe=os.popen("convert "+temp+" "+fname+" 2>&1", "r") try: magic_type=pipe.readlines()[0] except: magic_type="OK" pipe.close() if magic_type.find("OK")==-1: #os.remove(fname) pass else: print "File",cname,"found at",off, "saved as", fname ind=ind+1 off=off+1 # Delete temporary file os.remove(temp) fd.close() # Exit sys.exit(0) #######################################################################