dimanche 24 février 2019

Détection de Packer


I.    Introduction


Les auteurs de logiciels malveillants utilisent plusieurs astuces pour éviter la détection et l'analyse. L'une des méthodes les plus courantes consiste à utiliser un programme de compression, un outil qui compresse, crypte et / ou modifie le format d'un fichier malveillant que l'on nomme packer. Les packers peuvent également être utilisés à des fins légitimes, par exemple pour protéger un programme contre l'analyse ou la copie de bloc.
Toutes ces astuces diminuent les chances de détection par des logicielles anti-malware et permettent d'éviter l'analyse par des chercheurs en sécurité.
Les emballeurs rendre plus difficile l'analyse et l'inverse ingénierie en mode statiques  pour des analystes en sécurité dans le but de retarder l'identification du comportement du logiciels malveillants et d'augmenter le temps requis pour une analyse des parties fondamentales. La complexité des packers varie et il existe une quantité important de packer que ce soit des packers clé en main dit standard que de packers privés.


II.    Type d'emballeurs


Un packer peut agir simplement comme une armure pour protéger le binaire. Il est plus pratique pour les attaquants d’utiliser un programme de compression plutôt que d’implémenter directement une protection dans le code étant moins coûteux. Les logiciels malveillants avancés codés par des groupes de cybercriminels organisés utilisent plutôt des programmes d’emballage personnalisés et aussi implémentent une protection complexe au sein de fichiers malveillants en plus pour crée plusieurs couche de protection.

Nous allons concentrer sur les packers standard, il existe plusieurs formats de packer connus et reconnus : UPX, FSG, Armadillo, Themida, Petite, etc.

Avant de pouvoir décompresser ( Unpacker ) un programme ayant était compressé, il faut pouvoir déterminer qu'elle packer a été utiliser pour compresser notre échantillons.
C'est la vocation de cette article.


III.    Les logiciels de détection de packer


Il existe une multitude de programme conçu pour analyser un binaire et de déterminer si le binaire est packé ou pas.C'est programme permettre de connaître qu'elle parker a été utiliser sur le binaire.

Voici une liste non exhaustive d'outil permettant de déterminer si un binaire est packé.
1) PEiD V0.95

Il est l'un des plus populaire pour l'analyseur de fichier exécutables.
L'analyse est effectuée sur la base de données de signatures interne et externe.
Il existe plusieurs niveaux d'analyse allant du plus rapide au plus profond. l'intérêt également est la fonctionnalité étendre par des plugins externes la base de signature.
Les signatures étant stockées dans un fichier texte séparé, vous pouvez donc facilement y ajouter vos propres fichiers et aussi comprendre ce comment est construit les signature.
















 
2) Detect it Easy V0.65 (DiE)

Il est très proche de PEiD sur la partie scan de packer. Mais il fournit également certaines fonctions utiles pour l'analyse du PE :visualiser les importations, les sections, visualiser d'un fichier en mode hexadécimal, désassembler ( basique ), l'afficher des caractéristiques de base de PE. Et les classique hachage MD5 et le CRC-32.
Il dispose également de la fonctionnalité étendre le programme avec des plugins externe.




















 
 
3) RDG Packer Detector V0.76

Celui-ci est un détecteur de packer au sens propre, vous pouvez aller sur le site suivant : http://www.rdgsoft.net/ pour télécharger le programme. Nous trouvons simple à utiliser. Il reconnaît bien les Packers à la différence d'autre plus ancien.
Est le bon outil pour cette tache de détection.
















  
 
4) ExeInfo PE

Il est également dans la même vaine que PEiD avec quelque fonction complémentaire
Idée d'ajouter l'information sur l'outil pouvant servir à Unpacker le binaire est bien pour des débutant.

















 
 
5) file insPEctor XL

Lui est un analyseur ancien des années 2000. Définit de manière heuristique les packers et les compilateurs de fichiers exécutable.
Il affiche aussi les données de base des tables d'en-tête, de section, d'importation et d'exportation du PE. En plus de l'analyseur.

Il inclut des fonction d'ajouté une section vide à un fichier ou de nouvelles fonctions d'importation, une calculatrice RVA à décalage,la modification de la date et l'heure d'un fichier, rediriger l'OEP.

Il devient moins utile pour la détection de packer que pour ses fonctions sur le PE
Dans la capture cela ce voit, il détecte bien UPX. Mais sur une signature ancienne.






























6) Stud_PE

Il est un très bon programme, en plus d’analyser la manière dont un fichier est compressé, il affiche de nombreuses autres informations utiles sur le PE: sections, ressources, tables d’import et d’exportation, en-tête DOS.
L'éditeur HEX intégré à Stud_PE met en évidence les champs d'en-tête de fichier sélectionnés, ce qui est très pratique pour analyser sa structure.
Les fonctionnalités peuvent être étendue à l'aide de plug-ins, et les plug-ins de PEiD sont compatible également à l'outil.


























IV.    Analyse d'un packer standard UPX


A partie d'un programme simple, nous allons le packé à partir de deux version de UPX, pour obtenir deux échantillons de référence.

Nous avons pris simple programme affichant une MessageBox, crée a partir de visual studio avec un projet SDK.













Nous mettons le code source correspondant de ce petit programme.

// WinBasic.cpp : Defines the entry point for the application.

#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                                          HINSTANCE hPrevInstance,
                                          LPSTR     lpCmdLine,
                                          int       nCmdShow)
{
            MessageBox(0, "Hello", "Msg Title Basic Win", MB_OK);
            return 0;
}

