
비관리 바이너리용 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;
}