druserx/scrutator
GitHub: druserx/scrutator
Stars: 0 | Forks: 0
# 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
- [PE Format Specification — Microsoft PECOFF v0.4](https://learn.microsoft.com/en-us/windows/win32/debug/pe-format)
- [RFC 6234 — US Secure Hash Algorithms](https://www.rfc-editor.org/rfc/rfc6234)
- [Shannon Entropy in Malware Analysis](https://practicalsecurityanalytics.com/file-entropy/)
## Licença
MIT
标签:客户端加密