Premièrement, je vais apporter une petite précision sur la recherche de l'offset. Dans mon dernier article, j'ai donné un code source simple pour déchiffre des fichiers .exe créés avec Perl2exe mais je n'ai pas expliqué comment trouver l'offset.

Avec la version actuelle de Perl2exe, Voici ce qu'il faut faire (j'utilise Gvim comme éditeur de texte) :

1) Chercher la chaine de caractères _main.pl. Dans les versions précédentes, il suffit de chercher le nom du fichier source.

On remarquera le -280 qui correspond à la taille du fichier d'origine :

Il est possible d'utiliser le 280 afin de réduire la taille du fchier à lire. On peut facilement imaginer que le fichier se trouve à la suite.

2) Ensuite, nous allons passer en affichage Hexadécimal :

Puis :

Nous recherchons à nouveau le _main.pl

Léditeur Héxa permet simplement de calculer l'offset nécessaire. Comme le script commence as un "#", la première lettre est toujours un "e". le décalage à gauche indique 5160 et l'on peut compter 8 caractères avant le "e" :

3) Calculer le décalage dans IPython

In [1]: int("5160",16) + 8
Out[1]: 20840

4) Récupérer le fichier source !

Placer 20840 (et la lecture de 280 octets) dans le fichier source et tester :

class PEcrypt:
    def __init__(self, aKey):
        self.key = aKey
        self.crc = 0
        for x in self.key:
            intX = ord(x)
            self.crc = self.crc ^ intX

    def Crypt(self, aString):
        kIdx = 0
        cryptStr = ""   # empty 'crypted string to be returned
        for x in range(len(aString)):
            cryptStr = cryptStr + \
                       chr( ord(aString[x]) ^ ord(self.key[kIdx]))
            kIdx = (kIdx + 1) % len(self.key)
        return cryptStr

if __name__ == "__main__":
    out = file("sortie.test", "wb")
    code = "For more information visit www.indigostar.com"
    pe = PEcrypt(code)
    offset = 20840
    f = file("sample.exe", "rb")
    f.read(offset)
    lines = f.read(280) # d'après le -280 ...
    result = pe.Crypt(lines)
    out.write(result)

Ensuite, avec :

C:\DevPython\decode>python decode.py

On arrive à obtenir un très beau fichier source :

Cette fois-ci le résultat est plus joli, peut être que la prochaine fois j'aurai une méthode pour trouver l'offset automatiquement !