
Chargeur réflexif en C# pour binaires non gérés.
Chargeur réflexif C# pour binaires non managés.
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>
Modifiez les symboles de compilation pour ajuster rapidement le flux du programme : (Clic droit sur le projet dans Visual Studio -> Propriétés -> Générer -> Symboles de compilation conditionnelle)
Les exécutables lancés par RunPE doivent être liés statiquement afin que la redirection de StdOut et StdErr fonctionne correctement. Pour modifier ce paramètre dans Visual Studio :
Configuration Properties -> C/C++ -> Code GenerationRuntime Library par Multi-threaded (/MT)
ou Multi-threaded Debug (/MTd)Les exécutables qui n'utilisent pas l'API Windows CommandLineToArgvW pour analyser les arguments ne seront pas transmis correctement via RunPE. Lors de l'exécution de PE dont l'opérateur contrôle la compilation, il est recommandé d'ajouter la prise en charge de l'analyse des arguments à l'aide de cette API.
Par exemple, le code suivant fonctionnera lorsque le programme est exécuté indépendamment, mais échouera lorsqu'il sera transmis à RunPE puisque "foo" a été déplacé vers argv[2] :
if (argv[1] == "foo") {
bar();
}
Exemple de refactorisation de argv en 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;
}