
C#-Reflective-Loader für nicht verwaltete Binärdateien.
C#-Reflective-Loader für nicht verwaltete Binärdateien.
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>
Bearbeiten Sie die Kompilierungssymbole, um den Programmablauf schnell anzupassen: (Rechtsklick auf das Projekt in Visual Studio -> Eigenschaften -> Build -> Bedingte Kompilierungssymbole)
Von RunPE gestartete ausführbare Dateien müssen statisch gelinkt sein, damit die StdOut- und StdErr-Umleitung korrekt funktioniert. So ändern Sie diese Einstellung in Visual Studio:
Configuration Properties -> C/C++ -> Code GenerationRuntime Library entweder auf Multi-threaded (/MT)
oder Multi-threaded Debug (/MTd)Ausführbare Dateien, die die Windows-API CommandLineToArgvW nicht zum Parsen von Argumenten verwenden, werden von RunPE nicht korrekt übergeben. Wenn der Bediener die Kontrolle über die Kompilierung der PEs hat, wird empfohlen, Unterstützung für das Parsen von Argumenten über diese API hinzuzufügen.
Beispielsweise funktioniert der folgende Code, wenn das Programm unabhängig ausgeführt wird, schlägt jedoch fehl, wenn es an RunPE übergeben wird, da "foo" auf argv[2] verschoben wurde:
#include <stdio.h>
#include <Windows.h>
int main(int argc, char* argv[]) {
if (argv[1] == "foo") {
bar();
}
}
Beispiel für die Umstellung von argv auf 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;
}