2013-05-16 3 views
1

Je travaille sur un exécutable Packer & J'ai fait compression & partie de chiffrement jusqu'à présent. Maintenant, je dois stocker stub/routine de décompression/décryptage dans le fichier compressé. Ma question est que ce bout sera écrit en code HEX ou je peux placer l'instruction d'assemblage directement? Si plus tard est possible, alors comment?Exécutable Packer (stub de décompression/décryptage)

+0

Regardez la structure de certains exécutables compressés par UPX. Cela peut vous aider. –

+0

Merci @ V-X J'ai analysé la source UPX mais clairement je ne pouvais pas comprendre quel est le format de stub (c'est-à-dire hex/assembly) et comment ils le placent. Une aide serait appréciée. – rootFather

Répondre

0

Vous devez avoir section avec la caractéristique de « lisible » & « inscriptible » & « contient le code » & « exécutable »

Address of Entry Point:  0x00019860 

    Section Header #1 
    Name:        UPX0 
    Virtual Size:      0x00010000 (65536) 
    Virtual Address:     0x00001000 
    Size of Raw Data:     0x00000000 (0) 
    File Pointer to Raw Data:   0x00000400 
    File Pointer to Relocation Table: 0x00000000 
    File Pointer to Line Numbers:  0x00000000 
    Number of Relocations:   0 
    Number of Line Numbers:   0 
    Characteristics:     0xE0000080 
     Section contains uninitialized data. 
     Section is executable. 
     Section is readable. 
     Section is writeable. 

    Section Header #2 
    Name:        UPX1 
    Virtual Size:      0x00009000 (36864) 
    Virtual Address:     0x00011000 
    Size of Raw Data:     0x00008A00 (35328) 
    File Pointer to Raw Data:   0x00000400 
    File Pointer to Relocation Table: 0x00000000 
    File Pointer to Line Numbers:  0x00000000 
    Number of Relocations:   0 
    Number of Line Numbers:   0 
    Characteristics:     0xE0000040 
     Section contains initialized data. 
     Section is executable. 
     Section is readable. 
     Section is writeable. 

    Section Header #3 
    Name:        .rsrc 
    Virtual Size:      0x00001000 (4096) 
    Virtual Address:     0x0001A000 
    Size of Raw Data:     0x00000800 (2048) 
    File Pointer to Raw Data:   0x00008E00 
    File Pointer to Relocation Table: 0x00000000 
    File Pointer to Line Numbers:  0x00000000 
    Number of Relocations:   0 
    Number of Line Numbers:   0 
    Characteristics:     0xC0000040 
     Section contains initialized data. 
     Section is readable. 
     Section is writeable. 

Juste en bref, UPX génère une section qui contient le code comprimé et le décompresseur routine et deuxième section qui n'est pas initialisée mais qui est autorisée à avoir une caractéristique accessible en écriture et exécutable. La routine de décompresseur décompresse le code à la section non initialisée et se poursuit avec l'exécution du point d'entrée originale ...

+0

J'ai créé une nouvelle section pour le placement de bout qui a les caractéristiques RWE. Mais le problème n'est pas avec les sections. C'est ce qui devrait être le format de décompression/décryptage stub i.e il devrait être dans l'assemblage ou HEX (comme shellcode)? – rootFather

+0

Est-ce différent? –

+0

Je ne vois toujours pas la différence entre l'écriture comme binaire ou l'écriture comme instructions d'assemblage, qui sont ensuite compilées en binaire ... –

2

Création d'un paquet binaire de travail nécessite:

  1. modifier la géométrie du PE
  2. insérer votre code

En fonction de la taille de votre code, vous pouvez utiliser le remplissage de section ou ajouter votre propre section. Ensuite, pour insérer votre code - comme vous semblez préférer l'insertion ASM directe -, je suggère de rendre indépendant le code de décryptage EIP, puis de l'assembler avec quelque chose comme YASM comme code pur (-o), et d'inclure code comme binaire assemblé directement.

J'ai écrit plusieurs mini-packers qui pourraient servir de référence de départ, car ils 'insèrent' du code assemblé.

+0

Merci beaucoup Ange, cette suggestion a été utile. Oui, j'ai modifié la géométrie PE. J'ajoute également une nouvelle section pour cette partie de bout. Mais maintenant, le problème est que je compresse et crypte le fichier. Créer une nouvelle section où je vais placer ma partie tronçon, je crée un nouveau fichier PE en utilisant les informations d'en-tête du fichier d'entrée, appliquer des modifications au fichier nouvellement créé. Tout semble bien dans les en-têtes etcMais quand je cours le fichier je vois le message d'erreur "pas une application Win32 valide" .J'utilise Visual Studio 2010 et sans-incremental-linking.I ne peut pas comprendre quel est le problème? Peut-être que vous pouvez proposer une meilleure solution? – rootFather

+1

cela pourrait avoir * beaucoup * de raisons (oublié d'augmenter SizeOfImage, ...?), Donc vous devriez essayer et ouvrir votre nouveau PE avec [pefile] (https://code.google.com/p/pefile/) et voyez ce que les avertissements vous disent. – Ange

+0

J'ai augmenté le SizeOfImage.Can vous me dites si je le fais de la bonne manière i.e SizeOfImage = stubSection-> VirtualAddress + stubSection-> Misc.VirtualSize où stubSection est la dernière section.Si ce mode de calcul est faux, quelle est la bonne méthode pour augmenter SizeOfImage? J'ouvre aussi mon PE avec LordPE & PEiD mais ils ne disent aucun avertissement. Qu'est-ce qui pourrait éventuellement être d'autres raisons, MajorLinkerVersion, OSversion etc? – rootFather