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 -> Properties -> Build -> Conditional Compilation Symbols)
Исполняемые файлы, запускаемые через RunPE, должны быть статически слинкованы, чтобы перенаправление StdOut и StdErr работало корректно. Чтобы изменить этот параметр в Visual Studio:
Configuration Properties -> C/C++ -> Code GenerationRuntime Library на Multi-threaded (/MT)
или Multi-threaded Debug (/MTd)Исполняемые файлы, которые не используют API Windows CommandLineToArgvW для разбора аргументов, не будут корректно переданы через RunPE. При запуске PE-файлов, компиляцию которых оператор контролирует, рекомендуется добавить поддержку разбора аргументов с помощью этого API.
Например, следующий код будет работать при самостоятельном запуске программы, но не сработает при передаче через RunPE, поскольку "foo" смещается в argv[2]:
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;
}