Payload — Technical Analysis / Windows

Variants: Esxi Windows

Payload Ransomware (Windows)


1. Sample Identification

Field Value
Family Payload
SHA-256 1ca67af90400ee6cbbd42175293274a0f5dc05315096cb2e214e4bfe12ffb71f
Type PE32 executable, Intel 80386, console, Windows
Size 394 752 bytes (385 KB)
Language C++ (MSVC, Concurrency Runtime)
Image base 0x400000
Sections 5: .text, .idata, .rdata, .data, .fptable
Functions 2329 total (22 named, 778 library)
RansomLook https://www.ransomlook.io/group/Payload

This is the Windows variant of the Payload ransomware family, companion to the ESXi/Linux version (bed8d175...). Compiled with MSVC, uses the Concurrency Runtime (Concurrency:: symbols), and makes extensive use of NT Native APIs resolved at runtime. Features AVX2/SSE2-optimized ChaCha20 encryption, Curve25519 key exchange, IOCP-based multi-threaded file processing, ETW patching, and self-deletion via NTFS ADS rename.

Imports (4 DLLs)

DLL Count Purpose
KERNEL32 98 Core API: process, file, thread, memory, IOCP
ADVAPI32 7 CryptGenRandom, service control (SCM)
SHELL32 3 ShellExecuteW, SHEmptyRecycleBinA, CommandLineToArgvW
ntdll.dll 14 Resolved at runtime: NtCreateFile, NtReadFile, NtWriteFile, NtQueryDirectoryFile, etc.

2. Infrastructure

Field Value
DLS Onion payloadrz5yw227brtbvdqpnlhq3rdcdekdnn3rgucbcdeawq2v6vuyd.onion
Chat Onion payloadynyvabjacbun4uwhmxc7yvdzorycslzmnleguxjn7glahsvqd.onion
Note filename RECOVER_payload.txt
Extension .payload
Mutex MakeAmericaGreatAgain
Deadline 72h (contact) / 240h (negotiation)
Log file \\?\C:\payload.log

The infrastructure is shared with the ESXi variant (same onion addresses), but per-victim credentials differ.


3. Ransom Note

Filename

RECOVER_payload.txt — written to every traversed directory via write_ransom_note @ 0x409EB5.

Encryption

The note content is stored as a base64-encoded, RC4-encrypted blob in .rdata (1896 bytes encrypted). The RC4 key is itself double-base64 encoded: - Outer: aFFFUElOdVRZMmx5dHVmTERwSlFkVmtyV2xvdkMxUVI= - Inner: hQEPINuTY2lytufLDpJQdVkrWlovC1QR (32-byte ASCII key)

Full Ransom Note

Welcome to Payload!

The next 72 hours will determine certain factors in the life of your company: 
the publication of the file tree, which we have done safely and unnoticed by all of you, 
and the publication of your company's full name on our luxurious blog.
NONE of this will happen if you contact us within this time frame and our negotiations are favorable.

We are giving you 240 hours to:
1. familiarize yourself with our terms and conditions,
2. begin negotiations with us,
3. and successfully conclude them.
The timer may be extended if we deem it necessary (only in the upward direction).
Once the timer expires, all your information will be posted on our blog.

ATTENTION!
Contacting authorities, recovery agencies, etc. WILL NOT HELP YOU!
At best, you will waste your money and lose some of your files, which they will carefully take to restore!
You should also NOT turn off, restart, or put your computer to sleep.
In the future, such mistakes can make the situation more expensive and the files will not be restored!
We DO NOT recommend doing anything with the files, as this will make it difficult to recover them later!

When contacting us:
you can request up to 3 files from the file tree, 
you can request up to 3 encrypted files up to 15 megabytes 
so that we can decrypt them and you understand that we can do it.

First, you should install Tor Browser:
1. Open: https://www.torproject.org/download
2. Choose your OS and select it
3. Run installer
4. Enjoy!

In countries where tor is prohibited, we recommend using bridges, 
which you can take: https://bridges.torproject.org/

You can read:
http://payloadrz5yw227brtbvdqpnlhq3rdcdekdnn3rgucbcdeawq2v6vuyd.onion (Tor)

