
Uma implementação em Nim de reflective PE-Loading a partir da memória
Uma implementação em Nim de carregamento reflexivo de PE a partir da memória. A base para este código foi retirada de RunPE-In-Memory - que portei para Nim.
Você precisará instalar as seguintes dependências:
nimble install ptr_math winim
Eu testei apenas com a versão 1.6.2 do Nim, então use essa versão para testes ou não posso garantir que não haverá erros ao usar outra versão.
Se quiser passar argumentos em tempo de execução ou não quiser passar argumentos, compile via:
nim c NimRunPE.nim
Se quiser codificar argumentos personalizados, modifique const exeArgs conforme suas necessidades e compile com:
nim c -d:args NimRunPE.nim - isso foi contribuído por @glynx, obrigado! 😎
Se quiser suporte completo a callbacks de Thread Local Storage (TLS), permitindo execução de PEs Rust, etc, compile com:
nim c -d:full_tls NimRunPE.nim
Créditos a BlackBone e ao blog do lander/solstice-loader pela implementação da opção full_tls.
A técnica em si é bem antiga, mas ainda não encontrei uma implementação em Nim. Então isso mudou agora. :)
Se você planeja carregar, por exemplo, Mimikatz com esta técnica - certifique-se de compilar uma versão a partir do código-fonte por conta própria, pois os binários de lançamento não aceitam argumentos após serem carregados reflexivamente por este loader. Por quê? Eu realmente não sei, é estranho, mas é um fato. Se você compilar por conta própria, ainda funcionará:
Meu Packer privado também é armado com esta técnica - mas todas as funções Win32 são substituídas por Syscalls lá. Isso torna a técnica mais furtiva.