Skip to content

Latest commit

 

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Scrutator

Analisador estático de PE para triagem de malware escrito em C puro, sem dependências externas.

O nome vem do latim scrutator — "aquele que examina a fundo". A ideia surgiu da necessidade de ter uma ferramenta rápida, portátil e sem dependência de bibliotecas externas (sem OpenSSL, sem libpe, nada) pra fazer triagem inicial de amostras em ambiente isolado.

                      __        __
   _____________  ___/ /_____ _/ /_____  _____
  / ___/ ___/ / / __/ __/ __ `/ __/ __ \/ ___/
 (__  ) /__/ /_/ /_/ /_/ /_/ / /_/ /_/ / /
/____/\___/\__,_/\__/\__/\__,_/\__/\____/_/

  static pe analyzer  |  v0.4.2

O que faz

  • Hash SHA-256 implementado do zero (sem OpenSSL)
  • Parse completo do formato PE — DOS header, COFF, Optional Header (PE32 e PE32+), seções, imports, exports
  • Entropia de Shannon por seção — detecta packers, código cifrado e shellcode embutido
  • Extração de strings ASCII e UTF-16LE com identificação de padrões suspeitos
  • Análise heurística com 50+ APIs classificadas por categoria de ataque
  • Detecção de técnicas ofensivas: injeção de código, process hollowing, keylogging, persistência via registro, C2 via WinInet/WinHTTP, anti-debugging
  • Score de risco 0-100 com classificação por nível (INFO / BAIXO / MÉDIO / ALTO / CRÍTICO)
  • Compila em Linux e Windows (analisa amostras Windows em qualquer plataforma)

Compilando

# Linux / WSL
git clone https://github.com/druserx/scrutator
cd scrutator
make

# Windows (MinGW)
mingw32-make

Sem dependências externas. Só precisa de gcc e make.


Uso

# análise básica
./scrutator amostra.exe

# saída verbosa (inclui todas as strings extraídas)
./scrutator -v amostra.exe

# salva relatório em arquivo de texto
./scrutator -o relatorio.txt amostra.exe

# os dois juntos
./scrutator -v -o relatorio.txt ransomware.dll

Exemplo de saída

[ INFORMACOES GERAIS ]
─────────────────────────────────────────────────────────────
  Arquivo      : sample_ransomware.exe
  Tamanho      : 487424 bytes (476.0 KB)
  SHA-256      : 3a4b2c1d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b
  Arquitetura  : 32-bit (x86 (i386))
  Subsystem    : Windows GUI
  Tipo         : EXE
  Entry Point  : 0x00012a40
  Image Base   : 0x0000000000400000
  ASLR         : nao
  DEP/NX       : nao

[ SECOES ]
─────────────────────────────────────────────────────────────
  .text       0x00001000  0x00062f10  0x00000400  0x00063000  X R    H=6.91
  .rdata      0x00064000  0x0000e4a8  0x00063400  0x0000e600  . R    H=4.23
  .data       0x00073000  0x00004210  0x00071a00  0x00003200  . RW   H=3.87
  UPX0        0x00078000  0x00040000  0x00000000  0x00000000  X RW   H=0.00
  UPX1        0x000b8000  0x0003e000  0x00075200  0x0003dc00  X RW   H=7.94

[ INDICADORES DE COMPORTAMENTO ]
─────────────────────────────────────────────────────────────
  [CRITICO ] [injecao    ] Trifeta classica de injecao de DLL: VirtualAllocEx + WriteProcessMemory + CreateRemoteThread
  [CRITICO ] [evasao     ] Secao UPX1 executavel com entropia 7.94 - shellcode ou codigo cifrado
  [ALTO    ] [rede       ] URLDownloadToFileA — Baixa arquivo da internet
  [ALTO    ] [persistencia] Referencia a chave Run do registro - padrao de persistencia
  [MEDIO   ] [evasao     ] IsDebuggerPresent — Detecta debugger
  [MEDIO   ] [execucao   ] Referencia a PowerShell - comum em loaders e droppers

═════════════════════════════════════════════════════════════
  SCORE DE RISCO: 87/100  [########..]
  CLASSIFICACAO : CRITICO
═════════════════════════════════════════════════════════════

Estrutura do projeto

scrutator/
├── src/
│   ├── main.c          # ponto de entrada, carregamento do arquivo
│   ├── pe_parser.c     # parse do formato PE (imports, exports, secoes)
│   ├── sha256.c        # SHA-256 implementado do zero (RFC 6234)
│   ├── extrator.c      # extração de strings ASCII e UTF-16LE
│   ├── entropia.c      # entropia de Shannon por seção
│   ├── heuristicas.c   # 50+ APIs classificadas + detecção de combos
│   └── relatorio.c     # output colorido no terminal + exportação txt
├── include/
│   ├── scrutator.h     # tipos base, constantes, cores ANSI
│   ├── pe_parser.h     # estruturas do formato PE (sem windows.h)
│   ├── sha256.h
│   ├── extrator.h
│   ├── entropia.h
│   ├── heuristicas.h
│   └── relatorio.h
└── Makefile

Como funciona

Parser PE

As estruturas do formato PE (DOSHeader, COFFHeader, OptionalHeader32/64, SectionHeader, etc.) são definidas manualmente em pe_parser.h usando #pragma pack(push, 1) — assim a ferramenta compila em Linux sem precisar de windows.h ou MinGW para analisar amostras.

A conversão de RVA para offset físico percorre a section table manualmente, com bounds checking para não explodir em samples corrompidos ou manipulados.

Entropia

Usa a fórmula de Shannon: H = -Σ(p_i × log₂(p_i)) calculada byte a byte por seção. Limiares:

  • >= 7.0 — quase certamente cifrado ou comprimido
  • >= 6.0 em seção executável — suspeito de shellcode ou packer

Heurísticas

Além de verificar APIs individualmente, detecta combinações que caracterizam técnicas específicas:

  • VirtualAllocEx + WriteProcessMemory + CreateRemoteThread → injeção de DLL clássica
  • NtUnmapViewOfSection + VirtualAlloc + WriteProcessMemory → process hollowing
  • VirtualAlloc + VirtualProtect → possível shellcode loader

Limitações conhecidas

  • Análise estática apenas — não executa a amostra
  • Delay imports (DDIR_DELAY_IMPORT) listados mas não totalmente processados ainda
  • Amostras .NET precisam de análise separada (CIL bytecode, não código nativo)
  • Limite de 100MB por arquivo (na prática malware raramente ultrapassa isso)

Referências


Licença

MIT

About

Analisador estatico de PE para analise de malware

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages