Les fichiers
Les fichiers, on ne sait pas toujours ce qu'on va trouver dedans, en particulier quand on reverse un vieux jeu dont on a copié le cd et qu'on tombe sur un fichier custom créé par les développeurs pour contenir, par exemple les chaînes de caractères du jeu dans toutes les langues. (C'est assez fréquent, et ils se montrent imaginatifs. Je n'ai croisé qu'un seul fichier xml dasn toutes mes aventures.)
J'en ai vite eu marre de réécrire toujours la même fonction anafreq(s):
dans mes scripts de découpage en python, et donc j'ai réalisé le code qui suit.
Il vous affiche gentiment la matrice des nombres d'occurences d'octets dans le fichier passé en paramètres, avec de la couleur.
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 | #!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import sys
def load(nf):
with open(nf,'r') as ofi:
data = ofi.read()
ofi.close()
return data
def anafreq(data):
return [data.count(chr(i)) for i in xrange(0x100)]
def safe(s):
if ord(s) not in xrange(0x20,0x80-1):
return "."
return s
def colornumber(s,maax,miin):
if s == "0":
return "\033[30m0\033[0m"
if int(s) > maax - (maax - miin)/5:
return "\033[31m"+s+"\033[0m"
if int(s) < miin + (maax - miin)/10:
return "\033[36m"+s+"\033[0m"
return "\033[34m"+s+"\033[0m"
class image():
''' cette fonction est un peu bugguée :/ '''
def __init__(self,li):
n = Image.new('RGB',(len(li),len(li)),0)
for i in xrange(len(li)):
for h in xrange(li[i]):
n.putpixel((i,h),(0xba,0x10,0x12))
self.im = n
def show(self):
self.im.show()
class matrix():
def __init__(self,lis):
self.d = []
self.maax = max(lis)
self.miin = self.maax
for i in xrange(0x10):
self.d.append([])
for index in xrange(len(lis)):
self.d[index/0x10].append(lis[index])
if lis[index] != 0:
self.miin = min(self.miin,lis[index])
def __str__(self):
r = "\t"+"\t".join([hex(i)[2:] for i in xrange(0x10)])+"\n"
for i in xrange(0x10):
r += hex(i)[2:]+"0"
for j in xrange(0x10):
r += "\t"+safe(chr(0x10*i+j))+" "+colornumber(str(self.d[i][j]),self.maax,self.miin)
r += "\n"
return r[:-1]
if __name__ == "__main__":
if len(sys.argv) == 1:
print sys.argv[0],"<file> [--image]"
sys.exit(0)
res = anafreq(load(sys.argv[1]))
if len(sys.argv) == 3:
if sys.argv[2] == "--image":
import Image
i = image(res)
i.show()
else:
m = matrix(res)
print m
|
Bref, collez-vous ça dans votre ~/bin/
c'est super utile, vous verrez.
Attention, il charge en entier le fichier en mémoire, donc ne le lancez que sur des trucs de taille raisonnable (10Mio ça commence à faire gros)