Rastreando o PavinLoader em campanhas de download falso e ClickFix.

| 24 de agosto de 2026
Rastreando o PavinLoader em campanhas de download falso e ClickFix.

Em nossa análise anterior das campanhas maliciosas do RenPy, identificamos um carregador de múltiplas etapas implantado como parte da cadeia de infecção.

Investigações adicionais sobre ameaças mostraram que o mesmo carregador, que rastreamos como PavinLoader , está sendo usado em diversas campanhas diferentes, incluindo ataques ClickFix e downloads de software falsos. 

Apesar das diferenças na forma como essas campanhas atingem as vítimas, encontramos vários elementos em comum. Estes incluem cadeias de infecção em múltiplos estágios envolvendo DLLs .NET fortemente ofuscadas e trojanizadas; abuso do MSBuild, .csproje .bat arquivos para executá-los; e EtherHiding para recuperar o domínio de comando e controle (C2). 

Como é um ataque?

As campanhas não começam todas da mesma maneira. Uma vítima pode se deparar com um CAPTCHA falso que a instrui a executar um comando, baixar o que parece ser um software legítimo ou instalar um jogo malicioso.

O que acontece a seguir é muito mais consistente. O PavinLoader usa métodos legítimos. Windows Ele utiliza ferramentas juntamente com arquivos .NET maliciosos para executar vários estágios de malware. Também usa EtherHiding, uma técnica que usa um blockchain para ocultar informações sobre sua infraestrutura, a fim de encontrar o servidor do qual deve obter malware adicional.

Na campanha RenPy que analisamos, esse processo acabou levando ao Amatera Stealer , um malware projetado para roubar informações de um computador infectado. Também observamos infecções por PavinLoader distribuindo malware adicional.

PavinLoader aparece em diversas campanhas.

Identificamos o PavinLoader em diversos grupos de campanhas: 

  • Campanhas maliciosas do RenPy, conforme analisado em nossa postagem anterior no blog.
  • Diversas campanhas da ClickFix, incluindo atividades recentes dos operadores abordados em nossa análise anterior.
  • Campanhas fraudulentas de software que usavam o Dropbox para baixar o PavinLoader. 

A utilização do carregador em diversas campanhas levanta a possibilidade de que o PavinLoader seja oferecido como um Carregador como Serviço (Loader-as-a-Service).

Também encontramos diversos artefatos que corroboram essa possibilidade, embora não sejam suficientes para confirmá-la. Um artefato específico no VirusTotal é compartilhado por mais de 200 arquivos associados ao PavinLoader, sugerindo que possa ser um artefato de compilação do processo de construção.

Também encontramos um script do PowerShell carregado no VirusTotal contendo comentários como: EDIT HERE e REPLACE with a real direct link to your .batO arquivo BAT associado contém a string Automated builder helper.

No entanto, não encontramos nenhum painel de controle ou canais de venda que confirmem que o PavinLoader está sendo oferecido comercialmente.

Embora o PavinLoader tenha mudado ao longo do tempo, as campanhas que analisamos compartilham diversas características:

  • Instaladores Inno Setup ou MSI gerados com diferentes compiladores que executam o .bat e/ou .csproj arquivos
  • DLLs .NET infectadas por Trojans, incluindo DotNetZip, Nancy, Renci.SshNet e OpenXML. Na maioria dos casos analisados, os métodos maliciosos inseridos seguem um padrão. TwoWords ou TwoWordsNumber padrão de nomenclatura, como DefaultEvaluator5, e FallbackFactory5
  • Uma técnica comum de ofuscação usada em DLLs do .NET.
  • Uma convenção de nomenclatura baseada em duas palavras aleatórias, como por exemplo GollopDevest, UnbrandRunovere PavinWide, para nomes de DLLs, funções, strings, caminhos C2 e outros artefatos
  • EtherHiding para obter o domínio C2, seguido por solicitações HTTP usando caminhos como assets/{two random words}.json para recuperar estágios subsequentes. Os domínios C2 geralmente usam o .lat, .icu, .shope .cfd domínios de nível superior
  • Mecanismos do MSBuild para carregar e executar código de DLLs, incluindo funções de propriedade como [System.Reflection.Assembly]::Load(...) e UsingTask
  • Padrões recorrentes em nomes de arquivos, como name_4characters.cmd/bat/msi/exe-por exemplo, prefetch_9a59.cmd, telemetry_55db.cmde bootstrap_64be.cmd—ou nomes aleatórios de nove caracteres, como aegZpQ4C7.batTambém observamos nomes abreviados, incluindo Small.msi, small.bate small.cmd

