
Un outil d'apprentissage automatique qui classe les chaînes de caractères en fonction de leur pertinence pour l'analyse de logiciels malveillants.
StringSifter est un outil d'apprentissage automatique qui classe automatiquement les chaînes de caractères en fonction de leur pertinence pour l'analyse de logiciels malveillants.
StringSifter requiert Python version 3.9 ou plus récent. Exécutez les commandes suivantes pour obtenir le code, exécuter les tests unitaires et utiliser l'outil :
pip install stringsifter
Pour le développement, utilisez poetry :
git clone https://github.com/mandiant/stringsifter.git
cd stringsifter
poetry install --with dev
Pour exécuter les tests unitaires depuis le répertoire d'installation de StringSifter :
poetry run tests -v
La commande pip install installe deux scripts exécutables, flarestrings et rank_strings, dans votre environnement Python. Lors du développement à partir des sources, utilisez pipenv run flarestrings et pipenv run rank_strings.
flarestrings reproduit les fonctionnalités de strings de GNU binutils, et rank_strings accepte une entrée par pipe, par exemple :
flarestrings <my_sample> | rank_strings
rank_strings prend en charge un certain nombre d'arguments en ligne de commande. L'argument positionnel input_strings spécifie un fichier de chaînes à classer. Les arguments optionnels sont :
Les chaînes classées sont écrites sur la sortie standard, sauf si l'option --batch est spécifiée, auquel cas les sorties classées sont écrites dans des fichiers nommés <input_file>.ranked_strings.
flarestrings prend en charge l'option -n (ou --min-len) pour afficher les séquences de caractères d'au moins min-len caractères, au lieu de 4 par défaut. Par exemple :
flarestrings -n 8 <my_sample> | rank_strings
affichera et classera uniquement les chaînes d'une longueur de 8 caractères ou plus.
docker build -t stringsifter -f docker/Dockerfile .
flarestrings ou rank_strings pour utiliser la commande correspondante. Les commandes conteneurisées peuvent être utilisées dans des pipelines :cat <my_sample> | docker run -i stringsifter flarestrings | docker run -i stringsifter rank_strings
-v pour exposer un répertoire hôte au conteneur :docker run -v <my_malware>:/samples -it stringsifter
où <my_malware> contient des échantillons à analyser, par exemple :
docker run -v $HOME/malware/binaries:/samples -it stringsifter
flarestrings /samples/<my_sample> | rank_strings <options>
Tous les arguments de ligne de commande sont pris en charge dans les scripts conteneurisés.
StringSifter peut être appliqué à des listes arbitraires de chaînes, ce qui le rend utile aux praticiens cherchant à tirer des enseignements de sources alternatives de collecte de renseignements telles que les vidages de mémoire vive, les exécutions en sandbox, ou les binaires contenant des chaînes obfusquées. Par exemple, FireEye Labs Obfuscated Strings Solver (FLOSS) extrait les chaînes imprimables tout comme Strings, mais révèle en plus les chaînes obfusquées qui ont été encodées, empaquetées ou construites manuellement sur la pile. Il peut être utilisé comme remplacement direct de Strings, ce qui signifie que StringSifter peut être invoqué de la même manière sur la sortie de FLOSS en utilisant la commande suivante :
$PY2_VENV/bin/floss –q <options> <my_sample> | rank_strings <options>
Remarques :
–q supprime les en-têtes et le formatage pour n'afficher que les chaînes extraites. Pour en savoir plus sur les options supplémentaires de FLOSS, consultez sa documentation d'utilisation.floss ou rank_strings doit inclure un chemin relatif faisant référence à un environnement virtuel Python.stringsCette distribution inclut le programme flarestrings pour garantir une sortie prévisible sur toutes les plateformes. Si vous choisissez d'exécuter le programme strings installé sur votre système, notez que ses options ne sont pas cohérentes entre les versions et les plateformes :
La plupart des distributions Linux incluent le programme strings de GNU Binutils. Pour extraire à la fois les chaînes « wide » et « narrow », le programme doit être exécuté deux fois, avec redirection vers un fichier de sortie :
strings <my_sample> > strs.txt # narrow strings
strings -el <my_sample> >> strs.txt # wide strings. note the ">>"
Certaines versions de BSD strings fournies avec macOS ne prennent pas en charge les chaînes « wide ». Notez également que l'option -a permettant à strings d'analyser la totalité du fichier peut être désactivée dans la configuration par défaut. Sans -a, des chaînes informatives peuvent être perdues. Nous recommandons d'installer GNU Binutils via Homebrew ou MacPorts pour obtenir une version de strings qui prend en charge les caractères « wide ». Veillez à invoquer la bonne version de strings.
strings n'est pas installé par défaut sur Windows. Nous recommandons d'installer Windows Sysinternals, Cygwin ou Malcode Analyst Pack pour obtenir un strings fonctionnel.
Cette version de StringSifter a été entraînée à partir des sorties de Strings sur des binaires de logiciels malveillants échantillonnés associés au premier jeu de données EMBER. Les étiquettes ordinales ont été générées à l'aide de procédures de supervision faible, et l'apprentissage supervisé est effectué par arbres de décision à boosting de gradient avec une fonction objectif d'apprentissage au classement (learning-to-rank). Consultez Liens rapides pour plus de détails techniques. Veuillez noter que ni les données étiquetées ni le code d'entraînement ne sont actuellement disponibles, bien que nous puissions reconsidérer cette approche dans les futures versions.
Nous utilisons GitHub Issues pour signaler les bogues et les demandes de fonctionnalités.
flarestrings est dérivé de l'excellent outil FLOSS.| Option |
|---|
| Signification |
|---|
| --scores (-s) | Inclure les scores de classement dans la sortie |
| --limit (-l) | Limiter la sortie aux limit meilleures chaînes classées |
| --min-score (-m) | Limiter la sortie aux chaînes ayant un score >= min-score |
| --batch (-b) | Spécifier un dossier de sorties strings pour le traitement par lots |