To start negotiations, go to http://payloadynyvabjacbun4uwhmxc7yvdzorycslzmnleguxjn7glahsvqd.onion and login:
User: [SNIP]
Password: [SNIP]

Your ID to verify: [SNIP]

4. Execution Flow

main @ 0x40A9C7 (0x5A6 bytes)

1.  resolve_nt_native_apis()                  → NtCreateFile, NtReadFile, NtWriteFile, etc.
2.  resolve_wow64_apis()                      → Wow64DisableWow64FsRedirection
3.  Parse CLI arguments:
    --log           → enable logging to \\?\C:\payload.log
    --p <path>      → target specific path
    --algo <name>   → force AVX2/SSE2/default
    --threads <n>   → override thread count
    --background    → run as detached background process
    --m             → skip mutex check
    --n             → skip ransom note writing
    --d             → skip auto-deletion (self-delete)
    --k             → skip process/service killing
    --s             → skip something (unused?)
    --bypass-etw    → patch ETW functions in ntdll
    --l             → delete logs
    --i             → ignore all file extension filters
4.  CreateMutexW("MakeAmericaGreatAgain")     → single instance
5.  If not --background:
    a. Re-launch self with --background flag  → detached execution
6.  If --background:
    a. If --bypass-etw: patch_etw_functions()
    b. pre_encryption_setup()
    c. encryption_orchestrator()
7.  ReleaseMutex → exit

pre_encryption_setup @ 0x40A855

1.  open_log_file()                           → \\?\C:\payload.log via NtCreateFile
2.  SetProcessShutdownParameters(0, 0)        → last to shut down
3.  SHEmptyRecycleBinA(NULL, NULL, 7)         → empty recycle bin silently
4.  If NOT --k:
    a. delete_shadow_copies()                 → vssadmin delete shadows
    b. kill_services()                        → 44 services stopped
    c. kill_processes()                       → 31 processes terminated
5.  If NOT --n: write_ransom_note()           → RECOVER_payload.txt
6.  If NOT --d: self_delete_via_ads_rename()  → NTFS ADS rename trick

encryption_orchestrator @ 0x40A22C (0x628 bytes)

1.  Decode embedded Curve25519 public key (base64 → 32 bytes)
2.  Validate pubkey length >= 32 bytes
3.  cpuid_detect_features()                   → check AVX2/SSE2
4.  Select ChaCha20 implementation:
    - AVX2:    chacha20_block_avx2    @ 0x402C2E (4619 bytes)
    - SSE2:    chacha20_block_sse2    @ 0x401DBD (3596 bytes)
    - Scalar:  chacha20_block_scalar  @ 0x401992 (1067 bytes)
5.  Thread count = CLI --threads or GetLogicalProcessorInformation
6.  Queue size = 4 * cpu_cores (min 2)
7.  CreateIoCompletionPort()
8.  Spawn 2 * cpu_cores worker threads (iocp_worker_thread)
9.  If --p: encrypt specific path
    Else: enumerate_drives() → recursive_file_traversal() per drive
10. Wait for all workers to complete
11. PostQueuedCompletionStatus(NULL) × workers → signal shutdown
12. Join all threads

5. Encryption System

Architecture

encryption_orchestrator
├── Decode Curve25519 pubkey from base64
├── CPUID → select ChaCha20 variant (AVX2 / SSE2 / scalar)
├── CreateIoCompletionPort
├── Spawn 2*N worker threads
│   └── iocp_worker_thread @ 0x40A1A2
│       └── GetQueuedCompletionStatus (infinite wait)
│           └── encrypt_single_file @ 0x40946F
├── enumerate_drives (A:-Z: via NT API)
│   └── recursive_file_traversal @ 0x4099C0
│       ├── Skip "." and ".."
│       ├── Skip directories in exclusion list
│       ├── Skip files matching ransom note name
│       ├── Skip files with excluded extensions
│       ├── Skip files matching whitelisted extensions
│       ├── Rate-limit: SwitchToThread if queue full
│       └── PostQueuedCompletionStatus (file path)
└── Wait → signal workers → cleanup