O PavinLoader consiste em várias DLLs .NET e, nos casos analisados, identificamos os seguintes estágios: 

  • DLL de carregamento : Uma DLL trojanizada — como a Nancy analisada em nosso artigo anterior sobre RenPy — ou uma DLL personalizada. Ela executa operações antiforense e antianálise, altera as configurações de rede necessárias para as próximas operações e carrega o carregador EtherHiding.
  • DLL do carregador EtherHiding : Obtém o C2 através do EtherHiding e baixa os estágios seguintes a partir dele. 
  • DLL Anti-Análise : Realiza verificações anti-análise abrangentes para detectar ambientes virtualizados. 
  • DLL do carregador PE : Carrega a carga útil PE final.

As cargas intermediárias podem variar dependendo da configuração da campanha. Primeiro, vamos analisar alguns dos métodos usados ​​para distribuir os estágios iniciais do PavinLoader. Em seguida, retornaremos à campanha do carregador RenPy que analisamos em nosso artigo anterior para examinar os estágios posteriores do carregador. 

Análise técnica

O restante deste artigo analisa mais detalhadamente como o PavinLoader é distribuído e como cada etapa do carregador funciona.

Como o PavinLoader é entregue

Observamos que o PavinLoader está sendo distribuído por meio de diversas campanhas do ClickFix.

Em particular, detectamos que o cluster ClickFix analisado em um estudo anterior artigo recentemente começou a usar o PavinLoader. Abuso do MSBuild e o uso de .csproj e .bat Os arquivos continuam sendo comuns em todas as cadeias de infecção que observamos.

Já abordamos um exemplo em nossa análise anterior do RenPy. Aqui, vamos examinar vários outros métodos de distribuição. 

Como vimos em nossa análise anterior dessas campanhas do ClickFix, os scripts do PowerShell associados mudam com frequência. Encontramos diversas versões nessa atividade, incluindo scripts ofuscados e não ofuscados.

Neste exemplo, o MSI baixado do bucket do Cloudflare é chamado Installer_57be78.msi. 

O pacote contém:

  • prefetch_2f76.exeO executável MSBuild legítimo
  • prefetch_2f76.csprojUtilizado para executar a DLL do carregador através de UsingTask
  • DotNetZip.dll: A DLL do carregador

O .csproj O arquivo é executado com:

"C:\Users\{USER}\AppData\Local\Logitech\Device Configuration Helper\prefetch_2f76.exe" /nologo "C:\Users\{USER}\AppData\Local\Logitech\Device Configuration Helper\prefetch_2f76.csproj" /nr:false

A DLL Loader é uma versão trojanizada do DotNetZip e é executada usando o UsingTask elemento.

Diferentemente do exemplo do RenPy discutido em nosso artigo anterior, o carregador EtherHiding é extraído da própria DLL. Um recurso incorporado é usado como índice para extrair bytes diretamente da DLL, em vez de obter esses índices do próprio arquivo. .csproj arquivo.

Detectamos outra campanha que utiliza arquivos BAT contendo informações falsas. BUILD VERIFICATION REPORT comentários, aparentemente com a intenção de dificultar a análise e a detecção.

Neste caso, o MSI CustomAction Executa o script BAT com:

cmd.exe /c C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd /launched

