{"id":170172,"date":"2026-01-02T07:57:25","date_gmt":"2026-01-02T15:57:25","guid":{"rendered":"https:\/\/unit42.paloaltonetworks.com\/?p=170172"},"modified":"2026-02-13T08:18:10","modified_gmt":"2026-02-13T16:18:10","slug":"vvs-stealer","status":"publish","type":"post","link":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/","title":{"rendered":"Le VVS Discord Stealer utilise Pyarmor pour l'offuscation et l'\u00e9vasion de d\u00e9tection"},"content":{"rendered":"<h2><a id=\"post-170172-_fmedsxjy2t39\"><\/a>R\u00e9sum\u00e9 ex\u00e9cutif<\/h2>\n<p>Cet article d\u00e9taille notre analyse technique du VVS stealer, \u00e9galement stylis\u00e9 VVS $tealer, y compris l'utilisation de l'offuscation et de l'\u00e9vasion de d\u00e9tection par ses distributeurs.<\/p>\n<p>Ce stealer est \u00e9crit en Python et cible les utilisateurs de Discord, exfiltrant des informations sensibles telles que les identifiants et les jetons (tokens) stock\u00e9s dans les comptes Discord. Ce stealer \u00e9tait autrefois en d\u00e9veloppement actif et commercialis\u00e9 sur Telegram d\u00e8s avril 2025.<\/p>\n<p>Le code du VVS stealer est offusqu\u00e9 par<a href=\"https:\/\/github.com\/dashingsoft\/pyarmor\" target=\"_blank\" rel=\"noopener\"> Pyarmor<\/a>. Cet outil est utilis\u00e9 pour offusquer les scripts Python afin d'entraver l'analyse statique et la d\u00e9tection bas\u00e9e sur les signatures. Pyarmor peut \u00eatre utilis\u00e9 \u00e0 des fins l\u00e9gitimes, mais aussi exploit\u00e9 pour construire des logiciels malveillants furtifs.<\/p>\n<p>Les auteurs de logiciels malveillants exploitent de plus en plus des techniques d'offuscation avanc\u00e9es pour \u00e9chapper \u00e0 la d\u00e9tection par les outils de cybers\u00e9curit\u00e9, rendant leurs logiciels malveillants plus difficiles \u00e0 analyser et \u00e0 r\u00e9tro-ing\u00e9nierier. Cet article montre comment nous avons d\u00e9soffusqu\u00e9 des \u00e9chantillons du VVS stealer pour mieux comprendre ses op\u00e9rations.<\/p>\n<p>Du fait de la facilit\u00e9 d'utilisation de Python pour les auteurs de maliciels et de l'offuscation complexe utilis\u00e9e par cette menace, le r\u00e9sultat est une famille de logiciels malveillants tr\u00e8s efficace et furtive.<\/p>\n<p>Les clients de Palo Alto Networks sont mieux prot\u00e9g\u00e9s gr\u00e2ce aux produits et services suivants :<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.paloaltonetworks.com\/wildfire\" target=\"_blank\" rel=\"noopener\">Advanced WildFire<\/a><\/li>\n<li><a href=\"https:\/\/docs.paloaltonetworks.com\/advanced-url-filtering\/administration\" target=\"_blank\" rel=\"noopener\">Advanced URL Filtering<\/a> et<a href=\"https:\/\/docs.paloaltonetworks.com\/dns-security\" target=\"_blank\" rel=\"noopener\"> Advanced DNS Security<\/a><\/li>\n<li><a href=\"https:\/\/docs-cortex.paloaltonetworks.com\/p\/XDR\" target=\"_blank\" rel=\"noopener\">Cortex XDR<\/a> et<a href=\"https:\/\/docs-cortex.paloaltonetworks.com\/p\/XSIAM\" target=\"_blank\" rel=\"noopener\"> XSIAM<\/a> pr\u00e9viennent les menaces d\u00e9crites dans cet article en employant le<a href=\"https:\/\/docs-cortex.paloaltonetworks.com\/r\/Cortex-XDR\/Cortex-XDR-4.x-Documentation\/Malware-protection\" target=\"_blank\" rel=\"noopener\"> Malware Prevention Engine<\/a><\/li>\n<\/ul>\n<p>Si vous pensez avoir \u00e9t\u00e9 compromis ou si vous avez une urgence, contactez l'<a href=\"https:\/\/start.paloaltonetworks.com\/contact-unit42.html\" target=\"_blank\" rel=\"noopener\">\u00e9quipe de r\u00e9ponse aux incidents de Unit 42<\/a>.<\/p>\n<table style=\"width: 97.9413%;\">\n<tbody>\n<tr>\n<td style=\"width: 33.6283%; text-align: left;\"><strong><b>Sujets Unit 42 li\u00e9s<\/b><\/strong><\/td>\n<td style=\"width: 246.386%; text-align: left;\"><a href=\"https:\/\/unit42.paloaltonetworks.com\/fr\/tag\/infostealer-fr\/\" target=\"_blank\" rel=\"noopener\"><strong>Infostealer<\/strong><\/a><strong>, <\/strong><a href=\"https:\/\/unit42.paloaltonetworks.com\/tag\/anti-analysis\/\" target=\"_blank\" rel=\"noopener\"><strong>Anti-analysis<\/strong><\/a><strong>, Discord, Pyarmor<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><a id=\"post-170172-_dt661k3iev9m\"><\/a>Introduction<\/h2>\n<p>Discord est une plateforme de messagerie sociale et de communication devenue une cible populaire pour les logiciels malveillants, comme le VVS stealer. Le VVS stealer est con\u00e7u pour voler les informations Discord et les donn\u00e9es de navigateur d'une victime.<\/p>\n<p>La Figure 1 montre les capacit\u00e9s annonc\u00e9es du VVS stealer, notamment :<\/p>\n<ul>\n<li>Le vol de donn\u00e9es Discord (jetons et informations de compte)<\/li>\n<li>L'interception de sessions Discord actives via injection<\/li>\n<li>L'extraction de donn\u00e9es de navigateurs web (cookies, mots de passe, historique de navigation et d\u00e9tails de remplissage automatique)<\/li>\n<\/ul>\n<figure id=\"attachment_170173\" aria-describedby=\"caption-attachment-170173\" style=\"width: 1000px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170173 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-714260-170172-1.png\" alt=\"Collage de captures d'\u00e9cran d'un ordinateur affichant des informations sur \u00ab VS Stealer sur Telegram \u00bb, d\u00e9crivant son utilisation comme outil de piratage, avec la liste des fonctionnalit\u00e9s et le d\u00e9tail des tarifs. Un lien de contact Telegram est \u00e9galement visible pour toute communication ult\u00e9rieure.\" width=\"1000\" height=\"830\" srcset=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-714260-170172-1.png 2048w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-714260-170172-1-530x440.png 530w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-714260-170172-1-844x700.png 844w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-714260-170172-1-768x637.png 768w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-714260-170172-1-1536x1274.png 1536w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><figcaption id=\"caption-attachment-170173\" class=\"wp-caption-text\">Figure 1. Publicit\u00e9 pour le VVS stealer, centr\u00e9e sur Telegram.<\/figcaption><\/figure>\n<p>Le stealer assure \u00e9galement sa persistance en s'installant automatiquement au d\u00e9marrage. Il op\u00e8re furtivement en affichant de faux messages d'erreur et en capturant des captures d'\u00e9cran. Pour une enqu\u00eate plus approfondie sur l'op\u00e9ration, veuillez vous r\u00e9f\u00e9rer \u00e0 l'article de DeepCode,<a href=\"https:\/\/www.google.com\/search?q=https:\/\/decodecybercrime.com\/investigating-vvs-tealer-a-python-based-discord-malware\" target=\"_blank\" rel=\"noopener\"> Investigating VVS $tealer: A Python-Based Discord Malware<\/a>.<\/p>\n<h2><a id=\"post-170172-_lypp76e9h7zx\"><\/a>Analyse technique<\/h2>\n<p>Cette section analyse un \u00e9chantillon du maliciel VVS stealer prot\u00e9g\u00e9 par Pyarmor avec le hachage SHA-256 suivant :<\/p>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">c7e6591e5e021daa30f949a6f6e0699ef2935d2d7c06ea006e3b201c52666e07<\/span><\/li>\n<\/ul>\n<p>La Figure 2 pr\u00e9sente un diagramme r\u00e9capitulatif illustrant le flux de travail complet de l'analyse de l'\u00e9chantillon.<\/p>\n<figure id=\"attachment_170184\" aria-describedby=\"caption-attachment-170184\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170184 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-719432-170172-2.png\" alt=\"Organigramme montrant le processus d'extraction du bytecode Python d'un ex\u00e9cutable PyInstaller, sa d\u00e9compilation en code source Python et le d\u00e9chiffrement du bytecode Pyarmor en ELF.\" width=\"800\" height=\"241\" \/><figcaption id=\"caption-attachment-170184\" class=\"wp-caption-text\">Figure 2. Vue d'ensemble du flux de travail pour l'analyse de l'\u00e9chantillon du maliciel VVS stealer.<\/figcaption><\/figure>\n<h3><a id=\"post-170172-_2ydyvvpg0s5w\"><\/a><strong>Premi\u00e8re \u00e9tape : Extraction<\/strong> depuis<strong> le binaire PyInstaller<\/strong><\/h3>\n<p>L'\u00e9chantillon que nous avons analys\u00e9 est distribu\u00e9 sous forme de paquet<a href=\"https:\/\/pyinstaller.org\" target=\"_blank\" rel=\"noopener\"> PyInstaller<\/a>. PyInstaller est un outil qui regroupe une application Python et ses d\u00e9pendances dans un paquet pour permettre l'ex\u00e9cution d'une application empaquet\u00e9e sans installer de modules suppl\u00e9mentaires.<\/p>\n<p>Toute installation standard de PyInstaller est livr\u00e9e avec l'utilitaire int\u00e9gr\u00e9<span style=\"font-family: 'courier new', courier, monospace;\"><a href=\"https:\/\/www.google.com\/search?q=https:\/\/pyinstaller.org\/en\/stable\/advanced-topics.html%23using-pyi-archive-viewer\" target=\"_blank\" rel=\"noopener\"> pyi-archive_viewer<\/a>.<\/span> Nous avons utilis\u00e9 cet utilitaire pour extraire et inspecter les fichiers suivants de notre \u00e9chantillon :<\/p>\n<ul>\n<li>Le fichier bytecode Python nomm\u00e9 <span style=\"font-family: 'courier new', courier, monospace;\">vvs<\/span><\/li>\n<li>Le fichier de biblioth\u00e8que de liens dynamiques (DLL) d'ex\u00e9cution Pyarmor nomm\u00e9 <span style=\"font-family: 'courier new', courier, monospace;\">pyarmor_runtime.pyd<\/span>, situ\u00e9 dans le sous-dossier <span style=\"font-family: 'courier new', courier, monospace;\">pyarmor_runtime_007444<\/span>\n<ul>\n<li>Le fichier<span style=\"font-family: 'courier new', courier, monospace;\"> __init__.py<\/span> accompagnant ce m\u00eame sous-dossier, qui inclut les informations suivantes :\n<ul>\n<li>Version de Pyarmor : 9.1.4 (<a href=\"https:\/\/www.google.com\/search?q=https:\/\/pyarmor.readthedocs.io\/en\/latest\/licenses.html%23license-types\" target=\"_blank\" rel=\"noopener\">Pro<\/a>)<\/li>\n<li>Num\u00e9ro de licence unique : 007444<\/li>\n<li>Horodatage : 2025-04-27T11:04:52.523525<\/li>\n<li>Nom du produit : <span style=\"font-family: 'courier new', courier, monospace;\">vvs<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Fichier DLL Python 3.11 nomm\u00e9 <span style=\"font-family: 'courier new', courier, monospace;\">python311.dll<\/span>\n<ul>\n<li>Les informations de version du fichier indiquent que la version de Python est la 3.11.5<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>PyInstaller stocke le bytecode Python (list\u00e9 en <span style=\"font-family: 'courier new', courier, monospace;\">1.<\/span>) sous sa forme brute. Cette forme brute fait r\u00e9f\u00e9rence \u00e0 la s\u00e9quence de bytecode commen\u00e7ant par la valeur <span style=\"font-family: 'courier new', courier, monospace;\">e3<\/span>. La valeur <span style=\"font-family: 'courier new', courier, monospace;\">e3<\/span> est une combinaison \u00e0 la fois du drapeau (<span style=\"font-family: 'courier new', courier, monospace;\">flag<\/span>) et du <span style=\"font-family: 'courier new', courier, monospace;\">type<\/span>, combin\u00e9s via la constante <span style=\"font-family: 'courier new', courier, monospace;\">FLAG_REF<\/span>.<\/p>\n<p>Le type repr\u00e9sent\u00e9 par la valeur e3 est calcul\u00e9 comme suit : <span style=\"font-family: 'courier new', courier, monospace;\">type = e3<\/span> &amp; <span style=\"font-family: 'courier new', courier, monospace;\">~FLAG_REF<\/span>. Cela signifie que la valeur e3 est en fait le type <span style=\"font-family: 'courier new', courier, monospace;\">0x63<\/span> (la lettre c), \u00e9galement connu sous le nom de constante d'\u00e9num\u00e9ration <span style=\"font-family: 'courier new', courier, monospace;\">TYPE_CODE<\/span>. L'impl\u00e9mentation compl\u00e8te de cette d\u00e9rivation peut \u00eatre trouv\u00e9e dans la<a href=\"https:\/\/www.google.com\/search?q=https:\/\/github.com\/python\/cpython\/blob\/3.11\/Python\/marshal.c\" target=\"_blank\" rel=\"noopener\"> base de code CPython 3.11<\/a>.<\/p>\n<p>La Figure 3 ci-dessous montre que cet objet code s\u00e9rialis\u00e9 par le module <span style=\"font-family: 'courier new', courier, monospace;\"><a href=\"https:\/\/docs.python.org\/3\/library\/marshal.html\" target=\"_blank\" rel=\"noopener\">marshal<\/a><\/span> est nu, manquant d'un en-t\u00eate de 16 octets accompagnateur (marqu\u00e9 en <span style=\"color: #0000ff;\">bleu<\/span>). Pour fournir suffisamment d'\u00e9l\u00e9ments Python pour que le d\u00e9compilateur ne rejette pas le fichier, nous devons restaurer au moins l'une des valeurs d'en-t\u00eate (le nombre magique de Python 3.11.5 au format 4 octets, little-endian) avant la d\u00e9compilation, car le d\u00e9compilateur Python attend un fichier bytecode Python valide (<span style=\"font-family: 'courier new', courier, monospace;\">.pyc<\/span>) comme entr\u00e9e.<\/p>\n<figure id=\"attachment_170195\" aria-describedby=\"caption-attachment-170195\" style=\"width: 1000px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170195 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-721294-170172-3.jpeg\" alt=\"Visualisation de donn\u00e9es hexad\u00e9cimales montrant des rang\u00e9es de codes hexad\u00e9cimaux avec certaines valeurs mises en \u00e9vidence.\" width=\"1000\" height=\"152\" srcset=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-721294-170172-3.jpeg 2020w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-721294-170172-3-786x120.jpeg 786w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-721294-170172-3-1920x293.jpeg 1920w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-721294-170172-3-768x117.jpeg 768w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-721294-170172-3-1536x234.jpeg 1536w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><figcaption id=\"caption-attachment-170195\" class=\"wp-caption-text\">Figure 3. Fichier bytecode Python (<span style=\"font-family: 'courier new', courier, monospace;\">.pyc<\/span>) nomm\u00e9 <span style=\"font-family: 'courier new', courier, monospace;\">vvs<\/span>, avec son en-t\u00eate restaur\u00e9.<\/figcaption><\/figure>\n<p>Nous commen\u00e7ons notre analyse en d\u00e9compilant le fichier bytecode Python (<span style=\"font-family: 'courier new', courier, monospace;\">.pyc<\/span>) nomm\u00e9 <span style=\"font-family: 'courier new', courier, monospace;\">vvs<\/span> pour r\u00e9cup\u00e9rer son code source Python \u00e9quivalent (<span style=\"font-family: 'courier new', courier, monospace;\">.py<\/span>).<\/p>\n<h3><a id=\"post-170172-_8p5rin3c293f\"><\/a>Deuxi\u00e8me \u00e9tape : D\u00e9compilation vers le code source Python<\/h3>\n<p><a href=\"https:\/\/github.com\/zrax\/pycdc\" target=\"_blank\" rel=\"noopener\">Pycdc<\/a> est un d\u00e9compilateur de bytecode Python \u00e9crit en C++. Il fait partie du projet Decompyle++. Il prend en charge la d\u00e9compilation du bytecode Python 3.11 \u00ab pour revenir \u00e0 un code source Python valide et lisible par l'humain. \u00bb (Source :<a href=\"https:\/\/github.com\/zrax\/pycdc\/blob\/master\/README.markdown\" target=\"_blank\" rel=\"noopener\"> GitHub<\/a>.)<a href=\"https:\/\/pylingual.io\" target=\"_blank\" rel=\"noopener\"> PyLingual<\/a> est un autre d\u00e9compilateur de bytecode Python.<\/p>\n<p>Apr\u00e8s avoir clon\u00e9 le d\u00e9p\u00f4t de code et compil\u00e9 la base de code, l'ex\u00e9cutable g\u00e9n\u00e9r\u00e9 peut \u00eatre invoqu\u00e9 comme suit pour d\u00e9compiler le bytecode Python en code source Python via Pycdc :<\/p>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">pycdc.exe -c -v \"3.11.5\" \"vvs.pyc\" &gt; \"vvs.py\"<\/span><\/li>\n<\/ul>\n<p>Cela produira le code source Python d\u00e9compil\u00e9 montr\u00e9 dans la Figure 4.<\/p>\n<figure id=\"attachment_170206\" aria-describedby=\"caption-attachment-170206\" style=\"width: 2004px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170206 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-723296-170172-4.jpeg\" alt=\"Capture d'\u00e9cran d'une ligne de code Python impliquant une instruction d'importation depuis une biblioth\u00e8que nomm\u00e9e \u00ab pyarmor \u00bb, avec du texte suppl\u00e9mentaire masqu\u00e9.\" width=\"2004\" height=\"225\" srcset=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-723296-170172-4.jpeg 2004w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-723296-170172-4-786x88.jpeg 786w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-723296-170172-4-1920x216.jpeg 1920w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-723296-170172-4-768x86.jpeg 768w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-723296-170172-4-1536x172.jpeg 1536w\" sizes=\"(max-width: 2004px) 100vw, 2004px\" \/><figcaption id=\"caption-attachment-170206\" class=\"wp-caption-text\">Figure 4. Code source Python vvs d\u00e9compil\u00e9.<\/figcaption><\/figure>\n<p>Nous analysons ensuite le dernier argument de la fonction, qui peut \u00eatre extrait via l'<a href=\"https:\/\/www.google.com\/search?q=https:\/\/docs.python.org\/3\/library\/ast.html%23ast.NodeVisitor\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: 'courier new', courier, monospace;\">ast.NodeVisitor<\/span><\/a> de Python 3.<\/p>\n<h3><a id=\"post-170172-_1vl5m8te7tlu\"><\/a><strong>Troisi\u00e8me \u00e9tape : D\u00e9m\u00ealer l'offuscation<\/strong> Pyarmor<\/h3>\n<p>La charge utile (payload) commence par l'en-t\u00eate Pyarmor montr\u00e9 dans la Figure 5.<\/p>\n<figure id=\"attachment_170217\" aria-describedby=\"caption-attachment-170217\" style=\"width: 1000px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170217 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-725265-170172-5.jpeg\" alt=\"Une capture d'\u00e9cran affichant une section de code hexad\u00e9cimal avec des caract\u00e8res ASCII sur le c\u00f4t\u00e9 droit, incluant une cha\u00eene visible \u00ab PY00744... \u00bb.\" width=\"1000\" height=\"202\" srcset=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-725265-170172-5.jpeg 2001w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-725265-170172-5-786x159.jpeg 786w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-725265-170172-5-1920x388.jpeg 1920w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-725265-170172-5-768x155.jpeg 768w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-725265-170172-5-1536x310.jpeg 1536w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><figcaption id=\"caption-attachment-170217\" class=\"wp-caption-text\">Figure 5. En-t\u00eate Pyarmor, avec des champs d'int\u00e9r\u00eat particuliers mis en \u00e9vidence.<\/figcaption><\/figure>\n<p>La cryptographie est effectu\u00e9e tout du long en utilisant l'algorithme Advanced Encryption Standard (AES) avec une cl\u00e9 de 128 bits, op\u00e9rant en mode Compteur (CTR) avec une valeur initiale de deux (c'est-\u00e0-dire, AES-128-CTR). Le Tableau 1 montre la d\u00e9composition des champs.<\/p>\n<table style=\"width: 98.4202%;\">\n<tbody>\n<tr>\n<td style=\"width: 16.4634%; text-align: center;\"><strong>D\u00e9calages (Offsets)<\/strong><\/td>\n<td style=\"width: 15.9553%; text-align: center;\"><strong>Valeurs<\/strong><\/td>\n<td style=\"width: 73.0691%; text-align: center;\"><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 16.4634%;\"><span style=\"font-family: 'courier new', courier, monospace;\">0x00 \u2026 0x07<\/span><\/td>\n<td style=\"width: 15.9553%;\"><span style=\"font-family: 'courier new', courier, monospace;\">PY007444<\/span><\/td>\n<td style=\"width: 73.0691%;\">Signature de fichier contenant le num\u00e9ro de licence unique<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 16.4634%;\"><span style=\"font-family: 'courier new', courier, monospace;\">0x09<\/span><\/td>\n<td style=\"width: 15.9553%;\"><span style=\"font-family: 'courier new', courier, monospace;\">03<\/span><\/td>\n<td style=\"width: 73.0691%;\">Version majeure de Python<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 16.4634%;\"><span style=\"font-family: 'courier new', courier, monospace;\">0x0a<\/span><\/td>\n<td style=\"width: 15.9553%;\"><span style=\"font-family: 'courier new', courier, monospace;\">0b<\/span><\/td>\n<td style=\"width: 73.0691%;\">Version mineure de Python<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 16.4634%;\"><span style=\"font-family: 'courier new', courier, monospace;\">0x14<\/span><\/td>\n<td style=\"width: 15.9553%;\"><span style=\"font-family: 'courier new', courier, monospace;\">09<\/span><\/td>\n<td style=\"width: 73.0691%;\">Type de protection :<\/p>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">09<\/span> si le<a href=\"https:\/\/pyarmor.readthedocs.io\/en\/stable\/topic\/bccmode.html\" target=\"_blank\" rel=\"noopener\"> mode BCC<\/a> de Pyarmor (bri\u00e8vement expliqu\u00e9 dans la section suivante) est activ\u00e9<\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">08<\/span> sinon<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr style=\"height: 25px; background-color: yellow;\">\n<td style=\"width: 16.4634%;\"><span style=\"font-family: 'courier new', courier, monospace;\">0x1c \u2026 0x1f<\/span><\/td>\n<td style=\"width: 15.9553%;\"><span style=\"font-family: 'courier new', courier, monospace;\">40 00 00 00<\/span><\/td>\n<td style=\"width: 73.0691%;\">D\u00e9but de la charge utile ELF, au format little-endian<\/td>\n<\/tr>\n<tr style=\"height: 25px; background-color: yellow;\">\n<td style=\"width: 16.4634%;\"><span style=\"font-family: 'courier new', courier, monospace;\">0x24 \u2026 0x27<\/span><\/td>\n<td style=\"width: 15.9553%;\"><span style=\"font-family: 'courier new', courier, monospace;\">12 c9 06 00<\/span><\/td>\n<td style=\"width: 73.0691%;\">Quatre premiers octets du nonce AES-128-CTR<\/td>\n<\/tr>\n<tr style=\"height: 25px; background-color: yellow;\">\n<td style=\"width: 16.4634%;\"><span style=\"font-family: 'courier new', courier, monospace;\">0x2c \u2026 0x33<\/span><\/td>\n<td style=\"width: 15.9553%;\"><span style=\"font-family: 'courier new', courier, monospace;\">dc d2 98 a1 ea 11 fd f4<\/span><\/td>\n<td style=\"width: 73.0691%;\">Huit octets restants du nonce AES-128-CTR<\/td>\n<\/tr>\n<tr style=\"height: 25px; background-color: yellow;\">\n<td style=\"width: 16.4634%;\"><span style=\"font-family: 'courier new', courier, monospace;\">0x38 \u2026 0x3b<\/span><\/td>\n<td style=\"width: 15.9553%;\"><span style=\"font-family: 'courier new', courier, monospace;\">a0 7f 02 00<\/span><\/td>\n<td style=\"width: 73.0691%;\">Fin de la charge utile ELF, au format little-endian<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: 10pt;\">Tableau 1. D\u00e9composition des champs pr\u00e9sents dans l'en-t\u00eate Pyarmor.<\/span><\/p>\n<p>Ce m\u00eame motif (<span style=\"background-color: yellow;\">surlign\u00e9 en jaune<\/span>) se r\u00e9p\u00e8te une fois de plus apr\u00e8s la fin de la charge utile ELF, pour extraire et d\u00e9chiffrer la charge utile bytecode Pyarmor.<\/p>\n<h4><a id=\"post-170172-_s9ngpatuuuh\"><\/a>Mode BCC<\/h4>\n<p>Le mode BCC (probablement une abr\u00e9viation de ByteCode-to-Compilation) convertit la plupart \u00ab des fonctions et m\u00e9thodes dans les scripts en fonctions C \u00e9quivalentes. Ces fonctions C seront compil\u00e9es directement en instructions machine, puis appel\u00e9es par les scripts offusqu\u00e9s. \u00bb (Source :<a href=\"https:\/\/pyarmor.readthedocs.io\/en\/stable\/topic\/bccmode.html\" target=\"_blank\" rel=\"noopener\"> Documentation Pyarmor<\/a>.)<\/p>\n<p>Le mode BCC est invoqu\u00e9 comme suit : <span style=\"font-family: 'courier new', courier, monospace;\">pyarmor gen --enable-bcc script.py<\/span>.<\/p>\n<p>Ces fonctions C converties sont stock\u00e9es dans un fichier ELF s\u00e9par\u00e9, produit aux c\u00f4t\u00e9s du bytecode marshall\u00e9 par Pyarmor.<\/p>\n<p>Le mappage des constantes Python vers les fonctions BCC peut \u00eatre obtenu en utilisant cette<a href=\"https:\/\/www.google.com\/search?q=https:\/\/github.com\/GDATAAdvancedAnalytics\/Pyarmor-Tooling\/blob\/main\/bcc_info.py\"> impl\u00e9mentation<\/a>. Par exemple, dans la m\u00e9thode Python <span style=\"font-family: 'courier new', courier, monospace;\">get_encryption_key(browser_path)<\/span>, la constante <span style=\"font-family: 'courier new', courier, monospace;\">__pyarmor_bcc_58580__ mappe<\/span> vers la fonction BCC <span style=\"font-family: 'courier new', courier, monospace;\">bcc_180<\/span>, dont le corps de fonction est situ\u00e9 au d\u00e9calage <span style=\"font-family: 'courier new', courier, monospace;\">0x4e70<\/span> du fichier ELF.<\/p>\n<p>En se r\u00e9f\u00e9rant \u00e0<a href=\"https:\/\/www.google.com\/search?q=https:\/\/cyber.wtf\/2025\/05\/30\/pyarmor-bcc-notes\" target=\"_blank\" rel=\"noopener\"> cette analyse<\/a> du contenu du fichier ELF, en particulier la structure <span style=\"font-family: 'courier new', courier, monospace;\">bcc_ftable<\/span>, la Figure 6 montre une partie de la fonction BCC <span style=\"font-family: 'courier new', courier, monospace;\">bcc_180<\/span> d\u00e9compil\u00e9e :<\/p>\n<figure id=\"attachment_170228\" aria-describedby=\"caption-attachment-170228\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170228 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-727408-170172-6.png\" alt=\"Capture d'\u00e9cran repr\u00e9sentant deux images c\u00f4te \u00e0 c\u00f4te d'exemples de code Python complexe sur un \u00e9cran d'ordinateur.\" width=\"800\" height=\"672\" srcset=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-727408-170172-6.png 930w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-727408-170172-6-524x440.png 524w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-727408-170172-6-834x700.png 834w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-727408-170172-6-768x645.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-170228\" class=\"wp-caption-text\">Figure 6. D\u00e9compilation de la fonction BCC <span style=\"font-family: 'courier new', courier, monospace;\">bcc_180<\/span>.<\/figcaption><\/figure>\n<p>Nous pouvons grossi\u00e8rement r\u00e9cup\u00e9rer un \u00e9quivalent du code original de la m\u00e9thode Python <span style=\"font-family: 'courier new', courier, monospace;\">get_encryption_key<\/span>, comme montr\u00e9 dans la Figure 7.<\/p>\n<figure id=\"attachment_170239\" aria-describedby=\"caption-attachment-170239\" style=\"width: 700px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170239 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-729500-170172-7.png\" alt=\"Capture d'\u00e9cran de code Python dans un \u00e9diteur de texte, montrant une fonction permettant de r\u00e9cup\u00e9rer la cl\u00e9 de d\u00e9chiffrement pour les navigateurs Chromium avec la syntaxe mise en \u00e9vidence.\" width=\"700\" height=\"188\" \/><figcaption id=\"caption-attachment-170239\" class=\"wp-caption-text\">Figure 7. Code Python \u00e9quivalent de la m\u00e9thode <span style=\"font-family: 'courier new', courier, monospace;\">get_encryption_key<\/span>.<\/figcaption><\/figure>\n<h4><a id=\"post-170172-_37n1cgmt4kxi\"><\/a>Format de bytecode marshall\u00e9<\/h4>\n<p>Le bytecode marshall\u00e9 de Pyarmor 9 diff\u00e8re du bytecode Python 3.11 standard de plusieurs mani\u00e8res. Premi\u00e8rement, le bit 0x20000000 est d\u00e9fini dans le champ <span style=\"font-family: 'courier new', courier, monospace;\">co_flags<\/span> pour indiquer qu'il est offusqu\u00e9 par Pyarmor. Deuxi\u00e8mement, il y a un champ de donn\u00e9es suppl\u00e9mentaire, dont la longueur est indiqu\u00e9e par la valeur de son premier octet.<\/p>\n<p>De plus, <span style=\"font-family: 'courier new', courier, monospace;\"><a href=\"https:\/\/www.google.com\/search?q=https:\/\/github.com\/python\/cpython\/blob\/3.11\/Objects\/codeobject.c%23L1473\" target=\"_blank\" rel=\"noopener\">deopt_code()<\/a> <\/span>doit \u00eatre d\u00e9sactiv\u00e9 pour que la s\u00e9quence de bytecode soit d\u00e9chiffr\u00e9e avec succ\u00e8s. Nous discuterons des param\u00e8tres cryptographiques dans une section ult\u00e9rieure de cet article.<\/p>\n<h4><a id=\"post-170172-_2jbcz155mjmp\"><\/a>Structure de l'objet code<\/h4>\n<p>Les objets code Pyarmor sont sp\u00e9cialement con\u00e7us, en ce sens qu'ils devraient contenir certains artefacts. Il est courant de s'attendre \u00e0 trouver l'instruction <span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST __pyarmor_enter_*__<\/span> dans le pr\u00e9ambule et l'instruction <span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST __pyarmor_exit_*__<\/span> dans la fin du d\u00e9sassemblage. Ces deux instructions envelopperaient le bytecode chiffr\u00e9, comme montr\u00e9 dans le Tableau 2.<\/p>\n<table style=\"width: 116%; height: 192px;\">\n<tbody>\n<tr style=\"height: 24px;\">\n<td style=\"height: 24px; text-align: center;\"><strong>Op\u00e9ration<\/strong><\/td>\n<td style=\"height: 24px; text-align: center;\"><strong>Argument<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"height: 24px; text-align: center;\" colspan=\"2\">\u2026<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST<\/span><\/td>\n<td style=\"height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">__pyarmor_enter_58592__<\/span><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST<\/span><\/td>\n<td style=\"height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x05\\x00\\x00\\x20\\x16\\x0b\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00<\/span><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"height: 24px; text-align: center;\" colspan=\"2\">\u2026\u00a0 s\u00e9quence de bytecode chiffr\u00e9e (\u00e0 examiner dans la section suivante) \u2026<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST<\/span><\/td>\n<td style=\"height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">__pyarmor_exit_58593__<\/span><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST<\/span><\/td>\n<td style=\"height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x05\\x00\\x00\\x20\\x16\\x0b\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00<\/span><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"height: 24px; text-align: center;\" colspan=\"2\">\u2026<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: 10pt;\">Tableau 2. Instructions li\u00e9es \u00e0 Pyarmor dans le d\u00e9sassemblage de <span style=\"font-family: 'courier new', courier, monospace;\">&lt;module&gt;<\/span>.<\/span><\/p>\n<p>Une fois la s\u00e9quence de bytecode chiffr\u00e9e d\u00e9chiffr\u00e9e, elle pourrait r\u00e9v\u00e9ler des cha\u00eenes chiffr\u00e9es ou des invocations de fonctions BCC. Les cha\u00eenes chiffr\u00e9es (examin\u00e9es dans une section ult\u00e9rieure de cet article) sont pr\u00e9c\u00e9d\u00e9es par une instruction <span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST __pyarmor_assert_*__<\/span>. Il y a aussi l'instruction <span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST __pyarmor_bcc_*__<\/span> pour invoquer une fonction BCC (examin\u00e9e plus t\u00f4t dans cet article).<\/p>\n<h4><a id=\"post-170172-_u435mkk9lfqw\"><\/a>Chiffrement de l'objet code<\/h4>\n<p>Les s\u00e9quences de bytecode entre le marqueur de d\u00e9but (<span style=\"font-family: 'courier new', courier, monospace;\">__pyarmor_enter_*__<\/span>) et le marqueur de fin (<span style=\"font-family: 'courier new', courier, monospace;\">__pyarmor_exit_*__<\/span>) sont chiffr\u00e9es en AES-128-CTR. La cl\u00e9 AES associ\u00e9e (<span style=\"font-family: 'courier new', courier, monospace;\">273b1b1373cf25e054a61e2cb8a947b8<\/span>)<a href=\"https:\/\/www.google.com\/search?q=https:\/\/github.com\/Lil-House\/Pyarmor-Static-Unpack-1shot\/blob\/main\/helpers\/runtime.py\" target=\"_blank\" rel=\"noopener\"> est extraite de<\/a> la DLL d'ex\u00e9cution Pyarmor li\u00e9e au num\u00e9ro de licence unique.<\/p>\n<p>D'autre part, la cl\u00e9 XOR du nonce AES correspondant (<span style=\"font-family: 'courier new', courier, monospace;\">2db99d18a0763ed70bbd6b3c<\/span>) est uniquement sp\u00e9cifique \u00e0 la charge utile bytecode Pyarmor, pour laquelle il<a href=\"https:\/\/www.google.com\/search?q=https:\/\/github.com\/Lil-House\/Pyarmor-Static-Unpack-1shot\/blob\/main\/pyc_module.cpp%23L360\" target=\"_blank\" rel=\"noopener\"> existe une impl\u00e9mentation<\/a> de la logique d'extraction de cette valeur. Cette cl\u00e9 est XOR\u00e9e avec les 12 octets au marqueur de fin (<span style=\"font-family: 'courier new', courier, monospace;\">__pyarmor_exit_*__<\/span>) pour produire le nonce AES correct utilis\u00e9 dans le d\u00e9chiffrement.<\/p>\n<h4><a id=\"post-170172-_nlaaeicbtfbe\"><\/a>Chiffrement des cha\u00eenes de caract\u00e8res<\/h4>\n<p>De m\u00eame, les constantes de cha\u00eene de plus de huit caract\u00e8res sont chiffr\u00e9es en AES-128-CTR (appel\u00e9<a href=\"https:\/\/www.google.com\/search?q=https:\/\/pyarmor.readthedocs.io\/en\/latest\/tutorial\/obfuscation.html%23more-options-to-protect-script\" target=\"_blank\" rel=\"noopener\"> \u00ab mixed \u00bb dans la terminologie Pyarmor<\/a>). La cl\u00e9 AES associ\u00e9e est \u00e9galement <span style=\"font-family: 'courier new', courier, monospace;\">273b1b1373cf25e054a61e2cb8a947b8<\/span>, mais cette fois, le nonce AES correspondant (<span style=\"font-family: 'courier new', courier, monospace;\">692e767673e95c45a1e6876d<\/span>)<a href=\"https:\/\/www.google.com\/search?q=https:\/\/github.com\/Lil-House\/Pyarmor-Static-Unpack-1shot\/blob\/main\/helpers\/runtime.py\"> est calcul\u00e9 \u00e0 partir de<\/a> la DLL d'ex\u00e9cution Pyarmor li\u00e9e au num\u00e9ro de licence unique.<\/p>\n<p>De plus, une valeur de pr\u00e9fixe <span style=\"font-family: 'courier new', courier, monospace;\">0x81<\/span> indique que la constante de cha\u00eene est chiffr\u00e9e. Sinon, une valeur de pr\u00e9fixe <span style=\"font-family: 'courier new', courier, monospace;\">0x01<\/span> est utilis\u00e9e \u00e0 la place.<\/p>\n<p>Maintenant que la protection Pyarmor est d\u00e9sarm\u00e9e, nous allons proc\u00e9der \u00e0 la pr\u00e9sentation de certaines des capacit\u00e9s cl\u00e9s du VVS stealer dans la section suivante.<\/p>\n<h2><a id=\"post-170172-_8oc0sny3y3i4\"><\/a>Capacit\u00e9s du maliciel<\/h2>\n<p>Une fois les couches d'offuscation Pyarmor \u2014 y compris le mode BCC et le chiffrement de cha\u00eenes AES-128-CTR \u2014 retir\u00e9es avec succ\u00e8s, nous avons pu exposer la logique Python sous-jacente. Ce code d\u00e9soffusqu\u00e9 a r\u00e9v\u00e9l\u00e9 un stealer con\u00e7u non seulement pour l'exfiltration de donn\u00e9es, mais aussi pour le d\u00e9tournement de session active et la persistance. La section suivante d\u00e9taille les capacit\u00e9s op\u00e9rationnelles sp\u00e9cifiques du VVS stealer qui ont \u00e9t\u00e9 d\u00e9couvertes lors de cette analyse.<\/p>\n<p>L'\u00e9chantillon de maliciel expire apr\u00e8s le <span style=\"font-family: 'courier new', courier, monospace;\">2026-10-31 23:59:59<\/span>. Il cessera de fonctionner en se terminant pr\u00e9matur\u00e9ment.<\/p>\n<p>L'\u00e9chantillon de maliciel effectue toutes les requ\u00eates HTTP en envoyant la cha\u00eene User-Agent fixe <span style=\"font-family: 'courier new', courier, monospace;\">Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/115.0.0.0 Safari\/537.36.<\/span><\/p>\n<p>Nous allons maintenant donner un aper\u00e7u des principales capacit\u00e9s du maliciel, telles qu'annonc\u00e9es sur Telegram.<\/p>\n<h3><a id=\"post-170172-_j6iqoayn6fj6\"><\/a><strong>Donn\u00e9es<\/strong> Discord<\/h3>\n<p>L'\u00e9chantillon de maliciel recherche d'abord des jetons Discord potentiellement chiffr\u00e9s. Les jetons Discord chiffr\u00e9s sont des cha\u00eenes commen\u00e7ant par le pr\u00e9fixe <a href=\"https:\/\/reddit.com\/r\/discordapp\/comments\/tyb1u0\/discord_easter_egg_all_encrypted_discord_tokens\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: 'courier new', courier, monospace;\">dQw4w9WgXcQ<\/span>:<\/a>. L'\u00e9chantillon de maliciel utilise des expressions r\u00e9guli\u00e8res pour former un motif \u00e0 partir de ce pr\u00e9fixe de cha\u00eene. Il utilise ensuite ce motif pour chercher \u00e0 l'int\u00e9rieur du contenu des fichiers avec les extensions <span style=\"font-family: 'courier new', courier, monospace;\">.ldb<\/span> ou <span style=\"font-family: 'courier new', courier, monospace;\">.log<\/span>, stock\u00e9s dans le r\u00e9pertoire<a href=\"https:\/\/en.wikipedia.org\/wiki\/LevelDB\" target=\"_blank\" rel=\"noopener\"> LevelDB<\/a>.<\/p>\n<p>Ensuite, l'\u00e9chantillon de maliciel d\u00e9chiffre la valeur <span style=\"font-family: 'courier new', courier, monospace;\">encrypted_key<\/span> dans le fichier <span style=\"font-family: 'courier new', courier, monospace;\">Local State<\/span>, via l'<a href=\"https:\/\/en.wikipedia.org\/wiki\/Data_Protection_API\" target=\"_blank\" rel=\"noopener\">interface de programmation d'application de protection des donn\u00e9es (DPAPI)<\/a>. Avec cette valeur <span style=\"font-family: 'courier new', courier, monospace;\">encrypted_key<\/span> d\u00e9chiffr\u00e9e comme param\u00e8tre de cl\u00e9 AES, l'\u00e9chantillon de maliciel applique l'algorithme AES, op\u00e9rant en mode Galois\/Counter Mode (GCM), sur les jetons Discord chiffr\u00e9s, pour les d\u00e9chiffrer.<\/p>\n<p>L'\u00e9chantillon de maliciel utilise ensuite les jetons Discord d\u00e9chiffr\u00e9s pour interroger divers points de terminaison (endpoints) de l'interface de programmation d'application (API) Discord pour obtenir des informations sur l'utilisateur, notamment :<\/p>\n<ul>\n<li>Abonnement<a href=\"https:\/\/discord.com\/nitro\" target=\"_blank\" rel=\"noopener\"> Nitro<\/a> (fonctionnalit\u00e9s Discord Premium)<\/li>\n<li>M\u00e9thodes de paiement<\/li>\n<li>ID utilisateur<\/li>\n<li>Nom d'utilisateur<\/li>\n<li>E-mail<\/li>\n<li>Num\u00e9ro de t\u00e9l\u00e9phone<\/li>\n<li>Amis<\/li>\n<li>Guildes (serveurs)<\/li>\n<li>Statut de l'authentification multifacteur (MFA)<\/li>\n<li>Param\u00e8tres r\u00e9gionaux (Locale)<\/li>\n<li>Statut de v\u00e9rification<\/li>\n<li>Image d'avatar<\/li>\n<li>Adresse IP (via le service<a href=\"https:\/\/ipify.org\" target=\"_blank\" rel=\"noopener\"> ipify<\/a>)<\/li>\n<li>Nom de l'ordinateur<\/li>\n<\/ul>\n<p>Apr\u00e8s avoir rassembl\u00e9 toutes ces informations, l'\u00e9chantillon de maliciel proc\u00e8de \u00e0 leur exfiltration au format JavaScript Object Notation (JSON). L'exfiltration a lieu via des requ\u00eates HTTP POST vers les points de terminaison webhook pr\u00e9d\u00e9finis (variable d'environnement <span style=\"font-family: 'courier new', courier, monospace;\">%WEBHOOK%<\/span> et URL de repli cod\u00e9es en dur).<\/p>\n<p>Les webhooks sont \u00ab un moyen facile de poster des messages dans des canaux sur Discord. Ils ne n\u00e9cessitent pas d'utilisateur bot ou d'authentification pour \u00eatre utilis\u00e9s. \u00bb (Source :<a href=\"https:\/\/support.discord.com\/hc\/en-us\/articles\/228383668-Intro-to-Webhooks\" target=\"_blank\" rel=\"noopener\"> Portail des d\u00e9veloppeurs Discord<\/a>.)<\/p>\n<h3><a id=\"post-170172-_nq3gi1q9p4jg\"><\/a><strong>Injection Dis<\/strong>c<strong>ord<\/strong><\/h3>\n<p>Le code responsable de cette fonctionnalit\u00e9 se trouve dans la classe <span style=\"font-family: 'courier new', courier, monospace;\">Inj<\/span>, probablement une abr\u00e9viation de Injection.<\/p>\n<p>Dans cette classe, l'\u00e9chantillon de maliciel tue d'abord les processus de l'application Discord en cours d'ex\u00e9cution, s'il y en a. Il t\u00e9l\u00e9charge ensuite la charge utile JavaScript (JS) depuis un fichier distant nomm\u00e9 <span style=\"font-family: 'courier new', courier, monospace;\">injection-obf.js<\/span> (le suffixe <span style=\"font-family: 'courier new', courier, monospace;\">-obf<\/span> signifie probablement une version offusqu\u00e9e du script), rempla\u00e7ant l'URL du point de terminaison webhook et <span style=\"font-family: 'courier new', courier, monospace;\">discord_desktop_core<\/span>, dans le r\u00e9pertoire de l'application Discord. Ce fichier JS est offusqu\u00e9 par l'<a href=\"https:\/\/obfuscator.io\" target=\"_blank\" rel=\"noopener\">outil JavaScript Obfuscator<\/a> et peut \u00eatre d\u00e9soffusqu\u00e9 via le<a href=\"https:\/\/obf-io.deobfuscate.io\" target=\"_blank\" rel=\"noopener\"> d\u00e9soffuscateur Obfuscator.io<\/a>.<\/p>\n<p>Certaines des fonctionnalit\u00e9s principales du code JS inject\u00e9 sont mises en \u00e9vidence dans les captures d'\u00e9cran suivantes, en commen\u00e7ant par ses extraits de code de configuration et d'exfiltration, montr\u00e9s dans la Figure 8.<\/p>\n<figure id=\"attachment_170250\" aria-describedby=\"caption-attachment-170250\" style=\"width: 700px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170250 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-731261-170172-8.png\" alt=\"Capture d'\u00e9cran d'un fichier de configuration JavaScript impliquant des URL et des chemins li\u00e9s \u00e0 une API Discord et \u00e0 une passerelle d'autorisation distante. Le code est affich\u00e9 dans un \u00e9diteur de texte avec coloration syntaxique.\" width=\"700\" height=\"911\" srcset=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-731261-170172-8.png 531w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-731261-170172-8-338x440.png 338w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-170250\" class=\"wp-caption-text\">Figure 8. Configuration et exfiltration du JS inject\u00e9.<\/figcaption><\/figure>\n<p>La Figure 8 montre le code JS inject\u00e9 responsable de l'\u00e9tablissement de la persistance dans l'application Discord, bas\u00e9 sur le framework<a href=\"https:\/\/electronjs.org\" target=\"_blank\" rel=\"noopener\"> Electron<\/a>. Ce framework utilise des archives Atom Shell Archive Format (<a href=\"https:\/\/electronjs.org\/docs\/latest\/tutorial\/asar-archives\" target=\"_blank\" rel=\"noopener\">ASAR<\/a>) pour regrouper l'int\u00e9gralit\u00e9 de la base de code de l'application dans un seul fichier, montr\u00e9 dans la Figure 9.<\/p>\n<figure id=\"attachment_170261\" aria-describedby=\"caption-attachment-170261\" style=\"width: 700px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170261 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-733153-170172-9.png\" alt=\"Capture d'\u00e9cran d'un extrait de code li\u00e9 \u00e0 une fonction d'initialisation logicielle, mentionnant des chemins et une configuration pour \u00ab app.js \u00bb, \u00ab index.js \u00bb et \u00ab discord.js \u00bb. Le code est \u00e9crit en JavaScript.\" width=\"700\" height=\"434\" \/><figcaption id=\"caption-attachment-170261\" class=\"wp-caption-text\">Figure 9. Code JS inject\u00e9 pour effectuer la persistance.<\/figcaption><\/figure>\n<p>La Figure 10 montre le code JS inject\u00e9 responsable de la surveillance du trafic r\u00e9seau via le protocole<a href=\"https:\/\/www.google.com\/search?q=https:\/\/chromedevtools.github.io\/devtools-protocol\/tot\/Network\" target=\"_blank\" rel=\"noopener\"> Chrome DevTools<\/a> (CDP).<\/p>\n<figure id=\"attachment_170272\" aria-describedby=\"caption-attachment-170272\" style=\"width: 700px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170272 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-735070-170172-10.png\" alt=\"Capture d'\u00e9cran de code logiciel dans un \u00e9diteur, affichant une fonction JavaScript li\u00e9e au r\u00e9seau.\" width=\"700\" height=\"571\" srcset=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-735070-170172-10.png 664w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-735070-170172-10-539x440.png 539w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-170272\" class=\"wp-caption-text\">Figure 10. Code JS inject\u00e9 pour surveiller le trafic r\u00e9seau.<\/figcaption><\/figure>\n<p>La Figure 11 montre les fonctions utilitaires de support et les hooks d'\u00e9v\u00e9nement dans le code JS inject\u00e9. Les hooks d'\u00e9v\u00e9nement sont des fonctions de rappel (callback) qui s'ex\u00e9cutent lorsque l'utilisateur de l'application Discord effectue une action sp\u00e9cifique. Les actions d'int\u00e9r\u00eat sont lorsque l'utilisateur consulte ses codes de secours, change son mot de passe ou ajoute une m\u00e9thode de paiement. Les fonctions de rappel li\u00e9es \u00e0 ces actions sont capables de collecter les informations de compte et de facturation de l'utilisateur Discord.<\/p>\n<figure id=\"attachment_170283\" aria-describedby=\"caption-attachment-170283\" style=\"width: 700px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170283 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-737027-170172-11.png\" alt=\"Capture d'\u00e9cran d'un \u00e9diteur de code informatique affichant plusieurs lignes de code JavaScript, impliquant des fonctions li\u00e9es \u00e0 la gestion des donn\u00e9es utilisateur et aux requ\u00eates API.\" width=\"700\" height=\"488\" srcset=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-737027-170172-11.png 673w, https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-737027-170172-11-631x440.png 631w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-170283\" class=\"wp-caption-text\">Figure 11. Code JS inject\u00e9 des fonctions utilitaires et des hooks d'\u00e9v\u00e9nement.<\/figcaption><\/figure>\n<p>Par la suite, l'\u00e9chantillon de maliciel red\u00e9marre un processus d'application Discord compromis via <span style=\"font-family: 'courier new', courier, monospace;\">Update.exe<\/span>, ce qu'il fait avec le commutateur de ligne de commande <span style=\"font-family: 'courier new', courier, monospace;\">--processStart<\/span>.<\/p>\n<h3><a id=\"post-170172-_acl3swhz6bsh\"><\/a><strong>Donn\u00e9es du navigateur web<\/strong><\/h3>\n<p>L'\u00e9chantillon de maliciel cible une liste d'applications de navigateur web, notamment :<\/p>\n<ul>\n<li>Chrome<\/li>\n<li>Edge<\/li>\n<li>7Star<\/li>\n<li>Amigo<\/li>\n<li>Brave<\/li>\n<li>CentBrowser<\/li>\n<li>Discord<\/li>\n<li>Epic Privacy Browser<\/li>\n<li>Iridium<\/li>\n<li>Kometa<\/li>\n<li>Lightcord<\/li>\n<li>Mozilla Firefox<\/li>\n<li>Opera<\/li>\n<li>Orbitum<\/li>\n<li>Sputnik<\/li>\n<li>Torch<\/li>\n<li>Uran<\/li>\n<li>Vivaldi<\/li>\n<li>Yandex<\/li>\n<\/ul>\n<p>De ces cibles, l'\u00e9chantillon de maliciel extrait les donn\u00e9es suivantes, lorsqu'elles sont pr\u00e9sentes :<\/p>\n<ul>\n<li>Remplissage automatique (Autofill)<\/li>\n<li>Cookies<\/li>\n<li>Historique<\/li>\n<li>Mots de passe<\/li>\n<\/ul>\n<p>Une fois ces donn\u00e9es extraites, l'\u00e9chantillon de maliciel les pr\u00e9pare pour l'exfiltration en les compressant dans un seul fichier d'archive ZIP nomm\u00e9 <span style=\"font-family: 'courier new', courier, monospace;\">&lt;USERNAME&gt;_vault.zip<\/span>. Il exfiltre ensuite ce fichier via des requ\u00eates HTTP POST vers les points de terminaison webhook pr\u00e9d\u00e9finis, similaire au processus d'exfiltration des donn\u00e9es Discord.<\/p>\n<h3><a id=\"post-170172-_2izgvjtrz1sd\"><\/a>Persistance<strong> au<\/strong> d\u00e9marrage<\/h3>\n<p>L'\u00e9chantillon de maliciel se copie dans le dossier <span style=\"font-family: 'courier new', courier, monospace;\">%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup<\/span> pour obtenir une persistance au d\u00e9marrage. Le maliciel reste sur l'appareil de l'utilisateur, lui permettant de continuer \u00e0 exfiltrer des donn\u00e9es si, par exemple, l'utilisateur tente d'installer une nouvelle copie de l'application Discord.<\/p>\n<h3><a id=\"post-170172-_gfsz956q881u\"><\/a><strong>Fausse<\/strong> erreur<\/h3>\n<p>L'\u00e9chantillon de maliciel utilise l'API Win32, sp\u00e9cifiquement la fonction <span style=\"font-family: 'courier new', courier, monospace;\">MessageBoxW<\/span> dans la biblioth\u00e8que <span style=\"font-family: 'courier new', courier, monospace;\">User32.dll<\/span>, pour afficher une bo\u00eete de message modale concernant une fausse erreur fatale n\u00e9cessitant le red\u00e9marrage de l'ordinateur. Une bo\u00eete de message modale est une petite fen\u00eatre de dialogue n\u00e9cessitant une interaction de l'utilisateur avant que l'application puisse continuer, comme montr\u00e9 dans la Figure 12.<\/p>\n<figure id=\"attachment_170294\" aria-describedby=\"caption-attachment-170294\" style=\"width: 500px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170294 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-739112-170172-12.png\" alt=\"Bo\u00eete de dialogue de message d'erreur affichant \u00ab Fatal Error \u00bb avec le code d'erreur 0x80070002 et une suggestion de red\u00e9marrer l'ordinateur. Un bouton \u00ab OK \u00bb est pr\u00e9sent pour acquittement.\" width=\"500\" height=\"275\" \/><figcaption id=\"caption-attachment-170294\" class=\"wp-caption-text\">Figure 12. Une fausse bo\u00eete de message demandant \u00e0 la victime de red\u00e9marrer l'ordinateur.<\/figcaption><\/figure>\n<h2><a id=\"post-170172-_i5y0k6woo0ve\"><\/a>Conclusion<\/h2>\n<p>Le VVS stealer d\u00e9montre comment des outils comme Pyarmor, qui peuvent \u00eatre utilis\u00e9s \u00e0 des fins l\u00e9gitimes, peuvent \u00e9galement \u00eatre exploit\u00e9s pour construire des logiciels malveillants furtifs visant \u00e0 d\u00e9tourner des identifiants pour des plateformes populaires telles que Discord. Son \u00e9mergence signale un besoin pour les d\u00e9fenseurs de renforcer la surveillance autour du vol d'identifiants et de l'abus de compte.<\/p>\n<h3><a id=\"post-170172-_ualdh4fszw4h\"><\/a><strong>Protection et att\u00e9nuation Palo Alto Networks<\/strong><\/h3>\n<p>Les clients de Palo Alto Networks sont mieux prot\u00e9g\u00e9s contre les menaces discut\u00e9es ci-dessus gr\u00e2ce aux produits suivants :<\/p>\n<p>Les mod\u00e8les d'apprentissage automatique et les techniques d'analyse d'<a href=\"https:\/\/docs.paloaltonetworks.com\/wildfire\" target=\"_blank\" rel=\"noopener\">Advanced WildFire<\/a> ont \u00e9t\u00e9 revus et mis \u00e0 jour \u00e0 la lumi\u00e8re des indicateurs partag\u00e9s dans cette recherche.<\/p>\n<p><a href=\"https:\/\/docs.paloaltonetworks.com\/advanced-url-filtering\/administration\" target=\"_blank\" rel=\"noopener\">Advanced URL Filtering<\/a> et<a href=\"https:\/\/docs.paloaltonetworks.com\/dns-security\" target=\"_blank\" rel=\"noopener\"> Advanced DNS Security<\/a> identifient les domaines et URL connus associ\u00e9s \u00e0 cette activit\u00e9 comme malveillants.<\/p>\n<p><a href=\"https:\/\/docs-cortex.paloaltonetworks.com\/p\/XDR\" target=\"_blank\" rel=\"noopener\">Cortex XDR<\/a> et<a href=\"https:\/\/docs-cortex.paloaltonetworks.com\/p\/XSIAM\" target=\"_blank\" rel=\"noopener\"> XSIAM<\/a> pr\u00e9viennent les menaces d\u00e9crites dans cet article en employant le<a href=\"https:\/\/docs-cortex.paloaltonetworks.com\/r\/Cortex-XDR\/Cortex-XDR-4.x-Documentation\/Malware-protection\" target=\"_blank\" rel=\"noopener\"> Malware Prevention Engine<\/a>. Cette approche combine plusieurs couches de protection, incluant<a href=\"https:\/\/docs.paloaltonetworks.com\/wildfire\" target=\"_blank\" rel=\"noopener\"> Advanced WildFire<\/a>, la protection contre les menaces comportementales (Behavioral Threat Protection) et le module d'analyse locale, pour emp\u00eacher les logiciels malveillants connus et inconnus de causer des dommages aux points de terminaison (endpoints).<\/p>\n<p>Si vous pensez avoir \u00e9t\u00e9 compromis ou si vous avez une urgence, contactez l'<a href=\"https:\/\/start.paloaltonetworks.com\/contact-unit42.html\" target=\"_blank\" rel=\"noopener\">\u00e9quipe de r\u00e9ponse aux incidents de Unit 42<\/a> ou appelez :<\/p>\n<ul>\n<li>Am\u00e9rique du Nord : Num\u00e9ro vert : +1 (866) 486-4842 (866.4.UNIT42)<\/li>\n<li>Royaume-Uni : +44.20.3743.3660<\/li>\n<li>Europe et Moyen-Orient : +31.20.299.3130<\/li>\n<li>Asie : +65.6983.8730<\/li>\n<li>Japon : +81.50.1790.0200<\/li>\n<li>Australie : +61.2.4062.7950<\/li>\n<li>Inde : 000 800 050 45107<\/li>\n<li>Cor\u00e9e du Sud : +82.080.467.8774<\/li>\n<\/ul>\n<p>Palo Alto Networks a partag\u00e9 ces d\u00e9couvertes avec nos membres de la Cyber Threat Alliance (CTA). Les membres de la CTA utilisent ces renseignements pour d\u00e9ployer rapidement des protections pour leurs clients et pour perturber syst\u00e9matiquement les acteurs cybermalveillants. En savoir plus sur la<a href=\"https:\/\/www.cyberthreatalliance.org\" target=\"_blank\" rel=\"noopener\"> Cyber Threat Alliance<\/a>.<\/p>\n<h2><a id=\"post-170172-_cxou2fcs4962\"><\/a>Indicateurs de compromission<\/h2>\n<p>Hachages SHA-256 des \u00e9chantillons de maliciels :<\/p>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">307d9cefa7a3147eb78c69eded273e47c08df44c2004f839548963268d19dd87<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">7a1554383345f31f3482ba3729c1126af7c1d9376abb07ad3ee189660c166a2b<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">c7e6591e5e021daa30f949a6f6e0699ef2935d2d7c06ea006e3b201c52666e07<\/span><\/li>\n<\/ul>\n<p>URL de webhook Discord :<\/p>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">hxxps[:\/\/]ptb.discord[.]com\/api\/webhooks\/1360401843963826236\/TkFvXfHFXrBIKT3EaqekJefvdvt39XTAxeOIWECeSrBbNLKDR5yPcn75uIqKEzdfs9o2<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">hxxps[:\/\/]ptb.discord[.]com\/api\/webhooks\/1360259628440621087\/YCo9eVnIBOYSMn8Xr6zX5C7AJF22z26WljaJk4zr6IiThnUrVyfWCZYs6JjSC12IC8c0<\/span><\/li>\n<\/ul>\n<h2><a id=\"post-170172-_i32sh564zmo1\"><\/a>Ressources suppl\u00e9mentaires<\/h2>\n<ul>\n<li><a href=\"https:\/\/cyber.wtf\/2025\/02\/12\/unpacking-pyarmor-v8-scripts\" target=\"_blank\" rel=\"noopener\">Unpacking Pyarmor v8+ scripts<\/a> \u2013 Leonard Rapp et Hendrik Eckardt, G DATA Advanced Analytics GmbH<\/li>\n<li><a href=\"https:\/\/isc.sans.edu\/diary\/31840\" target=\"_blank\" rel=\"noopener\">Obfuscated Malicious Python Scripts with PyArmor<\/a> \u2013 Xavier Mertens, SANS Internet Storm Center<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Le VVS stealer (ou VVS $tealer) est un infostealer bas\u00e9 sur Python qui cible les utilisateurs de Discord. Il utilise Pyarmor pour l'offuscation, ce qui contribue \u00e0 son efficacit\u00e9.<\/p>\n","protected":false},"author":366,"featured_media":146005,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[8787,8832],"tags":[9869,9205,9546,9795],"product_categories":[8956,8973,8979,9053,9064,9151],"coauthors":[4282,3893],"class_list":["post-170172","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-malware-fr","category-threat-research-fr","tag-discord","tag-infostealer-fr","tag-python-fr","tag-telegram-fr","product_categories-advanced-dns-security-fr","product_categories-advanced-url-filtering-fr","product_categories-advanced-wildfire-fr","product_categories-cortex-xdr-fr","product_categories-cortex-xsiam-fr","product_categories-unit-42-incident-response-fr"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.0 (Yoast SEO v27.0) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Le VVS Discord Stealer utilise Pyarmor pour l&#039;offuscation et l&#039;\u00e9vasion de d\u00e9tection<\/title>\n<meta name=\"description\" content=\"Le VVS stealer (ou VVS $tealer) est un infostealer bas\u00e9 sur Python qui cible les utilisateurs de Discord. Il utilise Pyarmor pour l&#039;offuscation, ce qui contribue \u00e0 son efficacit\u00e9.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Le VVS Discord Stealer utilise Pyarmor pour l&#039;offuscation et l&#039;\u00e9vasion de d\u00e9tection\" \/>\n<meta property=\"og:description\" content=\"Le VVS stealer (ou VVS $tealer) est un infostealer bas\u00e9 sur Python qui cible les utilisateurs de Discord. Il utilise Pyarmor pour l&#039;offuscation, ce qui contribue \u00e0 son efficacit\u00e9.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/\" \/>\n<meta property=\"og:site_name\" content=\"Unit 42\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-02T15:57:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-13T16:18:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/07\/07_Malware_Category_1920x900.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"900\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Pranay Kumar Chhaparwal, Lee Wei Yeong\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Le VVS Discord Stealer utilise Pyarmor pour l'offuscation et l'\u00e9vasion de d\u00e9tection","description":"Le VVS stealer (ou VVS $tealer) est un infostealer bas\u00e9 sur Python qui cible les utilisateurs de Discord. Il utilise Pyarmor pour l'offuscation, ce qui contribue \u00e0 son efficacit\u00e9.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/","og_locale":"fr_FR","og_type":"article","og_title":"Le VVS Discord Stealer utilise Pyarmor pour l'offuscation et l'\u00e9vasion de d\u00e9tection","og_description":"Le VVS stealer (ou VVS $tealer) est un infostealer bas\u00e9 sur Python qui cible les utilisateurs de Discord. Il utilise Pyarmor pour l'offuscation, ce qui contribue \u00e0 son efficacit\u00e9.","og_url":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/","og_site_name":"Unit 42","article_published_time":"2026-01-02T15:57:25+00:00","article_modified_time":"2026-02-13T16:18:10+00:00","og_image":[{"width":1920,"height":900,"url":"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/07\/07_Malware_Category_1920x900.jpg","type":"image\/jpeg"}],"author":"Pranay Kumar Chhaparwal, Lee Wei Yeong","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/#article","isPartOf":{"@id":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/"},"author":{"name":"Sheida Azimi","@id":"https:\/\/unit42.paloaltonetworks.com\/#\/schema\/person\/7ee97ec6f224446d57c0383eb5fd3639"},"headline":"Le VVS Discord Stealer utilise Pyarmor pour l'offuscation et l'\u00e9vasion de d\u00e9tection","datePublished":"2026-01-02T15:57:25+00:00","dateModified":"2026-02-13T16:18:10+00:00","mainEntityOfPage":{"@id":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/"},"wordCount":3809,"image":{"@id":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/#primaryimage"},"thumbnailUrl":"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/07\/07_Malware_Category_1920x900.jpg","keywords":["Discord","Infostealer","Python","Telegram"],"articleSection":["Malware","Recherche sur les menaces"],"inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/","url":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/","name":"Le VVS Discord Stealer utilise Pyarmor pour l'offuscation et l'\u00e9vasion de d\u00e9tection","isPartOf":{"@id":"https:\/\/unit42.paloaltonetworks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/#primaryimage"},"image":{"@id":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/#primaryimage"},"thumbnailUrl":"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/07\/07_Malware_Category_1920x900.jpg","datePublished":"2026-01-02T15:57:25+00:00","dateModified":"2026-02-13T16:18:10+00:00","author":{"@id":"https:\/\/unit42.paloaltonetworks.com\/#\/schema\/person\/7ee97ec6f224446d57c0383eb5fd3639"},"description":"Le VVS stealer (ou VVS $tealer) est un infostealer bas\u00e9 sur Python qui cible les utilisateurs de Discord. Il utilise Pyarmor pour l'offuscation, ce qui contribue \u00e0 son efficacit\u00e9.","breadcrumb":{"@id":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/#primaryimage","url":"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/07\/07_Malware_Category_1920x900.jpg","contentUrl":"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/07\/07_Malware_Category_1920x900.jpg","width":1920,"height":900,"caption":"Pictorial representation of SLOW#TEMPEST campaign. Digital artwork depicting a malware alert symbol on a computer screen, with background of blurred programming code in blue and red colors."},{"@type":"BreadcrumbList","@id":"https:\/\/unit42.paloaltonetworks.com\/fr\/vvs-stealer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/unit42.paloaltonetworks.com\/"},{"@type":"ListItem","position":2,"name":"Le VVS Discord Stealer utilise Pyarmor pour l'offuscation et l'\u00e9vasion de d\u00e9tection"}]},{"@type":"WebSite","@id":"https:\/\/unit42.paloaltonetworks.com\/#website","url":"https:\/\/unit42.paloaltonetworks.com\/","name":"Unit 42","description":"Palo Alto Networks","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/unit42.paloaltonetworks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/unit42.paloaltonetworks.com\/#\/schema\/person\/7ee97ec6f224446d57c0383eb5fd3639","name":"Sheida Azimi","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/unit42.paloaltonetworks.com\/#\/schema\/person\/image\/4ffb3c2d260a0150fb91b3715442f8b3","url":"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2018\/11\/unit-news-meta.svg","contentUrl":"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2018\/11\/unit-news-meta.svg","caption":"Sheida Azimi"},"url":"https:\/\/unit42.paloaltonetworks.com\/fr\/author\/sheida-azimi\/"}]}},"_links":{"self":[{"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/posts\/170172","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/users\/366"}],"replies":[{"embeddable":true,"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/comments?post=170172"}],"version-history":[{"count":3,"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/posts\/170172\/revisions"}],"predecessor-version":[{"id":173014,"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/posts\/170172\/revisions\/173014"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/media\/146005"}],"wp:attachment":[{"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/media?parent=170172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/categories?post=170172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/tags?post=170172"},{"taxonomy":"product_categories","embeddable":true,"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/product_categories?post=170172"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/unit42.paloaltonetworks.com\/fr\/wp-json\/wp\/v2\/coauthors?post=170172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}