encrypt_single_file @ 0x40946F (0x551 bytes)

1.  NtCreateFile(path, GENERIC_READ|WRITE|DELETE|SYNCHRONIZE)
2.  NtQueryInformationFile → get file size
3.  LockFileEx(EXCLUSIVE)
4.  CryptGenRandom(32) → ephemeral ChaCha20 key
5.  CryptGenRandom(12) → ChaCha20 nonce
6.  Clamp key for X25519: key[0] &= 0xF8, key[31] = (key[31] & 0x3F) | 0x40
7.  x25519_scalar_mult(ephemeral_key, basepoint_9) → ephemeral public key
8.  x25519_scalar_mult(ephemeral_key, master_pubkey) → shared secret
9.  Intermittent encryption:
    - Files <= 2 GB: encrypt entirely
    - Files > 2 GB: encrypt 1/5 of file (sparse blocks)
10. Read in 1 MB (0x100000) chunks → ChaCha20 XOR → write back (in-place)
11. Write footer:
    - "payload" marker (7 bytes)
    - RC4-encrypted metadata (56 bytes: ephemeral pubkey + nonce)
12. Rename file with .payload extension
13. UnlockFileEx → NtClose
14. Wipe key material from stack

Crypto Primitives

Primitive Function Address Size
ChaCha20 (AVX2) chacha20_block_avx2 0x402C2E 4619 B
ChaCha20 (SSE2) chacha20_block_sse2 0x401DBD 3596 B
ChaCha20 (scalar) chacha20_block_scalar 0x401992 1067 B
X25519 (Curve25519) x25519_scalar_mult 0x40598E 142 B
RC4 (KSA) rc4_key_schedule 0x4093A9 91 B
RC4 (PRGA XOR) rc4_prga_xor 0x409404 107 B
CSPRNG CryptGenRandom ADVAPI32 import

Key Material

Key Value Purpose
Curve25519 pubkey aH9Tbdc+qPcQkPwhclaNYFadhF04GzuGsuRxDbKMRkU= Master public key for X25519 ECDH
687f536dd73ea8f71090fc2172568d60569d845d381b3b86b2e4710db28c4645 (hex)
RC4 key (footer) FBI (3 bytes) Encrypts 56-byte metadata appended to each file
RC4 key (note) hQEPINuTY2lytufLDpJQdVkrWlovC1QR (32 bytes) Decrypts ransom note content
ChaCha20 constant expand 32-byte k Standard ChaCha20 block constant

ChaCha20 Identification

Confirmed by quarter-round rotation constants at 0x401A91: - ROL 16, ROL 12, ROL 8, ROL 7 → ChaCha20 (Salsa20 uses 7, 9, 13, 18) - 10 double-rounds (20 rounds total) - 64-byte output blocks - "expand 32-byte k" sigma constant

Encryption Strategy

  • Threshold: Files > 2 GB get intermittent encryption (1/5 of file)
  • Block size: 1 MB read/write chunks
  • Footer: 7-byte marker "payload" + 56-byte RC4-encrypted session data
  • Extension: .payload
  • In-place: file content overwritten, no temp files
[original file data (partially encrypted)]
["payload" marker — 7 bytes]
[RC4-encrypted metadata — 56 bytes: ephemeral X25519 public key (32B) + nonce (12B) + padding (12B)]

6. File Targeting

Directory Exclusion List (18 directories)

Directory
AppData
Boot
Windows
windows.old
Tor Browser
Internet Explorer
Google
Opera
Opera Software
Mozilla
Mozilla Firefox
$Recycle.Bin
ProgramData
All Users
#recycle
$WinREAgent
.vs
WindowsPowerShell

File Exclusion List (27 filenames)

autorun.inf, boot.ini, bootfont.bin, bootsect.bak, bootmgr, bootmgr.efi, bootmgfw.efi, desktop.ini, iconcache.db, ntldr, ntuser.dat, ntuser.dat.log, ntuser.ini, thumbs.db, ntuser.dat.log1, ntuser.dat.log2, pagefile.sys, hiberfil.sys, swapfile.sys, recovery.ini, boot.sdi, setup.ini, config.sys, system.ini, win.ini, ntbootdd.sys, bootstat.dat