O código ofuscado aparece abaixo dos comentários falsos. Ele concatena várias strings e usa índices gerados por meio de operações matemáticas simples para reconstruí-las. Encontramos esse tipo de ofuscação na maioria dos arquivos BAT que analisamos.

O arquivo BAT localiza conhost.exe e se relança com:

"C:\WINDOWS\System32\conhost.exe" --headless cmd.exe /c "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd" /launched

Em seguida, define o MSBUILDENABLEALLPROPERTYFUNCTIONS=1 variável de ambiente, localiza MSBuild.exee o executa usando o mesmo arquivo como entrada:

"C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd"

Neste caso, a DLL do carregador é reconstruída concatenando e decodificando quatro variáveis ​​codificadas em Base64.

A DLL do carregador tem um nome aleatório e parece ser uma versão mais antiga, pois não contém o bytecode personalizado e as strings criptografadas em seus recursos.

Assim como na campanha RenPy analisada anteriormente, esta etapa recupera o carregador EtherHiding armazenado entre um Build-... marcador no arquivo CMD através do _vezr variável de ambiente e, em seguida, a decodifica usando XOR com uma chave de 32 bytes.

Após termos analisado diversos métodos utilizados para distribuir os dois primeiros estágios do PavinLoader, retornaremos agora à cadeia de infecção do RenPy, analisada anteriormente, e examinaremos o próprio carregador com mais detalhes.

Analisando o PavinLoader

As DLLs .NET associadas ao PavinLoader são fortemente ofuscadas usando achatamento de fluxo de controle, bytecode personalizado e chamadas indiretas através de calli/ldftnCriptografia de strings com diferentes algoritmos, hashing de API e delegates, métodos redundantes e código e strings inúteis.

Não identificamos nenhum ofuscador conhecido associado às amostras, portanto, até onde sabemos, o PavinLoader utiliza um ofuscador personalizado.

Como a desofuscação completa das amostras seria complexa, utilizamos uma abordagem híbrida que combina análise dinâmica com invocação de métodos por meio de reflexão. Identificamos os métodos importantes com base em suas importações e parâmetros, os invocamos e analisamos a saída resultante.

Essa abordagem não oferece uma cobertura completa do fluxo de execução, mas nos permitiu identificar a funcionalidade principal do carregador e extrair seus estágios intermediários. Como diferentes funções frequentemente compartilham os mesmos nomes, usamos tokens de metadados para identificar os métodos ao longo da análise.

Nancy trojanizou a DLL: DLL do carregador 

Já abordamos essa etapa detalhadamente em nossa postagem anterior no blog, então aqui forneceremos apenas uma visão geral.

Na maioria dos casos analisados, a DLL Loader é uma DLL legítima infectada por um trojan. O método malicioso normalmente utiliza um {RandomWord} ou {RandomWord_Number} convenção de nomenclatura.

A DLL contém um recurso associado ao bytecode personalizado interpretado pelo método principal, dois recursos contendo strings criptografadas e, em alguns casos, recursos adicionais usados ​​como índice para extrair o próximo estágio. Outros recursos parecem ser iscas projetadas para dificultar a análise. Nas amostras que analisamos, essa DLL tipicamente:

  • Decripta strings de recursos usando XOR com múltiplas chaves.
  • Resolve APIs usando hash de API e GetDelegateForFunctionPointer()
  • Altera as configurações de rede, incluindo a desativação da validação de certificado TLS e a definição do proxy padrão do sistema.
  • Executa uma verificação de temporização anti-análise usando CreateEventW(), GetTickCount()e WaitForSingleObject()
  • Executa operações antiforenses
  • Carrega o carregador EtherHiding extraindo-o de um marcador dentro do jogo. .csproj ou arquivos BAT, ou usando um recurso como índice para recuperar bytes diretamente da DLL.

GollopDevest: Carregador de Ocultação Éter 

O carregador EtherHiding possui duas funções principais: obter o domínio C2 através do EtherHiding e baixar e carregar os estágios subsequentes a partir desse C2.

