← Reports

Remote Access Trojan · Worm · Dropper

VioletWorm - game.exe

Author
Moise Medici
Updated
07 Sept 2026 · Completed
Difficulty
Easy
Platform
Windows
Capabilities
Dropping Secondary PayloadsPersistence MechanismsCommand and Control C2 CommunicationCommand Execution via Powershell Cmd BashData-ExfiltrationFile EncryptionKeyloggingScreen CaptureWebcam AccessClipboard ManipulationCredential TheftAMSI and ETW BypassSandbox and VM EvasionReflective Code LoadingUSB SpreadingDenial of Service
Tags
pythonC#

Basic Analysis

FLOSS was first run with -n 12 and then without any length filtering. Checking the filtered list first gives a quicker view of the output before moving on to a more detailed review.

Around line 100 of the FLOSS output there are indications that the file might be a compiled Python file:

Error on file.
Py_DecodeLocale
Py_IsInitialized
Py_PreInitialize
PyInitConfig_Create
PyInitConfig_Free
PyInitConfig_SetInt
PyInitConfig_SetStr

And around line 270 it hints at pyInstaller:

_pyinstaller_pyz
PYZ archive entry not found in the TOC!

At this point, it is worth checking whether the executable can be decompiled back into source code. This is done in two stages: unpacking the executable into compiled Python files and then decompiling the .pyc files into Python source code.

The extraction can be done using pyinstxtractor 1:

Terminal window
$ uv run -p 3.14 extractor.py e450b7efc8b429b618d2d22a074a3dd55c07b451eef315e0e20be7d9054ef18c.exe
[+] Processing e450b7efc8b429b618d2d22a074a3dd55c07b451eef315e0e20be7d9054ef18c.exe
[+] Pyinstaller version: 2.1+
[+] Python version: 3.14
[+] Length of package: 12344292 bytes
[+] Found 38 files in CArchive
[+] Beginning extraction...please standby
[+] Possible entry point: pyiboot01_bootstrap.pyc
[+] Possible entry point: pyi_rth_cryptography_openssl.pyc
[+] Possible entry point: pyi_rth_inspect.pyc
[+] Possible entry point: loader.pyc
[+] Found 164 files in PYZ archive
[+] Successfully extracted pyinstaller archive: e450b7efc8b429b618d2d22a074a3dd55c07b451eef315e0e20be7d9054ef18c.exe
You can now use a python decompiler on the pyc files within the extracted directory
remnux@remnux:~/malware/mallearn/python/exe$

The extraction had to be run twice: first with the default Python interpreter, which is 3.11 on this REMnux system, and then again with Python 3.14, as the script suggested, to avoid errors in the next step.

The first two levels of the unpacked directory structure are:

  • base_library.zip
    • _bz2.pyd
    • _cffi_backend.cp314-win_amd64.pyd
    • cryptography
      • hazmat
    • cryptography-46.0.3.dist-info
      • INSTALLER
      • licenses
      • METADATA
      • RECORD
      • REQUESTED
      • WHEEL
    • _ctypes.pyd
    • _decimal.pyd
    • _hashlib.pyd
    • libcrypto-3.dll
    • libffi-8.dll
    • libssl-3.dll
    • loader.pyc
    • _lzma.pyd
    • pyiboot01_bootstrap.pyc
    • pyimod01_archive.pyc
    • pyimod02_importers.pyc
    • pyimod03_ctypes.pyc
    • pyimod04_pywin32.pyc
    • pyi_rth_cryptography_openssl.pyc
    • pyi_rth_inspect.pyc
    • python314.dll
    • python3.dll
    • PYZ.pyz
    • PYZ.pyz_extracted
      • annotationlib.pyc
      • argparse.pyc
      • ast.pyc
      • _ast_unparse.pyc
      • base64.pyc
      • bisect.pyc
      • bz2.pyc
      • calendar.pyc
      • codeop.pyc
      • _colorize.pyc
      • _compat_pickle.pyc
      • compression
      • contextlib.pyc
      • contextvars.pyc
      • copy.pyc
      • cryptography
      • csv.pyc
      • ctypes
      • dataclasses.pyc
      • datetime.pyc
      • decimal.pyc
      • difflib.pyc
      • dis.pyc
      • email
      • fnmatch.pyc
      • fractions.pyc
      • ftplib.pyc
      • future.pyc
      • getopt.pyc
      • gettext.pyc
      • glob.pyc
      • gzip.pyc
      • hashlib.pyc
      • http
      • importlib
      • inspect.pyc
      • ipaddress.pyc
      • json
      • logging
      • lzma.pyc
      • mimetypes.pyc
      • netrc.pyc
      • numbers.pyc
      • _opcode_metadata.pyc
      • opcode.pyc
      • pathlib
      • pickle.pyc
      • pprint.pyc
      • _py_abc.pyc
      • py_compile.pyc
      • _pydatetime.pyc
      • _pydecimal.pyc
      • _py_warnings.pyc
      • quopri.pyc
      • random.pyc
      • selectors.pyc
      • shutil.pyc
      • signal.pyc
      • socket.pyc
      • ssl.pyc
      • statistics.pyc
      • string
      • stringprep.pyc
      • _strptime.pyc
      • subprocess.pyc
      • tarfile.pyc
      • tempfile.pyc
      • textwrap.pyc
      • _threading_local.pyc
      • threading.pyc
      • tokenize.pyc
      • token.pyc
      • tracemalloc.pyc
      • typing.pyc
      • urllib
      • zipfile
    • select.pyd
    • _socket.pyd
    • _ssl.pyd
    • struct.pyc
    • unicodedata.pyd
    • VCRUNTIME140.dll
    • _zstd.pyd

