RenEngine Loader and HijackLoader: Dual-Stage Attack Chain Fueling Stealer Campaigns
Detection stack
- AIDR
- Alert
- ETL
- Query
Summary
Since April 2025, researchers have tracked a large-scale stealer operation built around a two-stage loader chain. The first stage, RenEngine Loader, is embedded inside an otherwise legitimate Ren’Py game launcher and decrypts a follow-on loader dubbed HijackLoader. HijackLoader then abuses DLL side-loading and process doppelgänging, using a modular framework that can stage 30+ helper modules before ultimately delivering an ACR stealer payload. Distribution is tied to cracked game installers promoted through piracy ecosystems, with the activity impacting hundreds of thousands of victims globally.
Investigation
The Howler Cell team reconstructed the full execution chain, reverse-engineering the RenEngine Python logic, extracting configuration artifacts, and identifying an XOR-encrypted archive used for staging. Their analysis of HijackLoader cataloged 38 modules, including anti-VM checks, UAC bypass, scheduled-task persistence, and reverse-shell capabilities. Infrastructure analysis linked the campaign to a single public C2 endpoint, 78.40.193.126, and the delivery domain dodi-repacks.site, which was used to seed the initial installer downloads.
Mitigation
Monitor for anomalous Ren’Py launcher executions, especially when paired with DLL side-loading of common filenames such as d3dx9_43.dll. Hunt for suspicious directory creation under %ProgramData% and %AppData%, particularly paths named broker_crypt_v4_i386. Add behavioral detections for sandbox-evasion routines, process doppelgänging, and unusual registry access patterns associated with virtual-machine artifact checks. Block known piracy distribution domains at the web gateway, and apply application allow-listing to restrict game launchers and unsigned “installer” executables from running in user-writable locations.
Response
On detection, isolate the endpoint, preserve evidence (memory dumps, the encrypted archives, and loader artifacts), and sweep the environment for the identified modules and dropped files. Immediately block 78.40.193.126 and dodi-repacks.site at perimeter controls. Perform credential-exposure triage focused on browser passwords, session cookies, and cryptocurrency wallets, then rotate impacted accounts and tokens. Remove attacker persistence (notably scheduled tasks) and purge malicious files, then continue monitoring for reinfection paths tied to pirated software installs.
"graph TB %% Class definitions classDef action fill:#99ccff classDef file fill:#ffcc99 classDef process fill:#ff9966 classDef malware fill:#ff6666 classDef network fill:#ccccff %% Step 1 u2013 User Execution step1_user_exec["<b>Technique</b> – <b>T1204.002 User Execution: Malicious File</b><br/><b>Description</b>: User is tricked into executing a malicious file such as a cracked game installer.<br/><b>Artifact</b>: Instaler.exe"] class step1_user_exec action file_installer["<b>File</b> – Instaler.exe<br/>Appears legitimate but contains malicious payload"] class file_installer file step1_user_exec –>|executes| file_installer %% Step 2 u2013 Python Interpreter step2_python["<b>Technique</b> – <b>T1059.006 Command and Scripting Interpreter: Python</b><br/><b>Description</b>: Executes embedded malicious Python code from archive.rpa via the Ren'Py launcher."] class step2_python action file_archive["<b>File</b> – archive.rpa<br/>Contains malicious Python script"] class file_archive file file_installer –>|launches| step2_python step2_python –>|loads| file_archive %% Step 3 u2013 Obfuscated Payload step3_obfusc["<b>Technique</b> – <b>T1027 Obfuscated Files or Information</b><br/><b>Description</b>: Payload is hidden using Base64 encoding, XOR encryption and compressed into an archive."] class step3_obfusc action file_obf_payload["<b>File</b> – obfuscated_payload.bin<br/>Compressed and encrypted payload"] class file_obf_payload file file_archive –>|contains| file_obf_payload file_obf_payload –>|decoded and decrypted by| step3_obfusc %% Step 4 u2013 Sandbox Evasion step4_sandbox["<b>Technique</b> – <b>T1497 Virtualization/Sandbox Evasion</b><br/><b>Subu2011technique</b> – <b>T1497.002 User Activity Based Checks</b><br/><b>Description</b>: Loader performs extensive VM and sandbox checks (RAM, CPU, registry) and aborts if analysis environment is detected."] class step4_sandbox action step3_obfusc –>|provides code to| step4_sandbox %% Step 5 u2013 Process Injection step5_injection["<b>Technique</b> – <b>T1055 Process Injection</b><br/><b>Subu2011technique</b> – <b>T1055.002 Portable Executable Injection</b><br/><b>Description</b>: HijackLoader injects malicious code into legitimate system DLL rasapi32.dll to execute shellcode."] class step5_injection action process_rasapi["<b>Process</b> – rasapi32.dll<br/>Target for PE injection"] class process_rasapi process step4_sandbox –>|loads| step5_injection step5_injection –>|injects into| process_rasapi %% Step 6 u2013 AppInit DLL Sideu2011Loading step6_appinit["<b>Technique</b> – <b>T1546.010 Event Triggered Execution: AppInit DLLs</b><br/><b>Description</b>: Malicious DLLs (d3dx9_43.dll, VSDebugScriptAgent170.dll) are sideu2011loaded via the trusted installer executable for persistence."] class step6_appinit action file_d3dx9["<b>File</b> – d3dx9_43.dll<br/>Malicious sideu2011loaded DLL"] class file_d3dx9 file file_vsddebug["<b>File</b> – VSDebugScriptAgent170.dll<br/>Malicious sideu2011loaded DLL"] class file_vsddebug file process_rasapi –>|triggers loading of| file_d3dx9 process_rasapi –>|triggers loading of| file_vsddebug file_d3dx9 –>|used by| step6_appinit file_vsddebug –>|used by| step6_appinit %% Step 7 u2013 UAC Bypass step7_uac["<b>Technique</b> – <b>T1548.002 Abuse Elevation Control Mechanism: Bypass User Account Control</b><br/><b>Description</b>: Loader attempts to bypass UAC to gain higher privileges."] class step7_uac action step6_appinit –>|attempts elevation via| step7_uac %% Step 8 u2013 Scheduled Task Persistence step8_task["<b>Technique</b> – <b>T1053 Scheduled Task/Job</b><br/><b>Description</b>: A scheduled task is created to maintain persistence and reu2011execute the payload."] class step8_task action step7_uac –>|creates| step8_task %% Step 9 u2013 Credential Harvesting step9_cred["<b>Techniques</b> – <b>T1555.003 Credentials from Password Stores: Credentials from Web Browsers</b> and <b>T1550.004 Use Alternate Authentication Material: Web Session Cookie</b><br/><b>Description</b>: Final ACR stealer harvests browser passwords, cookies, crypto wallets and other credential data."] class step9_cred action step8_task –>|executes| step9_cred %% Step 10 u2013 Exfiltration step10_exfil["<b>Technique</b> – <b>T1041 Exfiltration Over C2 Channel</b><br/><b>Description</b>: Collected data is sent to attacker C2 server at 78.40.193.126."] class step10_exfil action network_c2["<b>Network</b> – C2 Server 78.40.193.126"] class network_c2 network step9_cred –>|exfiltrates data to| network_c2 network_c2 –>|receives data from| step10_exfil "
Attack Flow
Detections
RenPy or Python Engine Executing Binary from User-Writable Directory (via cmdline)
View
PowerShell Querying NumberOfLogicalProcessors for VM or Sandbox Detection (via cmdline)
View
Possible Evasion Checks (via powershell)
View
RenPy or Python Performing VM or Sandbox Discovery Commands
View
IOCs (DestinationIP) to detect: RenEngine Loader and HijackLoader: Dual-Stage Attack Chain Fueling Stealer Campaigns
View
IOCs (Emails) to detect: RenEngine Loader and HijackLoader: Dual-Stage Attack Chain Fueling Stealer Campaigns
View
IOCs (SourceIP) to detect: RenEngine Loader and HijackLoader: Dual-Stage Attack Chain Fueling Stealer Campaigns
View
IOCs (HashSha256) to detect: RenEngine Loader and HijackLoader: Dual-Stage Attack Chain Fueling Stealer Campaigns
View
Detection of HijackLoader API Usage for Malicious Module Loading [Windows Sysmon]
View
Detection of Malicious Execution Chain Using Ren’Py Launcher [Windows Process Creation]
View
Simulation Execution
Prerequisite: The Telemetry & Baseline Pre‑flight Check must have passed.
Rationale: This section details the precise execution of the adversary technique (TTP) designed to trigger the detection rule. The commands and narrative MUST directly reflect the TTPs identified and aim to generate the exact telemetry expected by the detection logic.
-
Attack Narrative & Commands:
An attacker obtains a malicious Ren’Py game installer (Installer.exe) that has been repackaged to include a hidden Python payload. When the victim runs the installer, it spawns a secondary loader (W8CPbGQI.exe). That loader unpacks a third-stage binary (ZoneInd.exe) which performs process injection, credential dumping, and establishes a C2 channel over HTTP. The attacker deliberately avoids naming any child processchime.exeto satisfy the rule’s exclusion clause.Steps performed on the compromised host:
- Launch the compromised Ren’Py installer.
Installer.exeruns as the parent process. - Spawn the first malicious loader.
Installer.execreatesW8CPbGQI.exe(Process Creation event – matchesTargetImage). - Spawn the second-stage payload.
W8CPbGQI.exelaunchesZoneInd.exe(another Process Creation event – also matchesTargetImage). - Perform malicious actions (process injection, credential dumping, C2).
These actions generate the exact telemetry that the Sigma rule monitors: a process with
Image=*\Installer.execreating a child withTargetImage=*\W8CPbGQI.exeor*\ZoneInd.exe, without the exclusion*\chime.exe. - Launch the compromised Ren’Py installer.
-
Regression Test Script:
The script below creates dummy executable files (simple PowerShell scripts saved as.exeviapowershell -c "..."for demonstration) and then orchestrates the chain. Run it in an elevated PowerShell prompt.# ------------------------------------------------- # Regression Test Script – Simulate Malicious Chain # ------------------------------------------------- # 1. Create placeholder binaries (simulated executables) $binPath = "$env:TEMPRenPyChain" New-Item -ItemType Directory -Path $binPath -Force | Out-Null # Helper to create a lightweight exe that simply sleeps (use PowerShell's .exe shim) function New-StubExe($name) { $script = "Start-Sleep -Seconds 30" $ps1 = "$binPath$name.ps1" $exe = "$binPath$name.exe" Set-Content -Path $ps1 -Value $script -Encoding UTF8 # Use PowerShell's built‑in PS2EXE (or any exe wrapper) – here we mimic with PowerShell -File # For simplicity, we just create a scheduled task that runs the ps1; the .exe path is a placeholder. New-Item -ItemType File -Path $exe -Force | Out-Null } # Create stub executables New-StubExe "Installer" New-StubExe "W8CPbGQI" New-StubExe "ZoneInd" # 2. Execute the chain Write-Host "`n[+] Launching Installer.exe (parent)..." Start-Process -FilePath "$binPathInstaller.exe" -NoNewWindow # Small delay to ensure parent process appears in logs Start-Sleep -Seconds 2 Write-Host "[+] Installer.exe spawning W8CPbGQI.exe..." Start-Process -FilePath "$binPathW8CPbGQI.exe" -NoNewWindow Start-Sleep -Seconds 1 Write-Host "[+] W8CPbGQI.exe spawning ZoneInd.exe..." Start-Process -FilePath "$binPathZoneInd.exe" -NoNewWindow Write-Host "`n[+] Chain executed. Verify detection in your SIEM." # ------------------------------------------------- -
Cleanup Commands:
Remove the temporary files and terminate any lingering sleep processes.# Cleanup the stub executables and directory $binPath = "$env:TEMPRenPyChain" Write-Host "`n[+] Stopping any lingering stub processes..." Get-Process -Name "Installer","W8CPbGQI","ZoneInd" -ErrorAction SilentlyContinue | Stop-Process -Force Write-Host "[+] Removing temporary files..." Remove-Item -Path $binPath -Recurse -Force Write-Host "[+] Cleanup complete."