Nous avons utilisé Upx290 et Upx308 dans notre démonstration. Vous pouvez les télécharger à partir des urls suivant:

https://sourceforge.net/projects/upx/files/upx/3.08/
https://sourceforge.net/projects/upx/files/upx-beta/2.90/

De là nous avons générés deux échantillons de notre référence, l'un avec Upx 290 et l'autre avec Upx 308. Vous trouverez en dessous la capture pour la génération










 Nous les avons renommé et positionné dans un répertoires "Echantillons" pour la suite.















Nous avons passé l'un des échantillons ( WinBasicIcon_PackedToUpx308 ) dans différent outils de détection de packers. Nous mettons la capture en dessous:














 



















 
Nous avons entouré en rouge les parties qui nous intéresse à expliquer.

Il utilise la détection statique, elle consiste à analyser le code du fichier sans exécuter ce dernier. On note dans nos deux exemples l'utilisation de la détection par signature.
Il s’agit de détection qui correspond à des portions de code significative du binaire permettant une identification de la famille du packer et dans une plus grande mesure de la version du packer utilisé.
Et qui sont dans notre cas les premiers opcode du binaire pointé par EntryPoint du PE.

Comme l'outils nous donne l'adresse ou l'offset file pointant l'Entrypoint du PE. Il nous sera assez simple de valider cela. Dans notre exemple la valeur indiqué est 0x00004910.

En utilisant un outil pour la lecture des binaires maison, on peut voir que cela correspond bien.



























 Nous obtenons la séquence suivante:

60 BE 00 A0 40 00 8D BE 00 70 FF FF 57 EB 0B 90
8A 06 46 88 07 47 01 DB 75 07 8B 1E 83 EE FC 11
DB 72 ED B8 01 00 00 00 01 DB 75 07 8B 1E 83 EE
FC 11 DB 11 C0 01 DB 73 EF 75 09 8B 1E 83 EE FC
11 DB 73 E4 31 C9 83 E8 03 72 0D C1 E0 08 8A 06

Mais, elle n'est pas exploitable directement lié au différents Opcode présent utilisant des référence à des adresses propre au  programme.

Nous avons passer ce code dans l'une de nos outils pour désassemblée les opcodes et nous avons également indiqué ce qui sont relatif à des positions pouvant changer. Les éléments problématique sont soulignée en bleu dans la capture en dessous.



Nous utilisons une notation pour l'écriture de la signature ou  les octets à  ne pas prendre en compte son remplacé par ?? ou  peut trouver d'autre représentation  avec XX dans certains outils. Cela nous donne la chaîne suivante.

"60 BE ?? ?? ?? ?? 8D BE ?? ?? ?? ?? 57 EB 0B 90 8A 06 46 88 07 47 01 DB 75 07 8B 1E 83 EE FC 11 DB 72 ED B8 01 00 00 00 01 DB 75 07 8B 1E 83 EE FC 11 DB 11 C0 01 DB 73 EF 75 09 8B 1E 83 EE"

Nous avons intégrer dans notre base de donnée ces signatures de packer dont UPX308 à notre outils "EzSearchPackers.exe".

Le moyen de stockage est assez basique un simple fichier INI, vous trouverez beaucoup de ce format. Lié à son utilisations comme moyen de déclarer vos propres signatures dans plusieurs outils comme Peid.















De là, nous avons passer notre échantillon "WinBasicIcon_PackedToUpx308.exe" à l'analyse au travers de notre propre détecteur de packer ( EzSearchPackers.exe ).
Et nous avons bien l'identification que le programme est paqueté avec le packer UPX 3.08 avec la détection par la signature crée au dessus.






















Notre outils fournit deux informations distinct sur deux techniques. L'une basé sur le nom des sessions pour déterminer rapidement si des noms de sections correspondant à des nommages prédéfini dans notre cas UPX1 et une base de signatures présenté au dessus.

Mais l'outil permet aussi d'obtenir la vu sur les octets de pointé par l'EntryPoint et de pouvoir afficher le codes assembleur et les octets en hexadecimal pour construire de nouvelle signature lors d'analyse de malware.



































De même les signatures référence peuvent être lister , nous reviendrons sur ce point
dans un autre article sur la construction d'une base de signature référentielle.


























  

V.    Conclusions


L'intérêt de connaître si un binaire est paqueté ou non et qu'elle IDE a permit de le générer
réduit l'investigation et surtout permet de réduire le temps pour analyse du code. Car s'il est paqueté, vous devrez neutraliser cette couche en le dépaquetant avant de pouvoir analyse le binaire au niveau fonctionnelle au travers du PE ou d'une étude statique.

Comprendre les processus de reconnaissance par signature est importante. Car la technique étant lié à une identification d'un bloc d'opcode , elle est donc empirique  et elle est dépendante de la bonne qualité des signatures. Nous aborderons ce point dans un prochaine article. Car vous trouvez sur Internet une quantité de base de signature, mais beaucoup ne sont pas de qualité ou sont un agrégat de N bases ou incluant des volumes de doublons important
Il faut donc faire une passe a travers des outils pour construire base de signature représentatif
Et non une concaténation de base de signature.
De plus vous verrez des signature contradictoire ou associé à de mauvais packer.
Donc comprendre la technique c'est éviter de perdre du temps sur une mauvaise piste d'investigation lors de l'étude d'un malware.