
C#製のアンマネージドバイナリ向けリフレクティブローダー。
アンマネージド・バイナリ用のC#リフレクティブ・ローダーです。
Usage: RunPE.exe <file-to-run> <args-to-file-to-run>
e.g. RunPE.exe C:\Windows\System32\net.exe localgroup administrators
Alternative usage: RunPE.exe ---f <file-to-pretend-to-be> ---b <base64 blob of file bytes> ---a <base64 blob of args>
e.g: RunPE.exe ---f C:\Windows\System32\svchost.exe ---b <net.exe, base64 encoded> ---a <localgroup administrators, base64 encoded>
コンパイルシンボルを編集して、プログラムの流れを素早く調整できます: (Visual Studio でプロジェクトを右クリック -> プロパティ -> ビルド -> 条件付きコンパイルシンボル)
RunPE によって起動される実行可能ファイルは、StdOut と StdErr のリダイレクトが正しく動作するように、静的にリンクされている必要があります。 Visual Studio でこの設定を変更するには:
構成プロパティ -> C/C++ -> コード生成 に移動するランタイム ライブラリ の値を マルチスレッド (/MT)
または マルチスレッド デバッグ (/MTd) に変更する引数の解析に Windows API の CommandLineToArgvW を使用しない実行可能ファイルは、RunPE 経由では適切に渡されません。 操作者がコンパイルを制御できる PE を実行する場合は、この API を使用した引数解析のサポートを追加することをお勧めします。
例えば、次のコードはプログラムを単独で実行した場合には動作しますが、"foo" が argv[2] に移動されるため、RunPE に渡すと失敗します:
if (argv[1] == "foo") {
bar();
}
argv を CommandLineArgvW にリファクタリングする例:
#include <stdio.h>
#include <Windows.h>
int main(int argc, char* argv[]) {
int nArgs;
LPWSTR *szArglist;
szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
for (int i = 0; i < nArgs; i++) {
printf("argv[%d]: %ws\n", i, szArglist[i]);
}
return 0;
}