{"id":170400,"date":"2026-01-02T06:03:47","date_gmt":"2026-01-02T14:03:47","guid":{"rendered":"https:\/\/unit42.paloaltonetworks.com\/?p=170400"},"modified":"2026-02-13T08:16:51","modified_gmt":"2026-02-13T16:16:51","slug":"vvs-stealer","status":"publish","type":"post","link":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/","title":{"rendered":"VVS Discord Stealer utiliza Pyarmor para ofuscaci\u00f3n y evasi\u00f3n de detecci\u00f3n"},"content":{"rendered":"<h2><a id=\"post-170400-_91x8zfb93a2p\"><\/a>Resumen Ejecutivo<\/h2>\n<p>Este art\u00edculo detalla nuestro an\u00e1lisis t\u00e9cnico de VVS stealer, tambi\u00e9n estilizado como VVS stealer, incluyendo el uso de ofuscaci\u00f3n y evasi\u00f3n de detecci\u00f3n por parte de sus distribuidores.<\/p>\n<p>El <em>stealer<\/em> est\u00e1 escrito en Python y tiene como objetivo a los usuarios de Discord, exfiltrando informaci\u00f3n sensible como credenciales y tokens almacenados en cuentas de Discord. Este <em>stealer<\/em> estuvo en desarrollo activo y se comercializ\u00f3 para su venta en Telegram desde abril de 2025.<\/p>\n<p>El c\u00f3digo de VVS stealer est\u00e1 ofuscado mediante<a href=\"https:\/\/github.com\/dashingsoft\/pyarmor\" target=\"_blank\" rel=\"noopener\"> Pyarmor<\/a>. Esta herramienta se utiliza para ofuscar scripts de Python con el fin de dificultar el an\u00e1lisis est\u00e1tico y la detecci\u00f3n basada en firmas. Pyarmor puede usarse con fines leg\u00edtimos y tambi\u00e9n aprovecharse para crear malware sigiloso.<\/p>\n<p>Los autores de malware est\u00e1n aprovechando cada vez m\u00e1s t\u00e9cnicas de ofuscaci\u00f3n avanzadas para evadir la detecci\u00f3n de las herramientas de ciberseguridad, haciendo que su software malicioso sea m\u00e1s dif\u00edcil de analizar y aplicar ingenier\u00eda inversa. Este art\u00edculo muestra c\u00f3mo desofuscamos las muestras de VVS stealer para comprender mejor sus operaciones.<\/p>\n<p>Debido a que Python es f\u00e1cil de usar para los autores de malware y a la compleja ofuscaci\u00f3n utilizada por esta amenaza, el resultado es una familia de malware altamente efectiva y sigilosa.<\/p>\n<p>Los clientes de Palo Alto Networks est\u00e1n mejor protegidos a trav\u00e9s de los siguientes productos y servicios:<\/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> y<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> y<a href=\"https:\/\/docs-cortex.paloaltonetworks.com\/p\/XSIAM\" target=\"_blank\" rel=\"noopener\"> XSIAM<\/a> previenen las amenazas descritas en este art\u00edculo empleando el<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> (Motor de Prevenci\u00f3n de Malware).<\/li>\n<\/ul>\n<p>Si cree que podr\u00eda haber sido comprometido o tiene un asunto urgente, comun\u00edquese con el<a href=\"https:\/\/start.paloaltonetworks.com\/contact-unit42.html\" target=\"_blank\" rel=\"noopener\"> equipo de Respuesta a Incidentes de Unit 42<\/a>.<\/p>\n<table style=\"width: 96.3382%;\">\n<tbody>\n<tr>\n<td style=\"width: 33.6283%; text-align: left;\"><b>Temas relacionados de Unit 42<\/b><\/td>\n<td style=\"width: 243.409%; text-align: left;\"><a href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/tag\/infostealer-es-la\/\" 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-170400-_bih4gowe2ci2\"><\/a>Introducci\u00f3n<\/h2>\n<p>Discord es una plataforma de mensajer\u00eda social y comunicaciones que se ha convertido en un objetivo popular para el malware, como VVS stealer. VVS stealer est\u00e1 dise\u00f1ado para robar la informaci\u00f3n de Discord y los datos del navegador de la v\u00edctima.<\/p>\n<p>La Figura 1 muestra las capacidades anunciadas de VVS stealer, que incluyen:<\/p>\n<ul>\n<li>Robo de datos de Discord (tokens e informaci\u00f3n de la cuenta)<\/li>\n<li>Intercepci\u00f3n de sesiones activas de Discord mediante inyecci\u00f3n<\/li>\n<li>Extracci\u00f3n de datos del navegador web (cookies, contrase\u00f1as, historial de navegaci\u00f3n y detalles de autocompletado)<\/li>\n<\/ul>\n<figure id=\"attachment_170401\" aria-describedby=\"caption-attachment-170401\" style=\"width: 1000px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170401 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-50784-170400-1.png\" alt=\"Collage de capturas de pantalla de una computadora que muestra informaci\u00f3n sobre &quot;VS Stealer en Telegram&quot;, describiendo su uso como herramienta de hacking, con una lista de caracter\u00edsticas y detalles de precios. Tambi\u00e9n se puede ver un enlace de contacto de Telegram para facilitar la comunicaci\u00f3n.\" width=\"1000\" height=\"830\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-50784-170400-1.png 2048w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-50784-170400-1-530x440.png 530w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-50784-170400-1-844x700.png 844w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-50784-170400-1-768x637.png 768w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-50784-170400-1-1536x1274.png 1536w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><figcaption id=\"caption-attachment-170401\" class=\"wp-caption-text\">Figura 1. Anuncio de VVS stealer, enfocado en Telegram.<\/figcaption><\/figure>\n<p>El <em>stealer<\/em> tambi\u00e9n logra persistencia instal\u00e1ndose autom\u00e1ticamente al inicio. Opera sigilosamente mostrando mensajes de error falsos y capturando capturas de pantalla. Para una investigaci\u00f3n m\u00e1s profunda sobre la operaci\u00f3n, consulte el art\u00edculo de DeepCode,<a href=\"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-170400-_3leuoxva6xmk\"><\/a>An\u00e1lisis T\u00e9cnico<\/h2>\n<p>Esta secci\u00f3n analiza una muestra del malware VVS stealer protegida por Pyarmor con el siguiente hash SHA-256:<\/p>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">c7e6591e5e021daa30f949a6f6e0699ef2935d2d7c06ea006e3b201c52666e07<\/span><\/li>\n<\/ul>\n<p>La Figura 2 muestra un diagrama resumen que ilustra el flujo de trabajo completo del an\u00e1lisis de la muestra.<\/p>\n<figure id=\"attachment_170412\" aria-describedby=\"caption-attachment-170412\" style=\"width: 645px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170412 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-55385-170400-2.png\" alt=\"Diagrama de flujo que muestra el proceso de extracci\u00f3n de bytecode de Python de un ejecutable de PyInstaller, su descompilaci\u00f3n a c\u00f3digo fuente de Python y el descifrado de bytecode de Pyarmor a ELF.\" width=\"645\" height=\"194\" \/><figcaption id=\"caption-attachment-170412\" class=\"wp-caption-text\">Figura 2. Descripci\u00f3n general del flujo de trabajo para analizar la muestra de malware VVS stealer.<\/figcaption><\/figure>\n<h3><a id=\"post-170400-_urv60mzhrgrs\"><\/a><strong>Paso Uno: Extracci\u00f3n desde el binario de PyInstaller<\/strong><\/h3>\n<p>La muestra que analizamos se distribuye como un paquete de<a href=\"https:\/\/pyinstaller.org\" target=\"_blank\" rel=\"noopener\"> PyInstaller<\/a>. PyInstaller es una herramienta que empaqueta una aplicaci\u00f3n Python y sus dependencias en un paquete para permitir la ejecuci\u00f3n de una aplicaci\u00f3n empaquetada sin instalar m\u00f3dulos adicionales.<\/p>\n<p>Cualquier instalaci\u00f3n est\u00e1ndar de PyInstaller incluye la utilidad integrada <span style=\"font-family: 'courier new', courier, monospace;\"><a href=\"https:\/\/pyinstaller.org\/en\/stable\/advanced-topics.html\" target=\"_blank\" rel=\"noopener\">pyi-archive_viewer<\/a><\/span>. Utilizamos esta utilidad para extraer e inspeccionar los siguientes archivos de nuestra muestra:<\/p>\n<ul>\n<li>El archivo de <em>bytecode<\/em> de Python llamado <span style=\"font-family: 'courier new', courier, monospace;\">vvs<\/span><\/li>\n<li>El archivo de biblioteca de v\u00ednculos din\u00e1micos (DLL) del entorno de ejecuci\u00f3n de Pyarmor llamado <span style=\"font-family: 'courier new', courier, monospace;\">pyarmor_runtime.pyd<\/span>, ubicado en la subcarpeta <span style=\"font-family: 'courier new', courier, monospace;\">pyarmor_runtime_007444<\/span>\n<ul>\n<li>El archivo <span style=\"font-family: 'courier new', courier, monospace;\">__init__.py<\/span> adjunto dentro de esta misma subcarpeta, que incluye la siguiente informaci\u00f3n:\n<ul>\n<li>Versi\u00f3n de Pyarmor: 9.1.4 (<a href=\"https:\/\/pyarmor.readthedocs.io\/en\/latest\/licenses.html\" target=\"_blank\" rel=\"noopener\">Pro<\/a>)<\/li>\n<li>N\u00famero de licencia \u00fanico: 007444<\/li>\n<li>Marca de tiempo: 2025-04-27T11:04:52.523525<\/li>\n<li>Nombre del producto: <span style=\"font-family: 'courier new', courier, monospace;\">vvs<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Archivo DLL de Python 3.11 llamado <span style=\"font-family: 'courier new', courier, monospace;\">python311.dll<\/span>\n<ul>\n<li>La informaci\u00f3n de la versi\u00f3n del archivo indica que la versi\u00f3n de Python es 3.11.5<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>PyInstaller almacena el <em>bytecode<\/em> de Python (listado como <span style=\"font-family: 'courier new', courier, monospace;\">1.<\/span>) en su forma cruda (<em>raw<\/em>). Esta forma cruda se refiere a la secuencia de <em>bytecode<\/em> que comienza con el valor <span style=\"font-family: 'courier new', courier, monospace;\">e3<\/span>. El valor <span style=\"font-family: 'courier new', courier, monospace;\">e3<\/span> es una combinaci\u00f3n tanto de bandera (<span style=\"font-family: 'courier new', courier, monospace;\">flag<\/span>) como de tipo (<span style=\"font-family: 'courier new', courier, monospace;\">type<\/span>), combinada a trav\u00e9s de la constante <span style=\"font-family: 'courier new', courier, monospace;\">FLAG_REF<\/span>.<\/p>\n<p>El tipo representado por el valor e3 se calcula como: <span style=\"font-family: 'courier new', courier, monospace;\">type = e3<\/span> &amp; <span style=\"font-family: 'courier new', courier, monospace;\">~FLAG_REF<\/span>. Esto significa que el valor e3 es en realidad el tipo <span style=\"font-family: 'courier new', courier, monospace;\">0x63<\/span> (la letra c), tambi\u00e9n conocido como la constante de enumeraci\u00f3n <span style=\"font-family: 'courier new', courier, monospace;\">TYPE_CODE<\/span>. La implementaci\u00f3n completa de esta derivaci\u00f3n se puede encontrar en el<a href=\"https:\/\/github.com\/python\/cpython\/blob\/3.11\/Python\/marshal.c\" target=\"_blank\" rel=\"noopener\"> c\u00f3digo base de CPython 3.11<\/a>.<\/p>\n<p>La Figura 3 a continuaci\u00f3n muestra que este objeto de c\u00f3digo serializado por el m\u00f3dulo<a href=\"https:\/\/docs.python.org\/3\/library\/marshal.html\" target=\"_blank\" rel=\"noopener\">\u00a0<span style=\"font-family: 'courier new', courier, monospace;\">marshal<\/span><\/a> est\u00e1 desnudo (<em>bare<\/em>), le falta un encabezado acompa\u00f1ante de 16 bytes (marcado en <span style=\"color: #0000ff;\">azul<\/span>). Para proporcionar suficiente contexto de Python y que el descompilador no rechace el archivo, necesitamos restaurar al menos uno de los valores del encabezado (el n\u00famero m\u00e1gico de Python 3.11.5 en formato <em>little-endian<\/em> de 4 bytes) antes de la descompilaci\u00f3n, porque el descompilador de Python espera un archivo de <em>bytecode<\/em> de Python v\u00e1lido (<span style=\"font-family: 'courier new', courier, monospace;\">.pyc<\/span>) como entrada.<\/p>\n<figure id=\"attachment_170423\" aria-describedby=\"caption-attachment-170423\" style=\"width: 1000px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170423 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-57130-170400-3.jpeg\" alt=\"Visualizaci\u00f3n de datos hexadecimales que muestra filas de c\u00f3digos hex con algunos valores resaltados\" width=\"1000\" height=\"152\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-57130-170400-3.jpeg 2020w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-57130-170400-3-786x120.jpeg 786w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-57130-170400-3-1920x293.jpeg 1920w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-57130-170400-3-768x117.jpeg 768w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-57130-170400-3-1536x234.jpeg 1536w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><figcaption id=\"caption-attachment-170423\" class=\"wp-caption-text\">Figura 3. Archivo de bytecode de Python (<span style=\"font-family: 'courier new', courier, monospace;\">.pyc<\/span>) llamado <span style=\"font-family: 'courier new', courier, monospace;\">vvs<\/span>, con su encabezado restaurado.<\/figcaption><\/figure>\n<p>Comenzamos nuestro an\u00e1lisis descompilando el archivo de bytecode de Python (<span style=\"font-family: 'courier new', courier, monospace;\">.pyc<\/span>) llamado vvs para recuperar su c\u00f3digo fuente de Python equivalente (<span style=\"font-family: 'courier new', courier, monospace;\">.py<\/span>).<\/p>\n<h3><a id=\"post-170400-_f7skj08q5csc\"><\/a>Paso Dos: Descompilaci\u00f3n a c\u00f3digo fuente de Python<\/h3>\n<p><a href=\"https:\/\/github.com\/zrax\/pycdc\" target=\"_blank\" rel=\"noopener\">Pycdc<\/a> es un descompilador de bytecode de Python escrito en C++. Es parte del proyecto Decompyle++. Admite la descompilaci\u00f3n de bytecode de Python 3.11 \"de vuelta a c\u00f3digo fuente de Python v\u00e1lido y legible por humanos\". (Fuente:<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> es otro descompilador de bytecode de Python.<\/p>\n<p>Despu\u00e9s de clonar el repositorio de c\u00f3digo y compilar el c\u00f3digo base, el ejecutable generado se puede invocar de la siguiente manera para descompilar el bytecode de Python a c\u00f3digo fuente de Python a trav\u00e9s de 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>Esto producir\u00e1 el c\u00f3digo fuente de Python descompilado que se muestra en la Figura 4.<\/p>\n<figure id=\"attachment_170434\" aria-describedby=\"caption-attachment-170434\" style=\"width: 2004px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170434 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-59069-170400-4.jpeg\" alt=\"Captura de pantalla de una l\u00ednea de c\u00f3digo Python que incluye una declaraci\u00f3n de importaci\u00f3n de una biblioteca llamada &quot;pyarmor&quot;, con texto adicional oculto.\" width=\"2004\" height=\"225\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-59069-170400-4.jpeg 2004w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-59069-170400-4-786x88.jpeg 786w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-59069-170400-4-1920x216.jpeg 1920w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-59069-170400-4-768x86.jpeg 768w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-59069-170400-4-1536x172.jpeg 1536w\" sizes=\"(max-width: 2004px) 100vw, 2004px\" \/><figcaption id=\"caption-attachment-170434\" class=\"wp-caption-text\">Figura 4. C\u00f3digo fuente de Python <span style=\"font-family: 'courier new', courier, monospace;\">vvs<\/span> descompilado.<\/figcaption><\/figure>\n<p>Luego analizamos el \u00faltimo argumento de la funci\u00f3n, que se puede extraer a trav\u00e9s de<span style=\"font-family: 'courier new', courier, monospace;\"><a href=\"https:\/\/docs.python.org\/3\/library\/ast.html\" target=\"_blank\" rel=\"noopener\"> ast.NodeVisitor<\/a><\/span> de Python 3.<\/p>\n<h3><a id=\"post-170400-_occzqgue8hj6\"><\/a><strong>Paso Tres: Desentra\u00f1ando la ofuscaci\u00f3n de Pyarmor<\/strong><\/h3>\n<p>La carga \u00fatil (payload) comienza con el encabezado de Pyarmor que se muestra en la Figura 5.<\/p>\n<figure id=\"attachment_170445\" aria-describedby=\"caption-attachment-170445\" style=\"width: 1000px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170445 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-61006-170400-5.jpeg\" alt=\"Una captura de pantalla que muestra una secci\u00f3n de c\u00f3digo hexadecimal con caracteres ASCII en el lado derecho, incluida una cadena visible &quot;PY00744...&quot;.\" width=\"1000\" height=\"202\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-61006-170400-5.jpeg 2001w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-61006-170400-5-786x159.jpeg 786w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-61006-170400-5-1920x388.jpeg 1920w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-61006-170400-5-768x155.jpeg 768w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-61006-170400-5-1536x310.jpeg 1536w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><figcaption id=\"caption-attachment-170445\" class=\"wp-caption-text\">Figura 5. Encabezado de Pyarmor, con campos particulares de inter\u00e9s resaltados.<\/figcaption><\/figure>\n<p>La criptograf\u00eda se realiza en todo momento utilizando el algoritmo Est\u00e1ndar de Cifrado Avanzado (AES) con una clave de 128 bits, operando en modo Contador (CTR) con un valor inicial de dos (es decir, AES-128-CTR). La Tabla 1 muestra el desglose de los campos.<\/p>\n<table>\n<tbody>\n<tr>\n<td style=\"text-align: center;\"><strong>Desplazamientos (Offsets)<\/strong><\/td>\n<td style=\"text-align: center;\"><strong>Valores<\/strong><\/td>\n<td style=\"text-align: center;\"><strong>Descripci\u00f3n<\/strong><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">0x00 \u2026 0x07<\/span><\/td>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">PY007444<\/span><\/td>\n<td>Firma del archivo que contiene el n\u00famero de licencia \u00fanica<\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">0x09<\/span><\/td>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">03<\/span><\/td>\n<td>Versi\u00f3n mayor de Python<\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">0x0a<\/span><\/td>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">0b<\/span><\/td>\n<td>Versi\u00f3n menor de Python<\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">0x14<\/span><\/td>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">09<\/span><\/td>\n<td>Tipo de protecci\u00f3n:<\/p>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">09<\/span> si el<a href=\"https:\/\/pyarmor.readthedocs.io\/en\/stable\/topic\/bccmode.html\" target=\"_blank\" rel=\"noopener\"> modo BCC<\/a> de Pyarmor (explicado brevemente en la siguiente secci\u00f3n) est\u00e1 habilitado<\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">08<\/span> en caso contrario<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr style=\"height: 25px; background-color: yellow;\">\n<td><span style=\"font-family: 'courier new', courier, monospace;\">0x1c \u2026 0x1f<\/span><\/td>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">40 00 00 00<\/span><\/td>\n<td>Inicio del payload ELF, en formato little-endian<\/td>\n<\/tr>\n<tr style=\"height: 25px; background-color: yellow;\">\n<td><span style=\"font-family: 'courier new', courier, monospace;\">0x24 \u2026 0x27<\/span><\/td>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">12 c9 06 00<\/span><\/td>\n<td>Primeros cuatro bytes del nonce AES-128-CTR<\/td>\n<\/tr>\n<tr style=\"height: 25px; background-color: yellow;\">\n<td><span style=\"font-family: 'courier new', courier, monospace;\">0x2c \u2026 0x33<\/span><\/td>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">dc d2 98 a1 ea 11 fd f4<\/span><\/td>\n<td>Ocho bytes restantes del nonce AES-128-CTR<\/td>\n<\/tr>\n<tr style=\"height: 25px; background-color: yellow;\">\n<td><span style=\"font-family: 'courier new', courier, monospace;\">0x38 \u2026 0x3b<\/span><\/td>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">a0 7f 02 00<\/span><\/td>\n<td>Fin del payload ELF, en formato little-endian<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><em>Tabla 1. Desglose de campos presentes en el encabezado de Pyarmor.<\/em><\/p>\n<p>Este mismo patr\u00f3n (<span style=\"background-color: yellow;\">resaltado en amarillo<\/span>) se repite una vez m\u00e1s despu\u00e9s del final del <em>payload<\/em> ELF, para extraer y descifrar el <em>payload<\/em> de <em>bytecode<\/em> de Pyarmor.<\/p>\n<h4><a id=\"post-170400-_p47r31c4ovdx\"><\/a>Modo BCC<\/h4>\n<p>El modo BCC (probablemente una abreviatura de <em>ByteCode-to-Compilation<\/em>) convierte la mayor\u00eda de las \"funciones y m\u00e9todos en los scripts a funciones C equivalentes. Esas funciones C se compilar\u00e1n directamente a instrucciones de m\u00e1quina, luego ser\u00e1n llamadas por los scripts ofuscados.\" (Fuente:<a href=\"https:\/\/pyarmor.readthedocs.io\/en\/stable\/topic\/bccmode.html\" target=\"_blank\" rel=\"noopener\"> Documentaci\u00f3n de Pyarmor<\/a>).<\/p>\n<p>El modo BCC se invoca de la siguiente manera: <span style=\"font-family: 'courier new', courier, monospace;\">pyarmor gen --enable-bcc script.py<\/span>.<\/p>\n<p>Estas funciones C convertidas se almacenan en un archivo ELF separado, producido junto con el <em>bytecode<\/em> serializado (<em>marshaled<\/em>) por Pyarmor.<\/p>\n<p>El mapeo de constantes de Python a funciones BCC se puede obtener utilizando esta<a href=\"https:\/\/github.com\/GDATAAdvancedAnalytics\/Pyarmor-Tooling\/blob\/main\/bcc_info.py\" target=\"_blank\" rel=\"noopener\"> implementaci\u00f3n<\/a>. Por ejemplo, en el m\u00e9todo de 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__<\/span> se asigna a la funci\u00f3n BCC <span style=\"font-family: 'courier new', courier, monospace;\">bcc_180<\/span>, cuyo cuerpo de funci\u00f3n se encuentra en el desplazamiento <span style=\"font-family: 'courier new', courier, monospace;\">0x4e70<\/span> del archivo ELF.<\/p>\n<p>Haciendo referencia a<a href=\"https:\/\/cyber.wtf\/2025\/05\/30\/pyarmor-bcc-notes\" target=\"_blank\" rel=\"noopener\"> este an\u00e1lisis<\/a> del contenido del archivo ELF, especialmente la estructura <span style=\"font-family: 'courier new', courier, monospace;\">bcc_ftable<\/span>, la Figura 6 muestra parte de la funci\u00f3n BCC <span style=\"font-family: 'courier new', courier, monospace;\">bcc_180<\/span> descompilada:<\/p>\n<figure id=\"attachment_170456\" aria-describedby=\"caption-attachment-170456\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170456 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-63103-170400-6.png\" alt=\"Captura de pantalla que muestra dos im\u00e1genes lado a lado de ejemplos complejos de c\u00f3digo Python en una pantalla de computadora.\" width=\"800\" height=\"672\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-63103-170400-6.png 930w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-63103-170400-6-524x440.png 524w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-63103-170400-6-834x700.png 834w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-63103-170400-6-768x645.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-170456\" class=\"wp-caption-text\">Figura 6. Descompilaci\u00f3n de la funci\u00f3n BCC <span style=\"font-family: 'courier new', courier, monospace;\">bcc_180<\/span>.<\/figcaption><\/figure>\n<p>Podemos recuperar aproximadamente un equivalente del c\u00f3digo original del m\u00e9todo de Python <span style=\"font-family: 'courier new', courier, monospace;\">get_encryption_key<\/span>, como se muestra en la Figura 7.<\/p>\n<figure id=\"attachment_170467\" aria-describedby=\"caption-attachment-170467\" style=\"width: 700px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170467 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-65364-170400-7.png\" alt=\"Captura de pantalla de c\u00f3digo Python en un editor de texto, que muestra una funci\u00f3n para recuperar la clave de descifrado para navegadores Chromium con sintaxis resaltada.\" width=\"700\" height=\"188\" \/><figcaption id=\"caption-attachment-170467\" class=\"wp-caption-text\">Figura 7. C\u00f3digo Python equivalente del m\u00e9todo <span style=\"font-family: 'courier new', courier, monospace;\">get_encryption_key<\/span>.<\/figcaption><\/figure>\n<h4><a id=\"post-170400-_rfdjgsjvf75s\"><\/a>Formato de Bytecode Serializado (Marshaled)<\/h4>\n<p>El <em>bytecode<\/em> serializado de Pyarmor 9 difiere del <em>bytecode<\/em> est\u00e1ndar de Python 3.11 en varios aspectos. En primer lugar, el bit <span style=\"font-family: 'courier new', courier, monospace;\">0x20000000<\/span> se establece en el campo <span style=\"font-family: 'courier new', courier, monospace;\">co_flags<\/span> para indicar que est\u00e1 ofuscado por Pyarmor. En segundo lugar, hay un campo de datos adicional, cuya longitud se denota por el valor de su primer byte.<\/p>\n<p>Adem\u00e1s, <span style=\"font-family: 'courier new', courier, monospace;\"><a href=\"https:\/\/github.com\/python\/cpython\/blob\/3.11\/Objects\/codeobject.c\" target=\"_blank\" rel=\"noopener\">deopt_code()<\/a><\/span> debe estar deshabilitado para que la secuencia de <em>bytecode<\/em> se descifre con \u00e9xito. Discutiremos los par\u00e1metros criptogr\u00e1ficos en una secci\u00f3n posterior de este art\u00edculo.<\/p>\n<h4><a id=\"post-170400-_mv535820mrj0\"><\/a>Estructura del Objeto de C\u00f3digo<\/h4>\n<p>Los objetos de c\u00f3digo de Pyarmor est\u00e1n dise\u00f1ados especialmente, en el sentido de que deben contener ciertos artefactos. Es com\u00fan esperar encontrar la instrucci\u00f3n <span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST __pyarmor_enter_*__<\/span> en el pre\u00e1mbulo y la instrucci\u00f3n <span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST __pyarmor_exit_*__<\/span> en el cierre del desensamblado. Estas dos instrucciones envolver\u00edan el <em>bytecode<\/em> cifrado, como se muestra en la Tabla 2.<\/p>\n<table>\n<tbody>\n<tr>\n<td style=\"text-align: center;\"><strong>Operaci\u00f3n<\/strong><\/td>\n<td style=\"text-align: center;\"><strong>Argumento<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\" colspan=\"2\">\u2026<\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST<\/span><\/td>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">__pyarmor_enter_58592__<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST<\/span><\/td>\n<td><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>\n<td style=\"text-align: center;\" colspan=\"2\">\u2026 secuencia de bytecode cifrada (a examinar en la siguiente secci\u00f3n) \u2026<\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST<\/span><\/td>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">__pyarmor_exit_58593__<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST<\/span><\/td>\n<td><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>\n<td style=\"text-align: center;\" colspan=\"2\">\u2026<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: 10pt;\">Tabla 2. Instrucciones relacionadas con Pyarmor en el desensamblado de <span style=\"font-family: 'courier new', courier, monospace;\">&lt;module&gt;<\/span>.<\/span><\/p>\n<p>Una vez descifrada la secuencia de <em>bytecode<\/em> cifrada, podr\u00eda revelar cadenas cifradas o invocaciones de funciones BCC. Las cadenas cifradas (revisadas en una secci\u00f3n posterior de este art\u00edculo) est\u00e1n precedidas por una instrucci\u00f3n <span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST __pyarmor_assert_*__<\/span>. Tambi\u00e9n existe la instrucci\u00f3n <span style=\"font-family: 'courier new', courier, monospace;\">LOAD_CONST __pyarmor_bcc_*__<\/span> para invocar una funci\u00f3n BCC (revisada anteriormente en este art\u00edculo).<\/p>\n<h4><a id=\"post-170400-_hzb4mgar059d\"><\/a>Cifrado del Objeto de C\u00f3digo<\/h4>\n<p>Las secuencias de <em>bytecode<\/em> entre el marcador de inicio (<span style=\"font-family: 'courier new', courier, monospace;\">__pyarmor_enter_*__<\/span>) y el marcador final (<span style=\"font-family: 'courier new', courier, monospace;\">__pyarmor_exit_*__<\/span>) est\u00e1n cifradas con AES-128-CTR. La clave AES asociada (<span style=\"font-family: 'courier new', courier, monospace;\">273b1b1373cf25e054a61e2cb8a947b8<\/span>)<a href=\"https:\/\/github.com\/Lil-House\/Pyarmor-Static-Unpack-1shot\/blob\/main\/helpers\/runtime.py\" target=\"_blank\" rel=\"noopener\"> se extrae de<\/a> la DLL del entorno de ejecuci\u00f3n de Pyarmor vinculada al n\u00famero de licencia \u00fanico.<\/p>\n<p>Por otro lado, la clave XOR del <em>nonce<\/em> AES correspondiente (<span style=\"font-family: 'courier new', courier, monospace;\">2db99d18a0763ed70bbd6b3c<\/span>) solo es espec\u00edfica para el <em>payload<\/em> de <em>bytecode<\/em> de Pyarmor, para lo cual<a href=\"https:\/\/github.com\/Lil-House\/Pyarmor-Static-Unpack-1shot\/blob\/main\/pyc_module.cpp\" target=\"_blank\" rel=\"noopener\"> hay una implementaci\u00f3n<\/a> de la l\u00f3gica para extraer este valor. Esta clave se somete a XOR con los 12 bytes en el marcador final (<span style=\"font-family: 'courier new', courier, monospace;\">__pyarmor_exit_*__<\/span>) para producir el <em>nonce<\/em> AES correcto utilizado en el descifrado.<\/p>\n<h4><a id=\"post-170400-_gjqwzdzcprke\"><\/a>Cifrado de Cadenas<\/h4>\n<p>De manera similar, las constantes de cadena de m\u00e1s de ocho caracteres est\u00e1n cifradas con AES-128-CTR (conocido como<a href=\"https:\/\/pyarmor.readthedocs.io\/en\/latest\/tutorial\/obfuscation.html\" target=\"_blank\" rel=\"noopener\"> \"mixto\" en la terminolog\u00eda de Pyarmor<\/a>). La clave AES asociada tambi\u00e9n es <span style=\"font-family: 'courier new', courier, monospace;\">273b1b1373cf25e054a61e2cb8a947b8<\/span>, pero esta vez, el <em>nonce<\/em> AES correspondiente (<span style=\"font-family: 'courier new', courier, monospace;\">692e767673e95c45a1e6876d<\/span>)<a href=\"https:\/\/github.com\/Lil-House\/Pyarmor-Static-Unpack-1shot\/blob\/main\/helpers\/runtime.py\" target=\"_blank\" rel=\"noopener\"> se calcula desde<\/a> la DLL del entorno de ejecuci\u00f3n de Pyarmor vinculada al n\u00famero de licencia \u00fanico.<\/p>\n<p>Adem\u00e1s, un valor de prefijo <span style=\"font-family: 'courier new', courier, monospace;\">0x81<\/span> denota que la constante de cadena est\u00e1 cifrada. De lo contrario, se utiliza un valor de prefijo <span style=\"font-family: 'courier new', courier, monospace;\">0x01<\/span> en su lugar.<\/p>\n<p>Ahora que la protecci\u00f3n de Pyarmor est\u00e1 desarmada, procederemos a cubrir algunas de las capacidades clave de VVS stealer en la siguiente secci\u00f3n.<\/p>\n<h2><a id=\"post-170400-_rmfoukg6ygqz\"><\/a>Capacidades del Malware<\/h2>\n<p>Con las capas de ofuscaci\u00f3n de Pyarmor \u2014incluyendo el modo BCC y el cifrado de cadenas AES-128-CTR\u2014 eliminadas con \u00e9xito, pudimos exponer la l\u00f3gica de Python subyacente. Este c\u00f3digo desofuscado revel\u00f3 un <em>stealer<\/em> dise\u00f1ado no solo para la exfiltraci\u00f3n de datos, sino tambi\u00e9n para el secuestro activo de sesiones y la persistencia. La siguiente secci\u00f3n detalla las capacidades operativas espec\u00edficas de VVS stealer que se descubrieron durante este an\u00e1lisis.<\/p>\n<p>La muestra de malware expira despu\u00e9s del <span style=\"font-family: 'courier new', courier, monospace;\">2026-10-31 23:59:59<\/span>. Dejar\u00e1 de funcionar termin\u00e1ndose prematuramente.<\/p>\n<p>La muestra de malware realiza todas las solicitudes HTTP enviando la cadena fija de User-Agent <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>Ahora proporcionaremos una descripci\u00f3n general de las principales capacidades del malware, tal como se anuncian en Telegram.<\/p>\n<h3><a id=\"post-170400-_k89rs0tuatdh\"><\/a><strong>Datos de<\/strong> Discord<\/h3>\n<p>La muestra de malware primero busca posibles tokens de Discord cifrados. Los tokens de Discord cifrados son cadenas que comienzan con el prefijo<a href=\"https:\/\/www.google.com\/search?q=%5Bhttps:\/\/www.google.com\/url%3Fq%3Dhttps:\/\/reddit.com\/r\/discordapp\/comments\/tyb1u0\/discord_easter_egg_all_encrypted_discord_tokens%26sa%3DD%26source%3Deditors%26ust%3D1767729307221381%26usg%3DAOvVaw1v6XmOiCuDZvEnkMzWHc9A%5D(https:\/\/www.google.com\/url%3Fq%3Dhttps:\/\/reddit.com\/r\/discordapp\/comments\/tyb1u0\/discord_easter_egg_all_encrypted_discord_tokens%26sa%3DD%26source%3Deditors%26ust%3D1767729307221381%26usg%3DAOvVaw1v6XmOiCuDZvEnkMzWHc9A)\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: 'courier new', courier, monospace;\"> dQw4w9WgXcQ<\/span>:<\/a>. La muestra de malware utiliza expresiones regulares para formar un patr\u00f3n a partir de este prefijo de cadena. Luego utiliza este patr\u00f3n para buscar dentro del contenido de archivos con las extensiones <span style=\"font-family: 'courier new', courier, monospace;\">.ldb<\/span> o <span style=\"font-family: 'courier new', courier, monospace;\">.log<\/span>, almacenados dentro del directorio<a href=\"https:\/\/en.wikipedia.org\/wiki\/LevelDB\" target=\"_blank\" rel=\"noopener\"> LevelDB<\/a>.<\/p>\n<p>A continuaci\u00f3n, la muestra de malware descifra el valor <span style=\"font-family: 'courier new', courier, monospace;\">encrypted_key<\/span> en el archivo <span style=\"font-family: 'courier new', courier, monospace;\">Local State<\/span>, a trav\u00e9s de la<a href=\"https:\/\/en.wikipedia.org\/wiki\/Data_Protection_API\" target=\"_blank\" rel=\"noopener\"> Interfaz de Programaci\u00f3n de Aplicaciones de Protecci\u00f3n de Datos (DPAPI)<\/a>. Con este valor <span style=\"font-family: 'courier new', courier, monospace;\">encrypted_key<\/span> descifrado como par\u00e1metro de clave AES, la muestra de malware aplica el algoritmo AES, operando en modo Galois\/Counter Mode (GCM), sobre los tokens de Discord cifrados para descifrarlos.<\/p>\n<p>Luego, la muestra de malware utiliza los tokens de Discord descifrados para consultar varios puntos finales (<em>endpoints<\/em>) de la interfaz de programaci\u00f3n de aplicaciones (API) de Discord para obtener informaci\u00f3n del usuario, incluyendo:<\/p>\n<ul>\n<li>Suscripci\u00f3n<a href=\"https:\/\/discord.com\/nitro\" target=\"_blank\" rel=\"noopener\"> Nitro<\/a> (caracter\u00edsticas Premium de Discord)<\/li>\n<li>M\u00e9todos de pago<\/li>\n<li>ID de usuario<\/li>\n<li>Nombre de usuario<\/li>\n<li>Correo electr\u00f3nico<\/li>\n<li>N\u00famero de tel\u00e9fono<\/li>\n<li>Amigos<\/li>\n<li>Gremios (<em>Guilds<\/em>)<\/li>\n<li>Estado de autenticaci\u00f3n multifactor (MFA)<\/li>\n<li>Configuraci\u00f3n regional (<em>Locale<\/em>)<\/li>\n<li>Estado de verificaci\u00f3n<\/li>\n<li>Imagen de avatar<\/li>\n<li>Direcci\u00f3n IP (a trav\u00e9s del servicio<a href=\"https:\/\/ipify.org\" target=\"_blank\" rel=\"noopener\"> ipify<\/a>)<\/li>\n<li>Nombre de la computadora<\/li>\n<\/ul>\n<p>Despu\u00e9s de recopilar toda esta informaci\u00f3n, la muestra de malware procede a exfiltrarla en formato de Notaci\u00f3n de Objetos de JavaScript (JSON). La exfiltraci\u00f3n se realiza a trav\u00e9s de solicitudes HTTP POST a los <em>endpoints<\/em> de webhook predefinidos (variable de entorno <span style=\"font-family: 'courier new', courier, monospace;\">%WEBHOOK%<\/span> y URL de respaldo codificadas).<\/p>\n<p>Los <em>webhooks<\/em> son \"una forma de bajo esfuerzo para publicar mensajes en canales de Discord. No requieren un usuario bot ni autenticaci\u00f3n para usarse.\" (Fuente:<a href=\"https:\/\/support.discord.com\/hc\/en-us\/articles\/228383668-Intro-to-Webhooks\" target=\"_blank\" rel=\"noopener\"> Portal de Desarrolladores de Discord<\/a>).<\/p>\n<h3><a id=\"post-170400-_6r2kvekkcytc\"><\/a><strong>Inyecci\u00f3n<\/strong> en<strong> Discord<\/strong><\/h3>\n<p>El c\u00f3digo responsable de esta funcionalidad est\u00e1 en la clase <span style=\"font-family: 'courier new', courier, monospace;\">Inj<\/span>, probablemente una abreviatura de <em>Injection<\/em> (Inyecci\u00f3n).<\/p>\n<p>En esta clase, la muestra de malware primero elimina los procesos de la aplicaci\u00f3n Discord en ejecuci\u00f3n, si hay alguno ejecut\u00e1ndose. Luego descarga el <em>payload<\/em> de JavaScript (JS) desde un archivo remoto llamado <span style=\"font-family: 'courier new', courier, monospace;\">injection-obf.js<\/span> (el sufijo <span style=\"font-family: 'courier new', courier, monospace;\">-obf<\/span> probablemente significa una versi\u00f3n ofuscada del script), reemplazando la URL del <em>endpoint<\/em> del webhook y <span style=\"font-family: 'courier new', courier, monospace;\">discord_desktop_core<\/span>, dentro del directorio de la aplicaci\u00f3n Discord. Este archivo JS est\u00e1 ofuscado por la<a href=\"https:\/\/obfuscator.io\" target=\"_blank\" rel=\"noopener\"> Herramienta de Ofuscaci\u00f3n de JavaScript<\/a> y puede ser desofuscado a trav\u00e9s del<a href=\"https:\/\/obf-io.deobfuscate.io\" target=\"_blank\" rel=\"noopener\"> Desofuscador de Obfuscator.io<\/a>.<\/p>\n<p>Algunas de las funcionalidades principales del c\u00f3digo JS inyectado se destacan en las siguientes capturas de pantalla, comenzando con su configuraci\u00f3n y fragmentos de c\u00f3digo de exfiltraci\u00f3n, que se muestran en la Figura 8.<\/p>\n<figure id=\"attachment_170478\" aria-describedby=\"caption-attachment-170478\" style=\"width: 700px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170478 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-67161-170400-8.png\" alt=\"Captura de pantalla de un archivo de configuraci\u00f3n de JavaScript que incluye URL y rutas relacionadas con una API de Discord y una puerta de enlace de autorizaci\u00f3n remota. El c\u00f3digo se muestra en un editor de texto con resaltado de sintaxis\" width=\"700\" height=\"911\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-67161-170400-8.png 531w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-67161-170400-8-338x440.png 338w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-170478\" class=\"wp-caption-text\">Figura 8. Configuraci\u00f3n y exfiltraci\u00f3n del JS inyectado.<\/figcaption><\/figure>\n<p>La Figura 8 muestra el c\u00f3digo JS inyectado responsable de establecer persistencia en la aplicaci\u00f3n Discord, basado en el framework<a href=\"https:\/\/electronjs.org\" target=\"_blank\" rel=\"noopener\"> Electron<\/a>. Este framework utiliza archivos de formato Atom Shell Archive (<a href=\"https:\/\/electronjs.org\/docs\/latest\/tutorial\/asar-archives\" target=\"_blank\" rel=\"noopener\">ASAR<\/a>) para agrupar todo el c\u00f3digo base de la aplicaci\u00f3n en un solo archivo, como se muestra en la Figura 9.<\/p>\n<figure id=\"attachment_170489\" aria-describedby=\"caption-attachment-170489\" style=\"width: 700px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170489 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-69154-170400-9.png\" alt=\"Captura de pantalla de un fragmento de c\u00f3digo relacionado con una funci\u00f3n de inicializaci\u00f3n de software, que menciona rutas y configuraci\u00f3n para &quot;app.js&quot;, &quot;index.js&quot; y &quot;discord.js&quot;. El c\u00f3digo est\u00e1 escrito en JavaScript.\" width=\"700\" height=\"434\" \/><figcaption id=\"caption-attachment-170489\" class=\"wp-caption-text\">Figura 9. C\u00f3digo JS inyectado para realizar persistencia.<\/figcaption><\/figure>\n<p>La Figura 10 muestra el c\u00f3digo JS inyectado responsable de monitorear el tr\u00e1fico de red a trav\u00e9s del<a href=\"https:\/\/chromedevtools.github.io\/devtools-protocol\/tot\/Network\" target=\"_blank\" rel=\"noopener\"> Protocolo de DevTools de Chrome<\/a> (CDP).<\/p>\n<figure id=\"attachment_170500\" aria-describedby=\"caption-attachment-170500\" style=\"width: 700px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170500 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-71090-170400-10.png\" alt=\"Captura de pantalla de c\u00f3digo de software en un editor, que muestra una funci\u00f3n de JavaScript relacionada con la red.\" width=\"700\" height=\"571\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-71090-170400-10.png 664w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-71090-170400-10-539x440.png 539w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-170500\" class=\"wp-caption-text\">Figura 10. C\u00f3digo JS inyectado para monitorear el tr\u00e1fico de red.<\/figcaption><\/figure>\n<p>La Figura 11 muestra funciones de utilidad de apoyo y <em>hooks<\/em> de eventos en el c\u00f3digo JS inyectado. Los hooks de eventos son funciones de devoluci\u00f3n de llamada (callbacks) que se ejecutan cuando el usuario de la aplicaci\u00f3n Discord realiza una acci\u00f3n espec\u00edfica. Las acciones de inter\u00e9s son cuando el usuario ve sus c\u00f3digos de respaldo, cambia su contrase\u00f1a o agrega un m\u00e9todo de pago. Las funciones callback vinculadas a estas acciones son capaces de recopilar la cuenta de usuario de Discord y la informaci\u00f3n de facturaci\u00f3n.<\/p>\n<figure id=\"attachment_170511\" aria-describedby=\"caption-attachment-170511\" style=\"width: 700px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170511 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-73100-170400-11.png\" alt=\"Captura de pantalla de un editor de c\u00f3digo inform\u00e1tico que muestra varias l\u00edneas de c\u00f3digo JavaScript, que incluye funciones relacionadas con el manejo de datos de usuario y solicitudes de API.\" width=\"700\" height=\"488\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-73100-170400-11.png 673w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-73100-170400-11-631x440.png 631w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-170511\" class=\"wp-caption-text\">Figure 11. Injected JS code of utility functions and event hooks.<\/figcaption><\/figure>\n<p>Posteriormente, la muestra de malware reinicia un proceso de aplicaci\u00f3n Discord comprometido a trav\u00e9s de <span style=\"font-family: 'courier new', courier, monospace;\">Update.exe<\/span>, lo cual hace con el modificador de l\u00ednea de comandos <span style=\"font-family: 'courier new', courier, monospace;\">--processStart<\/span>.<\/p>\n<h3><a id=\"post-170400-_gfl127xpi6os\"><\/a><strong>Datos del Navegador Web<\/strong><\/h3>\n<p>La muestra de malware ataca una lista de aplicaciones de navegador web, incluyendo:<\/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 estos objetivos, la muestra de malware extrae los siguientes datos, donde est\u00e9n presentes:<\/p>\n<ul>\n<li>Autocompletado<\/li>\n<li>Cookies<\/li>\n<li>Historial<\/li>\n<li>Contrase\u00f1as<\/li>\n<\/ul>\n<p>Una vez extra\u00eddos estos datos, la muestra de malware los prepara para la exfiltraci\u00f3n comprimi\u00e9ndolos en un solo archivo ZIP llamado <span style=\"font-family: 'courier new', courier, monospace;\">&lt;USERNAME&gt;_vault.zip<\/span>. Luego exfiltra este archivo a trav\u00e9s de solicitudes HTTP POST a los <em>endpoints<\/em> de <em>webhook<\/em> predefinidos, similar al proceso de exfiltraci\u00f3n de datos de Discord.<\/p>\n<h3><a id=\"post-170400-_a204dkgh0yy9\"><\/a>Persistencia en<strong> el Inicio<\/strong><\/h3>\n<p>La muestra de malware se copia a s\u00ed misma en la carpeta <span style=\"font-family: 'courier new', courier, monospace;\">%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup<\/span> para lograr persistencia en el inicio. El malware permanece en el dispositivo del usuario, permiti\u00e9ndole continuar exfiltrando datos si, por ejemplo, el usuario intenta instalar una copia nueva de la aplicaci\u00f3n Discord.<\/p>\n<h3><a id=\"post-170400-_z6w269r4wmpq\"><\/a>Error<strong> Falso<\/strong><\/h3>\n<p>La muestra de malware utiliza la API Win32, espec\u00edficamente la funci\u00f3n MessageBoxW en la biblioteca <span style=\"font-family: 'courier new', courier, monospace;\">User32.dll<\/span>, para mostrar un cuadro de mensaje modal sobre un error fatal falso que requiere reiniciar la computadora. Un cuadro de mensaje modal es una peque\u00f1a ventana de di\u00e1logo que requiere la interacci\u00f3n del usuario antes de que la aplicaci\u00f3n pueda continuar, como se muestra en la Figura 12.<\/p>\n<figure id=\"attachment_170522\" aria-describedby=\"caption-attachment-170522\" style=\"width: 500px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-170522 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/01\/word-image-74945-170400-12.png\" alt=\"Cuadro de di\u00e1logo de mensaje de error que muestra &quot;Fatal Error&quot; con el c\u00f3digo de error 0x80070002 y una sugerencia para reiniciar la computadora. Hay un bot\u00f3n &quot;OK&quot; presente para confirmar.\" width=\"500\" height=\"275\" \/><figcaption id=\"caption-attachment-170522\" class=\"wp-caption-text\">Figura 12. Un cuadro de mensaje falso que indica a la v\u00edctima que reinicie la computadora.<\/figcaption><\/figure>\n<h2><a id=\"post-170400-_cpahs3gfzfoa\"><\/a>Conclusi\u00f3n<\/h2>\n<p>VVS stealer demuestra c\u00f3mo herramientas como Pyarmor, que pueden usarse con fines leg\u00edtimos, tambi\u00e9n pueden aprovecharse para crear malware sigiloso destinado a secuestrar credenciales para plataformas populares como Discord. Su aparici\u00f3n se\u00f1ala la necesidad de que los defensores fortalezcan el monitoreo en torno al robo de credenciales y el abuso de cuentas.<\/p>\n<h3><a id=\"post-170400-_b19ew0xx77xo\"><\/a><strong>Protecci\u00f3n y Mitigaci\u00f3n de Palo Alto Networks<\/strong><\/h3>\n<p>Los clientes de Palo Alto Networks est\u00e1n mejor protegidos contra las amenazas discutidas anteriormente a trav\u00e9s de los siguientes productos:<\/p>\n<p>Los modelos de aprendizaje autom\u00e1tico y las t\u00e9cnicas de an\u00e1lisis de<a href=\"https:\/\/docs.paloaltonetworks.com\/wildfire\" target=\"_blank\" rel=\"noopener\"> Advanced WildFire<\/a> han sido revisados y actualizados a la luz de los indicadores compartidos en esta investigaci\u00f3n.<\/p>\n<p><a href=\"https:\/\/docs.paloaltonetworks.com\/advanced-url-filtering\/administration\" target=\"_blank\" rel=\"noopener\">Advanced URL Filtering<\/a> y<a href=\"https:\/\/docs.paloaltonetworks.com\/dns-security\" target=\"_blank\" rel=\"noopener\"> Advanced DNS Security<\/a> identifican los dominios y URL conocidos asociados con esta actividad como maliciosos.<\/p>\n<p><a href=\"https:\/\/docs-cortex.paloaltonetworks.com\/p\/XDR\" target=\"_blank\" rel=\"noopener\">Cortex XDR<\/a> y<a href=\"https:\/\/docs-cortex.paloaltonetworks.com\/p\/XSIAM\" target=\"_blank\" rel=\"noopener\"> XSIAM<\/a> previenen las amenazas descritas en este art\u00edculo empleando el<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>. Este enfoque combina varias capas de protecci\u00f3n, incluyendo<a href=\"https:\/\/docs.paloaltonetworks.com\/wildfire\" target=\"_blank\" rel=\"noopener\"> Advanced WildFire<\/a>, Protecci\u00f3n contra Amenazas de Comportamiento (Behavioral Threat Protection) y el m\u00f3dulo de An\u00e1lisis Local, para evitar que tanto el malware conocido como el desconocido causen da\u00f1o a los <em>endpoints<\/em>.<\/p>\n<p>Si cree que puede haber sido comprometido o tiene un asunto urgente, p\u00f3ngase en contacto con el<a href=\"https:\/\/start.paloaltonetworks.com\/contact-unit42.html\" target=\"_blank\" rel=\"noopener\"> equipo de Respuesta a Incidentes de Unit 42<\/a> o llame al:<\/p>\n<ul>\n<li>Norteam\u00e9rica: Llamada gratuita: +1 (866) 486-4842 (866.4.UNIT42)<\/li>\n<li>Reino Unido: +44.20.3743.3660<\/li>\n<li>Europa y Medio Oriente: +31.20.299.3130<\/li>\n<li>Asia: +65.6983.8730<\/li>\n<li>Jap\u00f3n: +81.50.1790.0200<\/li>\n<li>Australia: +61.2.4062.7950<\/li>\n<li>India: 000 800 050 45107<\/li>\n<li>Corea del Sur: +82.080.467.8774<\/li>\n<\/ul>\n<p>Palo Alto Networks ha compartido estos hallazgos con nuestros miembros compa\u00f1eros de la Cyber Threat Alliance (CTA). Los miembros de la CTA utilizan esta inteligencia para implementar r\u00e1pidamente protecciones para sus clientes y para interrumpir sistem\u00e1ticamente a los actores cibern\u00e9ticos maliciosos. Obtenga m\u00e1s informaci\u00f3n sobre la<a href=\"https:\/\/www.cyberthreatalliance.org\" target=\"_blank\" rel=\"noopener\"> Cyber Threat Alliance<\/a>.<\/p>\n<h2><a id=\"post-170400-_ayszyuio8tqx\"><\/a>Indicadores de Compromiso<\/h2>\n<p>Hashes SHA-256 de muestras de malware:<\/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>URLs de webhook de 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-170400-_lncfpz4byjwc\"><\/a>Recursos Adicionales<\/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 y 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>VVS stealer (o VVS $tealer) es un infostealer basado en Python que tiene como objetivo a los usuarios de Discord. Emplea Pyarmor para su ofuscaci\u00f3n, lo que contribuye a su eficacia.<\/p>\n","protected":false},"author":366,"featured_media":146012,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[8838,8793],"tags":[9873,9197,9549,9794],"product_categories":[8922,8924,8925,8934,8935,8890],"coauthors":[4282,3893],"class_list":["post-170400","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-threat-research-es-la","category-malware-es-la","tag-discord","tag-infostealer-es-la","tag-python-es-la","tag-telegram-es-la","product_categories-advanced-dns-security-es-la","product_categories-advanced-url-filtering-es-la","product_categories-advanced-wildfire-es-la","product_categories-cortex-xdr-es-la","product_categories-cortex-xsiam-es-la","product_categories-unit-42-incident-response-es-la"],"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>VVS Discord Stealer utiliza Pyarmor para ofuscaci\u00f3n y evasi\u00f3n de detecci\u00f3n<\/title>\n<meta name=\"description\" content=\"VVS stealer (o VVS $tealer) es un infostealer basado en Python que tiene como objetivo a los usuarios de Discord. Emplea Pyarmor para su ofuscaci\u00f3n, lo que contribuye a su eficacia.\" \/>\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\/es-la\/vvs-stealer\/\" \/>\n<meta property=\"og:locale\" content=\"es_LA\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"VVS Discord Stealer utiliza Pyarmor para ofuscaci\u00f3n y evasi\u00f3n de detecci\u00f3n\" \/>\n<meta property=\"og:description\" content=\"VVS stealer (o VVS $tealer) es un infostealer basado en Python que tiene como objetivo a los usuarios de Discord. Emplea Pyarmor para su ofuscaci\u00f3n, lo que contribuye a su eficacia.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/\" \/>\n<meta property=\"og:site_name\" content=\"Unit 42\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-02T14:03:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-13T16:16:51+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":"VVS Discord Stealer utiliza Pyarmor para ofuscaci\u00f3n y evasi\u00f3n de detecci\u00f3n","description":"VVS stealer (o VVS $tealer) es un infostealer basado en Python que tiene como objetivo a los usuarios de Discord. Emplea Pyarmor para su ofuscaci\u00f3n, lo que contribuye a su eficacia.","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\/es-la\/vvs-stealer\/","og_locale":"es_LA","og_type":"article","og_title":"VVS Discord Stealer utiliza Pyarmor para ofuscaci\u00f3n y evasi\u00f3n de detecci\u00f3n","og_description":"VVS stealer (o VVS $tealer) es un infostealer basado en Python que tiene como objetivo a los usuarios de Discord. Emplea Pyarmor para su ofuscaci\u00f3n, lo que contribuye a su eficacia.","og_url":"https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/","og_site_name":"Unit 42","article_published_time":"2026-01-02T14:03:47+00:00","article_modified_time":"2026-02-13T16:16:51+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\/es-la\/vvs-stealer\/#article","isPartOf":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/"},"author":{"name":"Sheida Azimi","@id":"https:\/\/unit42.paloaltonetworks.com\/#\/schema\/person\/7ee97ec6f224446d57c0383eb5fd3639"},"headline":"VVS Discord Stealer utiliza Pyarmor para ofuscaci\u00f3n y evasi\u00f3n de detecci\u00f3n","datePublished":"2026-01-02T14:03:47+00:00","dateModified":"2026-02-13T16:16:51+00:00","mainEntityOfPage":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/"},"wordCount":3765,"image":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/#primaryimage"},"thumbnailUrl":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/07\/07_Malware_Category_1920x900.jpg","keywords":["Discord","Infostealer","Python","Telegram"],"articleSection":["Investigaci\u00f3n de amenazas","Malware"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/","url":"https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/","name":"VVS Discord Stealer utiliza Pyarmor para ofuscaci\u00f3n y evasi\u00f3n de detecci\u00f3n","isPartOf":{"@id":"https:\/\/unit42.paloaltonetworks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/#primaryimage"},"image":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/#primaryimage"},"thumbnailUrl":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/07\/07_Malware_Category_1920x900.jpg","datePublished":"2026-01-02T14:03:47+00:00","dateModified":"2026-02-13T16:16:51+00:00","author":{"@id":"https:\/\/unit42.paloaltonetworks.com\/#\/schema\/person\/7ee97ec6f224446d57c0383eb5fd3639"},"description":"VVS stealer (o VVS $tealer) es un infostealer basado en Python que tiene como objetivo a los usuarios de Discord. Emplea Pyarmor para su ofuscaci\u00f3n, lo que contribuye a su eficacia.","breadcrumb":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/vvs-stealer\/#primaryimage","url":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/07\/07_Malware_Category_1920x900.jpg","contentUrl":"https:\/\/origin-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\/es-la\/vvs-stealer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/unit42.paloaltonetworks.com\/"},{"@type":"ListItem","position":2,"name":"VVS Discord Stealer utiliza Pyarmor para ofuscaci\u00f3n y evasi\u00f3n de detecci\u00f3n"}]},{"@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":"es"},{"@type":"Person","@id":"https:\/\/unit42.paloaltonetworks.com\/#\/schema\/person\/7ee97ec6f224446d57c0383eb5fd3639","name":"Sheida Azimi","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/unit42.paloaltonetworks.com\/#\/schema\/person\/image\/9213e49ea48b7676660bac40d05c9e3e","url":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2018\/11\/unit-news-meta.svg","contentUrl":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2018\/11\/unit-news-meta.svg","caption":"Sheida Azimi"},"url":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/author\/sheida-azimi\/"}]}},"_links":{"self":[{"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/posts\/170400","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/users\/366"}],"replies":[{"embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/comments?post=170400"}],"version-history":[{"count":2,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/posts\/170400\/revisions"}],"predecessor-version":[{"id":173012,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/posts\/170400\/revisions\/173012"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/media\/146012"}],"wp:attachment":[{"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/media?parent=170400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/categories?post=170400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/tags?post=170400"},{"taxonomy":"product_categories","embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/product_categories?post=170400"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/coauthors?post=170400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}