
Реализация на Nim рефлективной загрузки PE-файлов из памяти
Реализация на Nim рефлективной загрузки PE-файлов из памяти. Основа кода взята из RunPE-In-Memory, который я портировал на Nim.
Вам потребуется установить следующие зависимости:
nimble install ptr_math winim
Я тестировал это только с Nim версии 1.6.2, поэтому используйте эту версию для тестирования, иначе я не могу гарантировать отсутствие ошибок при использовании другой версии.
Если вы хотите передавать аргументы во время выполнения или не хотите передавать аргументы вообще, компилируйте так:
nim c NimRunPE.nim
Если вы хотите жёстко задать свои аргументы, измените const exeArgs по своему усмотрению и компилируйте с:
nim c -d:args NimRunPE.nim — это было предложено @glynx, спасибо! 😎
Если вам нужна полная поддержка callback-ов Thread Local Storage (TLS), позволяющая запускать Rust PE и т.д., компилируйте с:
nim c -d:full_tls NimRunPE.nim
Благодарность BlackBone и блогу lander'а/solstice-loader за реализацию опции full_tls.
Сама техника довольно старая, но я пока не нашёл реализации на Nim. Теперь это исправлено. :)
Если вы планируете загружать, например, Mimikatz с помощью этой техники — обязательно скомпилируйте версию из исходников самостоятельно, так как готовые бинарники не принимают аргументы после рефлективной загрузки этим загрузчиком. Почему? Честно, не знаю, это странно, но факт. Если скомпилировать самостоятельно, всё будет работать:
Мой частный Packer также оснащён этой техникой — но все функции Win32 заменены на Syscalls. Это делает технику более скрытной.