The most suspicious file is probably loader.pyc, although any of the files could be malicious.

Decompilation can be done with many tools; the most common is uncompyle6 2, but it does not support Python 3.14 at the moment, so depyo 3 was used instead (note that using it on REMnux may require upgrading the node version):

$ npx depyo e450b7efc8b429b618d2d22a074a3dd55c07b451eef315e0e20be7d9054ef18c.exe_extracted/loader.pyc
Processing /home/remnux/malware/mallearn/python/exe/e450b7efc8b429b618d2d22a074a3dd55c07b451eef315e0e20be7d9054ef18c.exe_extracted/decompiled/loader.py...
Processed 1 files in 0.082s. In: 864278 bytes (10506252.59 B/s). Out: 854535 bytes (10387815.68 B/s).

Before moving forward with the code analysis, pestudio shows that the sample has an overlay section. This section contains arbitrary data appended to the end of a PE file that is not mapped into memory when the program runs. pestudio automatically detects and analyzes this data because it is a common location for hiding malicious code or additional resources.

The overlay accounts for 98% of the overall file size, or around 11 MB. This is PyInstaller behavior rather than an additional payload, since the extractor specifies that 12,344,292 bytes of data were found in 38 CArchives.

pestudio showing the sample's overlay, 12,396,104 bytes at entropy 7.997, or 97.32% of the file.
Fig. 1: pestudio showing the sample's overlay, 12,396,104 bytes at entropy 7.997, or 97.32% of the file.

Lastly, capa can be run to see what it detects. The most interesting findings here are data obfuscation and evasion.

ATT&CK TacticATT&CK Technique
DEFENSE EVASIONObfuscated Files or Information [T1027]
Virtualization/Sandbox Evasion::System Checks [T1497.001]
DISCOVERYFile and Directory Discovery [T1083]
Process Discovery [T1057]
System Information Discovery [T1082]
EXECUTIONCommand and Scripting Interpreter [T1059]
Shared Modules [T1129]
MBC ObjectiveMBC Behavior
ANTI-BEHAVIORAL ANALYSISDebugger Detection::Timing/Delay Check QueryPerformanceCounter [B0001.033]
Virtual Machine Detection [B0009]
DATAChecksum::Adler [C0032.005]
Compress Data [C0024]
Compression Library [C0060]
Encode Data::XOR [C0026.002]
DEFENSE EVASIONObfuscated Files or Information::Encoding-Standard Algorithm [E1027.m02]
DISCOVERYAnalysis Tool Discovery::Process detection [B0013.001]
File and Directory Discovery [E1083]
System Information Discovery [E1082]
EXECUTIONCommand and Scripting Interpreter [E1059]
FILE SYSTEMCreate Directory [C0046]
Delete Directory [C0048]
Delete File [C0047]
Read File [C0051]
Writes File [C0052]
OPERATING SYSTEMEnvironment Variable::Set Variable [C0034.001]
PROCESSCreate Process [C0017]
Create Process::Create Suspended Process [C0017.003]
Terminate Process [C0018]