Carregador reflexivo em C# para binários não gerenciados.
Carregador reflexivo em C# para binários não gerenciados.
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>
Edite os símbolos de compilação para ajustar rapidamente o fluxo do programa: (Clique com o botão direito no projeto no Visual Studio -> Propriedades -> Build -> Símbolos de Compilação Condicional)
Os executáveis iniciados pelo RunPE devem ser vinculados estaticamente para que o redirecionamento de StdOut e StdErr funcione corretamente. Para alterar essa configuração no Visual Studio:
Configuration Properties -> -> C/C++Code GenerationRuntime Library para Multi-threaded (/MT) ou Multi-threaded Debug (/MTd)Executáveis que não usam a API do Windows CommandLineToArgvW para analisar argumentos não serão passados adequadamente pelo RunPE. Ao executar PEs em que o operador tem controle sobre a compilação, é sugerido adicionar suporte para analisar argumentos usando essa API.
Por exemplo, o código a seguir funcionará quando o programa for executado de forma independente, mas falhará quando passado ao RunPE, pois "foo" foi deslocado para argv[2]:
if (argv[1] == "foo") {
bar();
}
Exemplo de refatoração de argv para 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;
}