Extension Whitelist (55 extensions skipped)

.exe, .dll, .dll.mui, .sys, .drv, .efi, .cpl, .ocx, .ax, .mui, .msc, .bat, .cmd, .ps1, .ps1w, .psm1, .psd1, .vbs, .js, .jse, .wsf, .wsh, .ini, .inf, .reg, .admx, .adml, .xml, .theme, .desktheme, .dat, .log, .log1, .log2, .evtx, .sav, .tmp, .vsidx, .regtrans-ms, .blf, .lnk, .url, .library-ms, .search-ms, .searchconnector-ms, .ttf, .otf, .fon, .fnt, .wim, .vhd, .vhdx, .bcd, .sdi, .boot, .cur, .ani

These are system/script/font/boot files — the ransomware avoids encrypting them to keep the OS bootable.


7. Recovery Inhibition

Shadow Copy Deletion — delete_shadow_copies @ 0x40A158

ShellExecuteW(NULL, "open", "cmd.exe", "/c vssadmin.exe delete shadows /all /quiet", NULL, SW_HIDE);

Uses Wow64DisableWow64FsRedirection before and Wow64RevertWow64FsRedirection after to ensure the 64-bit vssadmin.exe is invoked even from a WoW64 process.

Recycle Bin Emptying

SHEmptyRecycleBinA(NULL, NULL, SHERB_NOCONFIRMATION | SHERB_NOPROGRESSUI | SHERB_NOSOUND);

8. Services Killed (44)

Service Target
vss Volume Shadow Copy
sql SQL Server
svc$ SQL-related services
memtas, mepocs MailEnable
sophos (×2) Sophos AV
veeam (×2) Veeam Backup
backup Generic backup
GxVss, GxBlr, GxFWD, GxCVD, GxCIMgr Commvault
DefWatch, ccEvtMgr, ccSetMgr, SavRoam, RTVscan Symantec/Norton
QBFCService, QBIDPService, Intuit.QuickBooks.FCS, QBCFMonitorService QuickBooks
YooBackup, YooIT Yoo Backup
zhudongfangyu Qihoo 360
stc_raw_agent StorageCraft
VSNAPVSS Virtual Snap
VeeamTransportSvc, VeeamDeploymentService, VeeamNFSSvc Veeam
PDVFSService PD File Services
BackupExecVSSProvider, BackupExecAgentAccelerator, BackupExecAgentBrowser, BackupExecDiveciMediaService, BackupExecJobEngine, BackupExecManagementService, BackupExecRPCService Veritas Backup Exec
AcrSch2Svc, AcronisAgent Acronis
CASADWebSvc, CAARCUpdateSvc Arcserve

Implementation at kill_services @ 0x40C04D: opens SCManager with full access, iterates service list, enumerates and stops dependent services first, then stops each service with a 30-second timeout.


9. Processes Killed (31)

Process Target
sql.exe SQL Server
oracle.exe Oracle DB
ocssd.exe Oracle CSS Daemon
dbsnmp.exe Oracle SNMP
synctime.exe Sync utility
agntsvc.exe SQL Agent
isqlplussvc.exe Oracle iSQL*Plus
xfssvccon.exe Oracle XFS
mydesktopservice.exe MyDesktop
ocautoupds.exe Oracle Auto Update
encsvc.exe Encryption service
firefox.exe Mozilla Firefox
tbirdconfig.exe Thunderbird Config
mydesktopqos.exe MyDesktop QoS
ocomm.exe Oracle Communicator
dbeng50.exe SQL Anywhere
sqbcoreservice.exe SQL Backup Core
excel.exe Microsoft Excel
infopath.exe Microsoft InfoPath
msaccess.exe Microsoft Access
mspub.exe Microsoft Publisher
onenote.exe Microsoft OneNote
outlook.exe Microsoft Outlook
powerpnt.exe Microsoft PowerPoint
steam.exe Steam
thebat.exe The Bat!
thunderbird.exe Mozilla Thunderbird
visio.exe Microsoft Visio
winword.exe Microsoft Word
wordpad.exe Windows WordPad
notepad.exe Notepad

Implementation at kill_processes @ 0x40C29C: CreateToolhelp32SnapshotProcess32FirstW/NextWTerminateProcess(pid, 9).


10. Persistence & Evasion

ETW Bypass — patch_etw_functions @ 0x4092D2

Patches 4 ETW functions in ntdll.dll to disable Event Tracing for Windows: - EtwEventWrite - EtwEventWriteFull - EtwEventWriteTransfer - EtwRegister

For each function: 1. GetModuleHandleA("ntdll.dll")GetProcAddress(func_name) 2. VirtualProtect(PAGE_EXECUTE_READWRITE) 3. Write return stub: - WoW64 (32-bit on 64-bit): 0xC3C3C3C8 (4 bytes) - Native x86: 0x14C2C033xor eax, eax; ret 0x14 4. VirtualProtect (restore original protection) 5. FlushInstructionCache

Self-Deletion via ADS Rename — self_delete_via_ads_rename @ 0x405C7A

  1. GetModuleFileNameW → own executable path
  2. CreateFileW(DELETE|SYNCHRONIZE)
  3. SetFileInformationByHandle(FileRenameInfo) → rename to :payload (NTFS Alternate Data Stream)
  4. CloseHandle
  5. CreateFileW again (now named :payload)
  6. SetFileInformationByHandle(FileDispositionInfo, DELETE) → mark for deletion
  7. CloseHandle → file is deleted on close

This technique bypasses file locks because the rename happens while the process is still running.

NT Native API Usage — resolve_nt_native_apis @ 0x408D0F

All file I/O is performed via NT native APIs resolved from ntdll.dll at runtime:

API Purpose
NtCreateFile Open files for encryption
NtReadFile Read file content
NtWriteFile Write encrypted content
NtSetInformationFile Rename files (add extension)
NtQueryInformationFile Get file size
NtQueryDirectoryFile Directory enumeration
NtQuerySystemInformation System information
NtQueryInformationProcess Process information
NtOpenSymbolicLinkObject Drive enumeration
NtQuerySymbolicLinkObject Resolve drive targets
NtQueryDirectoryObject Directory objects
NtClose Close handles
RtlInitUnicodeString Initialize UNICODE_STRING

This bypasses user-mode API hooks from security products that only hook kernel32/kernelbase.

Mutex

MakeAmericaGreatAgain — prevents multiple instances. The --m flag disables this check.

Background Re-launch

If not started with --background, the ransomware re-launches itself with the --background flag for detached execution, then the parent exits.

Shutdown Priority

SetProcessShutdownParameters(0, 0) — ensures the process is the last to be shut down during system shutdown.


11. CLI Arguments

Flag Global Effect
--log Enable logging to \\?\C:\payload.log
--p <path> Target specific path instead of all drives
--algo <name> Force crypto variant: avx2, sse2, default
--threads <n> NumberOfConcurrentThreads Override worker thread count
--background byte_45F6F1 Run as detached background process
--m byte_45F6E7 Skip mutex creation (allow multiple instances)
--n byte_45F6E6 Skip ransom note writing
--d byte_45F6E5 Skip auto-deletion (keep executable)
--k byte_45F6F2 Skip process/service killing
--s byte_45F6F0 Unknown (unused in decompiled flow)
--bypass-etw byte_45F6F3 Patch ETW functions in ntdll
--l byte_45F704 Delete event logs
--i byte_45F6E4 Ignore all file filters (dangerous mode)


12. IOCs

Hashes

Type Value
SHA-256 1ca67af90400ee6cbbd42175293274a0f5dc05315096cb2e214e4bfe12ffb71f
MD5 e0fd8ff6d39e4c11bdaf860c35fd8dc0

Network

Type Value
DLS Onion payloadrz5yw227brtbvdqpnlhq3rdcdekdnn3rgucbcdeawq2v6vuyd.onion
Chat Onion payloadynyvabjacbun4uwhmxc7yvdzorycslzmnleguxjn7glahsvqd.onion

Files

Path/Pattern Description
RECOVER_payload.txt Ransom note
*.payload Encrypted files
\\?\C:\payload.log Debug log file

Mutex

MakeAmericaGreatAgain

Curve25519 Public Key

687f536dd73ea8f71090fc2172568d60569d845d381b3b86b2e4710db28c4645

Distinctive Strings

  • "MakeAmericaGreatAgain" (mutex name)
  • "expand 32-byte k" (ChaCha20 constant)
  • "payload" (file footer marker)
  • "FBI" (RC4 key for footer encryption)
  • "RECOVER_payload.txt" (note filename)
  • "SIZE OF PUBKEY IS LOWER THAN NEED (32)" (pubkey validation)
  • "[CPU] AVX2 found" / "[CPU] SSE2 found" (CPU feature logging)
  • "[Mutex] locker running.." (instance check)
  • "bypass-etw" (CLI flag for ETW patching)

13. MITRE ATT&CK Techniques

ID Technique Implementation
T1486 Data Encrypted for Impact Curve25519 + ChaCha20, .payload extension, intermittent >2GB
T1490 Inhibit System Recovery vssadmin delete shadows, SHEmptyRecycleBinA
T1489 Service Stop 44 services stopped via SCM (backup, AV, database)
T1057 Process Discovery CreateToolhelp32Snapshot + Process32FirstW/NextW
T1562.001 Impair Defenses: Disable or Modify Tools ETW bypass: patches EtwEventWrite/Register in ntdll
T1070.004 Indicator Removal: File Deletion Self-delete via NTFS ADS rename (:payload stream)
T1106 Native API 14 NT native APIs resolved from ntdll.dll at runtime
T1083 File and Directory Discovery Recursive traversal via NtQueryDirectoryFile
T1082 System Information Discovery CPUID for AVX2/SSE2, GetLogicalProcessorInformation
T1027 Obfuscated Files or Information RC4-encrypted strings, double-base64 note key
T1480 Execution Guardrails Mutex "MakeAmericaGreatAgain", extensive CLI flag system

14. Comparison: Windows vs ESXi Variant

Feature Windows (this sample) ESXi (bed8d175...)
File type PE32 x86 console ELF x86-64
Size 385 KB 39 KB
Language C++ (MSVC) C
File encryption ChaCha20 (AVX2/SSE2/scalar) ChaCha20 (AVX2) + Salsa20 (SSE2)
Key exchange Curve25519 Curve25519
Footer encryption RC4 (key "FBI") RC4 (key "FBI")
Note encryption RC4 (32-byte key, double-base64) RC4 (32-byte key, base64)
Extension .payload .xx0001
Note RECOVER_payload.txt welcome.txt (ESXi web UI)
Threshold 2 GB (intermittent 1/5) 5 GB (5-pass partial)
Threading IOCP completion port POSIX thread pool
File I/O NT native APIs (ntdll) POSIX (fopen/fread/fwrite)
Anti-debug IsDebuggerPresent (import) TracerPid (/proc/self/status)
ETW bypass Yes (patches ntdll) N/A
Self-deletion ADS rename trick No
Services killed 44 N/A
Processes killed 31 N/A
Shadow deletion vssadmin N/A
Mutex MakeAmericaGreatAgain flock()
Infrastructure Same onion addresses Same onion addresses

15. Summary

Payload (Windows) is a sophisticated, MSVC-compiled ransomware targeting Windows workstations and servers. It implements a Curve25519 + ChaCha20 hybrid encryption scheme with IOCP-based multi-threading and three CPU-optimized cipher paths (AVX2, SSE2, scalar). The binary uses NT native APIs for all file operations to bypass user-mode hooks, features ETW patching to blind EDR telemetry, and employs NTFS ADS rename for self-deletion. Recovery is inhibited through shadow copy deletion, recycle bin emptying, and aggressive service/process termination targeting backup, database, and office applications.

The same actor operates both a Windows and ESXi/Linux variant sharing identical infrastructure, encryption architecture (Curve25519 + ChaCha20 + RC4 "FBI"), and ransom note template. The Windows variant is significantly more complex (385 KB vs 39 KB, 2329 vs 180 functions) with additional evasion and anti-forensic capabilities.