
Biblioteca Object Pascal (Delphi) para análise, mapeamento, carregamento e despejo de arquivos PE do Windows, com relocações, importações, TLS e leitura de memória de processos remotos.
NativePe é uma biblioteca de Portable Executable do Windows escrita em Object Pascal para Delphi.
O projeto concentra-se em parsing de PE, mapeamento, carregamento, relocação, tratamento de importação e exportação, dumping, leitura de memória de processos e tópicos relacionados de internals do Windows. Suporta builds Win32 e Win64 a partir da mesma árvore de código-fonte.
NativePe é um projeto de pesquisa. Foi testado contra um grande conjunto de arquivos PE normais, incomuns, malformados e hostis, mas não afirma tratar corretamente todos os arquivos PE possíveis.
Parte da motivação é pessoal. Usei Delphi por volta do início dos anos 2000 e queria revisitar o desenvolvimento de baixo nível no Windows com Delphi moderno.
NativePe é também um experimento prático para mostrar que Object Pascal ainda pode ser usado para pesquisa de PE e internals do Windows.
O núcleo de processamento de PE do NativePe é um port/reimplementação em Object Pascal do libpeconv de hasherezade.
O código foi reescrito em Object Pascal, mas a divisão do módulo central e muitas operações públicas, caminhos de validação, decisões de fluxo de controle, regras de fallback, diagnósticos e testes foram derivados do código-fonte do libpeconv. NativePe, portanto, não é uma implementação clean-room ou projetada de forma independente da funcionalidade do libpeconv que porta.
A revisão do libpeconv usada pelo harness diferencial atual é o commit 0fc25f680e03699d33ef3b2034a6724365f3d1a4.
Agradecimentos a hasherezade por publicar o libpeconv. Consulte docs/PROVENANCE.md para a relação em nível de código-fonte e THIRD-PARTY-NOTICES.md para atribuições e avisos de licença.
NativePe é mais do que uma tradução de sintaxe do libpeconv. O projeto atual adiciona funcionalidades específicas do NativePe e integração com Delphi/Windows em torno do núcleo portado.
Isso inclui resolução de API Set, provedores de memória WinAPI/NTAPI/direct-syscall plugáveis, inicialização de security-cookie, helpers de reciclagem de PE e código de integração relacionado. Essas partes não têm contraparte direta de módulo-fonte no núcleo fixado do libpeconv.
O repositório também contém projetos de teste Delphi específicos do NativePe, fixtures do mundo real, ferramentas de corpus e testes de integração com Windows.
Mais detalhes estão em docs/FEATURES.md.
NativePe separa a lógica de PE das operações de memória do sistema operacional selecionadas através de TNativePeMemoryProvider.
Os backends internos atuais são:
TWinApiMemoryProviderTNtApiMemoryProviderTSyscallMemoryProvider no Win64O caminho de hook existente também mantém seu switch de compatibilidade opcional UseSyscalls para proteção de memória baseada em direct syscall.
Consulte docs/MEMORY-PROVIDERS.md.
NativePe usa várias camadas de teste:
A execução diferencial documentada de 25 de setembro de 2026 processou 30.159 caminhos de corpus idênticos com NativePe e o harness fixado do libpeconv. Em nível de resultado, 30.147 caminhos coincidiram e 12 diferiram. NativePe não registrou nenhum crash de worker nessa execução; o harness do libpeconv registrou seis. Esses resultados descrevem apenas este corpus e estes harnesses e não estabelecem superioridade geral.
A execução não foi uma execução de desempenho com qualidade de benchmark, portanto seus dados de tempo não são usados para alegações de desempenho. Corpora externos e amostras de malware não são distribuídos com NativePe.
Consulte docs/TESTING.md, docs/CORPUS-RESULTS.md e docs/LIBPECONV-COMPARISON.md.
NativePe é desenvolvido com Delphi 12 Athens.
Abra NativePe.groupproj para compilar a demo incluída, os testes, o executor de corpus, a ferramenta de dump de processos e os projetos de teste do mundo real.
O código-fonte principal da biblioteca está em src. Os projetos também podem usar NativePe diretamente adicionando src ao caminho de busca de units do Delphi e referenciando as units NativePe.* necessárias.
Tanto Win32 quanto Win64 são suportados pelos projetos incluídos.
O exemplo a seguir mapeia uma imagem PE, aplica relocações e resolve importações. Ele não chama o ponto de entrada do PE.
program PeLoaderMinimal;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
NativePe.BufferUtil,
NativePe.PeLoader;
var
Image: TAlignedBuf;
ImageSize: NativeUInt;
begin
if ParamCount <> 1 then
Halt(1);
Image := LoadPeExecutable(ParamStr(1), ImageSize);
if Image = nil then
Halt(1);
try
Writeln('Loaded at: 0x', IntToHex(NativeUInt(Image), SizeOf(Pointer) * 2));
Writeln('Virtual size: ', ImageSize);
finally
FreePeBuffer(Image, ImageSize);
end;
end.
Adicione src ao caminho de busca de units do Delphi e execute o programa com um arquivo PE como seu único argumento.
O repositório contém vários executáveis e scripts auxiliares. Os principais pontos de entrada estão documentados em docs/BINARIES.md.
Importante: NativePeDemo.exe carrega e executa o arquivo PE fornecido. Use-o apenas com arquivos de teste confiáveis. O executor de corpus foi projetado para processamento estático de PE e não executa intencionalmente pontos de entrada de PE ou callbacks TLS.