Aula 0x02000762 É responsável por decifrar as sequências de caracteres associadas à blockchain e à comunicação em rede.

As strings são descriptografadas por 0x060027BD do seguinte modo: 

  • Função 0x060027BB Inicializa a S-box usando o XOR da chave mestra. activeValues e o decodificado em Base64 optionsCollection corda
  • Função 0x060027BE leva childSyncObject como entrada e retorna bytes de índice usando XOR e permutações baseadas em valores de cabeçalho codificados nos dois primeiros caracteres da string.
  • Função 0x060027B9 Retorna a string descriptografada usando os índices e a S-box gerada anteriormente.

Essa foi a única classe que encontramos com parâmetros de criptografia codificados nesse formato.

Para as strings restantes, identificamos funções que retornavam dados descriptografados com base em suas assinaturas de parâmetros — por exemplo, métodos que retornavam strings ou bytes — e as invocamos por meio de reflexão. Isso nos permitiu recuperar mais de 1.300 strings.

Entre elas, havia sequências associadas a patches AMSI e ETW:

AmsiScanString
System.Management.Automation.AmsiUtils
System.Management.Automation.AmsiUtils+AmsiNativeMethods
ntdll
EtwEventWrite

NtQueryInformationProcess
NtSetInformationThread
VirtualProtect

Mais de 100 URLs pertencentes a serviços legítimos também são descriptografadas e usadas para gerar requisições HTTP e ruído de rede. Não observamos esse comportamento em todas as amostras, o que sugere que ele pode ser específico da versão do sistema.

A classe Server (0x02000052) gera o X-Timestamp, X-Noncee X-Signature Os cabeçalhos HTTP e as solicitações são usados ​​para recuperar as etapas subsequentes.

São feitas duas requisições HTTP para sincronizar os parâmetros e obter o payload, com HMAC usado para validar as requisições. Usando reflexão, executamos o método. 0x06000A77 para obter os valores de cabeçalho necessários para recuperar os estágios subsequentes.

O domínio C2 é obtido através de uma chamada de procedimento remoto (RPC) ETH para bsc-dataseed.binance.org com o seguinte corpo JSON-RPC:

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

As etapas seguintes são baixadas do domínio C2 resultante. A carga útil codificada em XOR é armazenada na resposta JSON em cache.content:

{"type":"cache-binary","meta":{"version":"2.3.1","timestamp":"…","platform":"win32-x64"},"cache":{"id":"e2b69…","content":"1c.."}} 

Neste caso, os caminhos C2 e as chaves XOR descriptografadas nesta etapa e na DLL anti-análise são:

Caminho chave XOR Tipo/Função 
/assets/ExponeAboard.json QBBBfWow4lb PavinWride .NET DLL, Anti-análise  
/assets/MailersKogasin.json WjcsVTKmuoBRqe GollopDevest .NET DLL, Carregador PE 
/assets/LanoseThrip.json WwUX66Br Executável WPA.exe PE, Amatera Stealer 

A próxima etapa executada é a DLL anti-análise. 

PavinWride: DLL anti-análise 

Esta DLL é responsável por executar diversas verificações anti-análise. 

A DLL anti-análise executa chamadas de sistema de diferentes maneiras: 

  • Standard Chamadas da Biblioteca de Classes Base (BCL) do .NET, incluindo operações de registro e de rede.
  • Chamadas Win32 P/Invoke, incluindo GetCurrentThread, NtQueryInformationThread, NtQueryInformationProcesse NtCurrentTeb
  • APIs Win32 resolvidas por meio de hash de API e uma análise da tabela de exportação do Bloco de Ambiente de Processo (PEB).

A função MenuItemService.ProcessDirectory (0x06000151) é o principal método responsável pelo cache de delegados e pela resolução da API Win32:  

  • Ele verifica se o delegado já foi resolvido usando managerMap.TryGetValue() 
  • Caso contrário, ele liga. ProcessDirectory (0x06000150) para obter o identificador HMODULE
  • Chama ProcessDirectory (0x0600003A) que realiza a busca na tabela de exportação PE e compara o hash. Detectamos que a mesma saída de hash é obtida em vários outros métodos (por exemplo, 0x06000039, 0x0600003B, 0x0600004E)
  • Obtém o delegado com GetDelegateForFunctionPointer() e o salva no dicionário.

