
Una implementación en Nim de carga reflectiva de PE desde memoria
Una implementación en Nim de carga reflectiva de PE desde memoria. La base de este código fue tomada de RunPE-In-Memory - el cual porté a Nim.
Necesitarás instalar las siguientes dependencias:
nimble install ptr_math winim
Solo probé esto con la versión 1.6.2 de Nim, así que usa esa versión para pruebas o no puedo garantizar que no haya errores al usar otra versión.
Si quieres pasar argumentos en tiempo de ejecución o no quieres pasar argumentos en absoluto, compila mediante:
nim c NimRunPE.nim
Si quieres codificar argumentos personalizados, modifica const exeArgs según tus necesidades y compila con:
nim c -d:args NimRunPE.nim - esto fue contribuido por @glynx, ¡gracias! 😎
Si quieres soporte completo de devolución de llamada (callback) de almacenamiento local de subprocesos (TLS), permitiendo la ejecución de PEs de Rust, etc., compila con:
nim c -d:full_tls NimRunPE.nim
Créditos a BlackBone y el blog de lander/solstice-loader por la implementación de la opción full_tls.
La técnica en sí es bastante antigua, pero no encontré una implementación en Nim hasta ahora. Así que esto ha cambiado ahora. :)
Si planeas cargar, por ejemplo, Mimikatz con esta técnica, asegúrate de compilar una versión desde el código fuente por tu cuenta, ya que los binarios de la versión publicada no aceptan argumentos después de ser cargados reflectivamente por este cargador. ¿Por qué? Realmente no lo sé, es extraño pero es un hecho. Si compilas por tu cuenta, seguirá funcionando:
Mi Packer privado también está armado con esta técnica, pero todas las funciones de Win32 son reemplazadas con Syscalls allí. Eso hace que la técnica sea más sigilosa.