
メモリからのリフレクティブPEローディングのNim実装です。このコードのベースはRunPE-In-Memoryから取られており、それをNimに移植しました。
以下の依存関係をインストールする必要があります。
nimble install ptr_math winim
このテストはNim Version 1.6.2でのみ行いました。そのため、テストにはそのバージョンを使用してください。他のバージョンを使用した場合のエラーは保証できません。
実行時に引数を渡したい場合、または引数を渡さない場合は、次のようにコンパイルします。
nim c NimRunPE.nim
カスタム引数をハードコードしたい場合は、const exeArgs を必要に応じて変更し、次のようにコンパイルします。
nim c -d:args NimRunPE.nim - これは @glynx によって提供されました。ありがとう! 😎
完全なThread Local Storage (TLS)コールバックサポートが必要な場合(RustのPEの実行を可能にするなど)、次のようにコンパイルします。
nim c -d:full_tls NimRunPE.nim
full_tlsオプションの実装については、BlackBone と lander's blog/solstice-loader に感謝します。
この手法自体はかなり古いものですが、Nimでの実装はまだ見つかりませんでした。これで状況は変わりました。 :)
例えばMimikatzをこの手法でロードする予定がある場合は、自分でソースからバージョンをコンパイルしてください。リリースバイナリはこのローダーによってリフレクティブにロードされた後、引数を受け付けないためです。なぜか?本当にわかりませんが、奇妙ですが事実です。自分でコンパイルすれば正常に動作します。
私のプライベートな Packer もこの手法で武装化されていますが、そこではすべてのWin32関数がSyscallに置き換えられています。これにより、この手法はよりステルス性が高まります。