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
- 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)
# Linux / WSL
git clone https://github.com/druserx/scrutator
cd scrutator
make
# Windows (MinGW)
mingw32-makeSem dependências externas. Só precisa de gcc e make.
# 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[ 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
═════════════════════════════════════════════════════════════
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
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.
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.0em seção executável — suspeito de shellcode ou packer
Além de verificar APIs individualmente, detecta combinações que caracterizam técnicas específicas:
VirtualAllocEx+WriteProcessMemory+CreateRemoteThread→ injeção de DLL clássicaNtUnmapViewOfSection+VirtualAlloc+WriteProcessMemory→ process hollowingVirtualAlloc+VirtualProtect→ possível shellcode loader
- 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)
- PE Format Specification — Microsoft PECOFF v0.4
- RFC 6234 — US Secure Hash Algorithms
- Shannon Entropy in Malware Analysis
MIT