Utilizamos a mesma abordagem de reflexão para obter as strings. Muitas strings estão criptografadas com a chave XOR. 4B729A1F5CE387D6

O carregador obtém o LCID do sistema usando GetKeyboardLayoutList() e compara-o com mais de 17 idiomas, incluindo russo, ucraniano, bielorrusso e armênio.

Ele também realiza um extenso reconhecimento do sistema, incluindo a enumeração de chaves de registro e a chamada de APIs Win32, como GetSystemFirmwareTable() e EnumSystemFirmwareTables() Identificar ambientes virtualizados.

Categoria Valor 
IDs de fornecedor/dispositivo PCI VEN_80EE, VEN_15AD, VEN_1AB8, VEN_5853, VEN_1AF4, VEN_1234&DEV_111, …
IDs OEM SMBIOS/ACPI VMWARE, VBOX, BOCHS, VRTUAL, MSFTVM, MSHYPR, Xen, Parall, BHYVE, AMAZON, Google
assinaturas de tabela ACPI VBOX, BXPC, VMW, Xen, PRLS, AMZN, MICR
Cadeias de caracteres BIOS/fabricante/produto vmware, vmw, innotek, virtualbox, vbox, qemu, seabios, bochs, standard pc, kvm virtual machine, xen, hvm domu, parallels
Cadeias de caracteres associadas a verificações anti-análise

Também observamos referências descriptografadas a APIs, incluindo GetCurrentProcess(), CreateToolhelp32Snapshot(), Process32First(), Process32Next()e OpenMutex(), embora não tenhamos observado essas funções sendo chamadas durante nosso fluxo de execução.

Uma requisição HTTP também é feita para um destes serviços: 

  • https://ipv4[.]ipleak[.]net/json/
  • https://get[.]geojs[.]io/v1/ip/geo[.]json
  • https://ipapi[.]co/json/
  • https://api[.]ipapi[.]is/
  • https://ipinfo[.]io/json

Também verifica os dados retornados em relação a 96 provedores de hospedagem ou infraestrutura e testa se o código da região é um dos seguintes: RU, UA, BY, AM, KZ, KG, TJ, UZ, GE, AZou MD.

Cadeias descriptografadas associadas aos provedores . Clique para ampliar.

Se as verificações anti-análise forem aprovadas, os dois estágios seguintes são baixados e descriptografados usando chaves XOR.

Remendamos SelectionScope.ProcessDirectory (0x06000014) para recuperar os caminhos C2 e as chaves XOR para esses estágios:

/assets/MailersKogasin.json|WjcsVTKmuoBRqe|/assets/LanoseThrip.json|WwUX66Br

GollopDevest: PE Loader DLL e Amatera Stealer

A terceira DLL tem o mesmo nome que a segunda. GollopDevest, mas realiza carregamento PE.

Entre as sequências decifradas estão:

'GollopMailers LDR DllBase VeneryCondole EdiyaFoully=0x{0:X} EdiyaStelae=0x{1:X}'
'GollopMailers LDR Flags missing IMAGE_DLL 0x{0:X8}'
'GollopMailers LDR SaranPisco invalid 0x{0:X}'
'GollopMailers LDR TlsIndex invalid {0}'
'GollopMailers LDR sanity exception: '
'HIGHLOW relocation'
'Import DLL name'
'Import FunctusAurata'
'Import INT'
'Import descriptor'
'Import hint/name'
'Import thunk'
'LdrpHandleTlsData outside ntdll .text'
'LdrpReleaseTlsEntry outside ntdll .text'
'LoadConfig32'
'OK'
'PE headers'
'Required API resolve failed: type={0}, FreshBubals={1}, module=0x{2:X}'
'TLS32'
'TLS64'
'x86 disabled until ABI proof'
ntdll.dll
kernel32.dll
LdrpInitializeTls
"STATUS_SUCCESS"
UNKNOWN(0x00000001)
UNKNOWN(0x00000002)
UNKNOWN(0x00000003)

O ServerEditor.SortMemory método (0x06000014) verifica a estrutura PE e os sinalizadores antes de carregar a carga útil.

Para confirmar esse comportamento, invocamos o método por meio de reflexão usando o arquivo baixado. WPA.exe arquivo como entrada. O PE foi carregado com sucesso.

O PE compilado em C++ se disfarça como WPA.exe ( Windows Analisador de desempenho). Identificamos a carga útil como uma versão ofuscada de Amatera Stealer 4.2.3-alpha1.

Ele utiliza técnicas como achatamento de fluxo de controle, hashing de API, verificações anti-depuração e predicados opacos para complicar a análise. Também detectamos o uso da técnica Heaven's Gate, resolução de DNS sobre HTTPS (DoH) através do DNS do Google e sockets brutos. \Device\Afd\Endpoint para comunicação em rede. 

Após a execução desta etapa, também observamos o download e a execução de cargas úteis adicionais a partir de endereços IP do C2.

Em alguns casos, os pacotes do WiX Burn baixaram outro payload associado ao PavinLoader. Em outros, detectamos o HijackLoader. Isso permite que os operadores da campanha implantem vários payloads em uma máquina comprometida.

IOCs 

hashes SHA-256

bdf313a019e025ebf58ccef4619444ee70e661bd444e0644ebeabd8f5caad14c 

e3830f5747e3f46537d217124d80c9f3bb4d89f8d4f5138dce69ee54ea4fb6b9 

a4f03272cf96732dc9f58bb466d16f358e7f50d46dba30526a9fbebfec11717b 

bf04160dd1ce3571e0eb6d6dda1713c788797b5599399d4a93665a757eec376e 

54fa8083c05334aa360256fbbb0ca901ce7e244a0359dd664cae78977371ec91 

c1ea6d169565c70ac5d812e73483814929e9b3548ead6633595937e71a334adb 

001337488c32d8610c2aef6f9330acca825f0afacd071bf6ebfc06b5a1a69f09 

2837099af431e9afee76ce5e6ab5cb86bedce06e31c22be46250cb453cfdb978 

252c5a3d150275013f52b4820097d7163ced4aa2f1be0fca032f8a5017673816 

0c9c64b7383ec249bcf6271a4b73206d94de130ca401d16ab77fe01e5193a312 

6700f62e1a3b33340cd678c388ecc8bac2e5943c0627df5d1b99b879c3ca42c9 

endereços IP 

93.152.224[.]75: downloads PavinLoader 

65.21.80[.]170: downloads PavinLoader 

195.63.142[.]49: downloads PavinLoader 

Domínios 

perfectverified[.]com: ClickFix 

PavinLoader C2 

catalyst-pro[.]lat 

twigoamwu[.]cfd 

trusaifi[.]cfd 

stellar-minds[.]cfd 

pinnacle-labs[.]lat 

nexahub[.]lat 

fimwoglea[.]shop 

velodium[.]lat 

rpcsecnoweb[.]pro 

more-arpc[.]icu 

echo-systems[.]cfd 

kelemet[.]shop 

zarwieciv[.]cfd 

URLs 

telegra[.]ph/Project-PySynth-06-28: Entrega morta de Amatera 

Agradecimentos   


Desde a denúncia de ameaças até a sua remoção.

Os riscos de segurança cibernética nunca devem se espalhar além de uma manchete. Mantenha as ameaças longe de seus dispositivos fazendo o download Malwarebytes hoje mesmo.

Sobre o autor

Gabriele é um engenheiro de pesquisa de malware que adora combater malware. Quando não está fazendo isso, você o encontrará curtindo a natureza, a arte e os animais.