Perl2exe, déchiffrer les sources Partie 2
Par Florent Manens, dimanche 12 février 2006 à 23:59 :: Informatique :: #35 :: rss
Suite à mon dernier billet à propos des faiblesses de perl2exe, j'ai eu quelques questions à propos de la méthode à utiliser et surtout du fonctionnement de la méthode avec des versions récentes de Perl2exe. Voici donc quelques précisions et un exemple concrèt avec une version récente de perl2exe.
Cette fois ci, j'ai installé une version récente de Perl2exe (Perl2Exe V8.70 for Win32 (Aug 17 2005)) et j'y trouve le même problème.
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 !
Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire