e65bbcad9624099ad3de706e3714fb4e32455038c3a133b03e9da9af4257b811gh0st: e65bbcad — Qt6 x64 RAT with encrypted payload blob, March 2026
Executive Summary
PE32+ x64 GUI executable (~3.7 MB) built with MSVC 14.50 and Qt 6.4.3 framework, compiled March 2026. MalwareBazaar tags it gh0st/gh0strat; static evidence supports a commodity remote-access trojan (RAT) using Qt6 for its GUI layer and networking, with a 759 KB encrypted/compressed payload embedded inside .rsrc. No hardcoded C2 IOCs recovered statically. Version-info masquerade with nonsense strings. Unsigned. Dynamic analysis unavailable (no CAPE Windows guest). Family attribution is preliminary — the Qt6 build stack diverges from classic MFC-based Gh0st RAT.
What It Is
| Field | Value |
|---|---|
| SHA-256 | e65bbcad9624099ad3de706e3714fb4e32455038c3a133b03e9da9af4257b811 |
| File type | PE32+ executable (GUI) x86-64, for MS Windows ^[file.txt] |
| Size | 3,704,320 bytes |
| Compilation | Mon Mar 23 23:54:28 2026 (rabin2) / 2026:03:23 23:54:28 (exiftool) ^[rabin2-info.txt] ^[exiftool.json] |
| Linker | 14.50 (Visual Studio 2022) ^[exiftool.json] |
| GUI framework | Qt 6.4.3 (statically linked) — inferred from QCoreApplication, QThread, QSocketNotifier, qt.core.logging, qt.conf, ICU timezone tables, and QPA window-hint strings ^[strings.txt:2806] ^[strings.txt:4380] ^[strings.txt:4893] |
| Language | C++ (confirmed by MSVC runtime startup __scrt_common_main_seh) ^[ghidra:__scrt_common_main_seh-1401609e4] |
| Signed | No ^[rabin2-info.txt] |
| Stripped | No (symbols present: 4859 functions, 5140 symbols in Ghidra) ^[ghidra:metadata] |
| PDB | None recovered; build path stripped |
| Family (prelim) | gh0st / gh0strat (MalwareBazaar tags) ^[triage.json] |
Version-info masquerade
VS_VERSIONINFO fields populated with nonsense alphanumeric strings rather than a legitimate vendor identity ^[exiftool.json]:
CompanyName:NXKIhbBIFileDescription:YTqohOxsDzVProductName:YTqohOxsDzVOriginalFileName:YTqohOxsDzV.exeFileVersion:10.7.4207.461
This is a masquerading tactic (T1036.002) — the fields are not blank, but they carry no semantic meaning, likely to defeat simplistic reputation checks that flag empty metadata. See version-info-masquerade.
How It Works
Entry point
Standard MSVC C++ startup chain: entry → __scrt_common_main_seh → FUN_14019de80 (likely main or WinMain equivalent) ^[ghidra:entry-140160b58]. The Qt event loop (QCoreApplication::exec) is referenced in strings, indicating a GUI-driven RAT rather than a headless service ^[strings.txt:2806].
Embedded payload blob
Inside .rsrc (raw offset 0x2CCF16, virtual 0x140388000+) sits a 759,434-byte blob with no recognizable magic header. XOR brute-force (keys 0x00–0xFF) against the first 100 bytes did not yield a PE, DOS stub, or zlib header. Entropy is 5.68 — below encrypted randomness (~7.8) but above structured plaintext (~4.0), suggesting compressed or lightly obfuscated content ^[terminal:embedded-entropy].
The blob begins:
3c 37 00 00 00 00 00 37 53 38 53 00 00 00 00 00
Repeated ?? 53 bytes resemble a size/offset table or a custom archive index. This is likely either:
- A Qt resource archive (
.rcc) containing the RAT's configuration, modules, or secondary payload. - A custom encrypted payload decrypted at runtime by the main binary.
Without dynamic execution or a matching Qt .rcc parser, full extraction is not possible statically.
Network capability
WS2_32.dll.WSAAsyncSelectis imported, allowing asynchronous socket event handling tied to a Win32 window message loop — consistent with a GUI RAT that uses Qt's networking stack ^[pefile.txt].RPCRT4.dllimports present (RPC string binding, async client calls) ^[pefile.txt].- No hardcoded IP, domain, or URL strings recovered from static analysis. C2 configuration is likely encrypted inside the embedded blob or resolved at runtime.
Process / memory manipulation
KERNEL32.dll.WriteProcessMemory,VirtualAllocEx,OpenProcess,CreateThread,ResumeThread— standard cross-process injection and thread-manipulation toolkit ^[pefile.txt].ADVAPI32.dllregistry imports (RegCreateKeyExW,RegSetValueExW,RegOpenKeyExW,RegQueryValueExW) support persistence and configuration storage ^[pefile.txt].
Anti-analysis
- No overt anti-debug strings (no
IsDebuggerPresentcheck observed in decompiled entry, though it is imported). - No VM-detection strings.
- Large Qt6 runtime bloat (~2+ MB of Qt strings and ICU tables) hinders manual string review by drowning malicious indicators in framework noise.
Decompiled Behavior
Ghidra loaded the binary at x86:LE:64:default with 4,859 functions and 5,140 symbols. Auto-analysis is incomplete (code indexing pending), so decompilation is limited to the entry/startup layer.
Entry (0x140160b58)
- Calls
FUN_1401614a0(likely C-runtime pre-initialization). - Calls
__scrt_common_main_sehwhich sets up the C++ exception frame, runsinitterminitializers, then callsFUN_14019de80withuVar8 = _get_narrow_winmain_command_line()and window-mode flaguVar4^[ghidra:__scrt_common_main_seh-1401609e4].
Main-equivalent (FUN_14019de80)
- Not decompiled in this pass (auto-analysis incomplete). The function address
0x14019de80sits in.textand is referenced only from the startup path.
C2 Infrastructure
Static assessment: runtime-resolved.
No hardcoded network IOCs were recovered from strings, imports, or the decompiled entry path. The 759 KB .rsrc blob is the most likely C2 config carrier. Without dynamic detonation or a decrypted blob, specific IPs, domains, ports, or mutex names cannot be stated.
Interesting Tidbits
- Qt6 is unusual for Gh0st — Classic Gh0st RAT and its early variants are MFC/Win32 C++. A Qt6-based rebuild suggests a modernized fork or a different family co-labeled by MalwareBazaar heuristic.
- Nonsense version-info —
YTqohOxsDzV/NXKIhbBIare not random keyboard mash; they may be generated by a builder that produces pronounceable-but-meaningless strings to evade "blank metadata" heuristics. - No .NET, no Go, no Rust — This is a straightforward native C++ binary with a major commercial framework, making it statically large but behaviorally conventional.
- No CAPE detonation — The Windows guest is missing; runtime behavior (actual C2 beacon, registry writes, dropped files) is unknown.
How To Mess With It (Homelab Replication)
Goal: Build a minimal Qt6 GUI executable that statically links Qt and produces a comparable capa/PE fingerprint.
- Install Qt 6.4.3 (open-source offline installer) on a Windows VM.
- Build a minimal
QApplication+QTcpSocketproject in Qt Creator:#include <QApplication> #include <QTcpSocket> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTcpSocket s; s.connectToHost("127.0.0.1", 4444); return a.exec(); } - Compile statically:
qmake CONFIG+=staticorcmake -DQT_BUILD_STATIC=ON. - Verify with
file→ should readPE32+ executable (GUI) x86-64. - Compare
stringsoutput — expect massive Qt/ICU string pollution similar to this sample.
What you'll learn: How Qt6 static linking inflates binaries and obscures malicious strings, and why RAT authors might choose Qt for cross-platform GUI reuse.
Deployable Signatures
YARA rule
rule GH0ST_Qt6_RAT_Prelim {
meta:
description = "Preliminary static signature for Qt6-based Gh0st-labeled RAT (static-only, no dynamic confirmation)"
author = "Titus / PacketPursuit"
date = "2026-06-14"
sha256 = "e65bbcad9624099ad3de706e3714fb4e32455038c3a133b03e9da9af4257b811"
strings:
$qt_core = "QCoreApplication::exec: The event loop is already running" wide ascii
$qt_thread = "QThread: Destroyed while thread is still running" wide ascii
$qt_sock = "QSocketNotifier: Multiple socket notifiers for same socket" wide ascii
$qt_logging = "qt.core.logging" wide ascii
$wsa = "WSAAsyncSelect" ascii
$ver1 = "YTqohOxsDzV" wide ascii
$ver2 = "NXKIhbBI" wide ascii
condition:
uint16(0) == 0x5A4D and
filesize > 3MB and filesize < 5MB and
3 of ($qt_*) and
($wsa or $ver1 or $ver2)
}
Sigma rule
Not applicable statically — no observed process-tree, registry, or file-creation behavior without CAPE detonation. Runtime Sigma would require:
Q*.exeprocess spawning child processes withWriteProcessMemory/CreateRemoteThread- Unexpected Qt6 GUI application making outbound TCP connections to non-local addresses
- Registry writes to
Runkeys by a process with Qt strings in its image
IOC list
| Type | Value | Notes |
|---|---|---|
| SHA-256 | e65bbcad9624099ad3de706e3714fb4e32455038c3a133b03e9da9af4257b811 |
Primary |
| SHA-1 | e32455038c3a133b03e9da9af4257b811e65bbca (from metadata) |
— |
| MD5 | 19ded07b6e43c2d6e911c1e93e77e0db |
— |
| Imphash | f34d5f2d4577ed6d9ceec516c1f5a744 |
— |
| File size | 3,704,320 bytes | — |
| Version info | YTqohOxsDzV / NXKIhbBI |
Nonsense masquerade strings |
| Embedded blob offset | 0x2CCF16 (inside .rsrc) |
759,434 bytes, unknown format |
| Imports (network) | WSAAsyncSelect |
Async socket event handling |
| Imports (process) | WriteProcessMemory, VirtualAllocEx, OpenProcess, CreateThread |
Injection toolkit |
| Imports (registry) | RegCreateKeyExW, RegSetValueExW, RegOpenKeyExW |
Persistence/config |
Behavioral fingerprint statement
This binary is a ~3.7 MB PE32+ x64 GUI application statically linked with Qt 6.4.3. It imports WSAAsyncSelect for network event handling and carries the full Win32 process-injection toolkit (WriteProcessMemory, VirtualAllocEx, OpenProcess). A 759 KB obfuscated blob sits inside .rsrc and is likely decrypted at runtime to reveal C2 configuration or additional modules. No hardcoded network IOCs are visible statically. The version-info block contains nonsense masquerade strings. When detonated, expect a Qt GUI window, outbound TCP connection to a runtime-resolved endpoint, and possible child-process injection.
Detection Signatures
| ATT&CK Technique | Evidence | Confidence |
|---|---|---|
| T1021.001 — Remote Desktop Protocol | Not observed; RAT GUI capability inferred from Qt framework | Low |
| T1041 — Exfiltration Over C2 Channel | Inferred from WSAAsyncSelect + Qt networking |
Low |
| T1055 — Process Injection | Imports: WriteProcessMemory, VirtualAllocEx, OpenProcess, CreateThread |
Medium |
| T1059.003 — Windows Command Shell | Not statically observed | Low |
| T1071.001 — Application Layer Protocol | WSAAsyncSelect, RPCRT4 async client calls |
Medium |
| T1547.001 — Registry Run Keys / Startup Folder | Imports: RegCreateKeyExW, RegSetValueExW |
Medium |
| T1573.001 — Encrypted Channel | 759 KB obfuscated .rsrc blob likely contains encrypted config |
Medium |
| T1036.002 — Masquerading | Nonsense version-info strings (YTqohOxsDzV) |
High |
All confidence levels reduced by one tier because CAPE detonation was unavailable.
References
- MalwareBazaar entry:
e65bbcad9624099ad3de706e3714fb4e32455038c3a133b03e9da9af4257b811(tags:gh0st,gh0strat) ^[triage.json] - gh0st — Family entity page
- version-info-masquerade — Masquerading technique
Provenance
Analysis produced from static artefacts only. Tools: file (file type), exiftool (metadata), pefile/rabin2 (PE structure), Ghidra (decompilation, symbols, strings — auto-analysis incomplete), strings (plaintext extraction), floss (no decoded strings recovered), capa (failed — missing signatures), binwalk (no embedded archives), CAPE (skipped — no Windows guest). Dynamic behavior is inferred from imports and framework choice, not observed. Family attribution (gh0st) is preliminary and sourced from MalwareBazaar tags; the Qt6 build stack diverges from classic Gh0st RAT MFC/Win32 heritage.