
Zig로 작성된 반사적 PE 로더. 네이티브 및 .NET PE 파일을 메모리에서 직접 로드하고 실행합니다.
Zig로 작성된 반사형 PE 로더입니다. 네이티브 및 .NET PE 파일을 메모리에서 직접 로드하고 실행합니다.
__security_cookie for /GS 버퍼 보안)SetProcessValidCallTargets를 통해 유효한 호출 대상 등록로드된 PE 이미지에서 내보내기를 해석하기 위한 유틸리티 함수:
getExportByName(base, ntheaders, name) — 이름으로 해석getExportByOrdinal(base, ntheaders, ordinal) — 순서로 해석전달된 내보내기를 자동으로 처리하여 대상 DLL을 로드합니다 (예: "NTDLL.RtlAllocateHeap"은 ntdll.dll의 실제 함수로 해석됨).
PEB ApiSetMap을 사용하여 Windows API 세트(api-ms-win-*, ext-ms-win-*)를 실제 호스트 DLL로 자동 해석합니다. 이를 통해 가상 API 세트 DLL에서 임포트하는 PE를 로드할 수 있습니다.
utils.detect_platform(buffer) — PE가 32비트인지 64비트인지 감지utils.is_dotnet_assembly(ntheaders) — PE가 .NET 어셈블리인지 확인utils.getDotNetVersion(buffer) — 메타데이터에서 .NET 런타임 버전 문자열 추출utils.rvaToFileOffset(buffer, rva) — RVA를 원시 파일 오프셋으로 변환저장소를 클론합니다:
git clone https://github.com/Thoxy67/zig-pe.git
cd zig-pe
프로젝트를 빌드합니다:
zig build
zig build -Ddotnet=false # .NET 지원 비활성화 (기본값: 활성화)
zig build # 모든 대상 빌드
zig build run-putty64 # 64비트 네이티브 PE 예제 실행
zig build run-putty32 # 32비트 네이티브 PE 예제 실행
zig build run-dotnet # .NET 어셈블리 예제 실행
zig build test # 단위 테스트 실행
const pe = @import("pe");
pub fn main() !void {
// Load and execute an embedded PE file
try pe.RunPE.init(@embedFile("bin/app.exe")).run();
}
const pe = @import("pe");
pub fn main() !void {
var loader = pe.RunPE.init(@embedFile("bin/app.exe"));
try loader.runWithArgs(&.{ "arg1", "arg2", "arg3" });
}
const std = @import("std");
const pe = @import("pe");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const file_content = try std.fs.cwd().readFileAlloc(
allocator,
"path/to/executable.exe",
std.math.maxInt(usize),
);
defer allocator.free(file_content);
try pe.RunPE.init(file_content).run();
}
const pe = @import("pe");
// After loading a DLL into memory...
const base: [*]const u8 = @ptrCast(loaded_base);
const ntheaders = // ... get NT headers
// Resolve by name
if (pe.getExportByName(base, ntheaders, "ExportedFunction")) |func_ptr| {
const func: *const fn () void = @ptrCast(@alignCast(func_ptr));
func();
}
// Resolve by ordinal
if (pe.getExportByOrdinal(base, ntheaders, 42)) |func_ptr| {
// Use the function pointer
}
GetCommandLineW()가 제공된 인수를 반환합니다.Main(string[] args)에 직접 전달됩니다.이 프로젝트는 임의 코드를 로드하고 실행하는 작업을 포함하므로 잠재적으로 위험할 수 있습니다. 신뢰할 수 있는 PE 파일에 대해서만 제어된 환경에서 이 로더를 사용하십시오. 저자는 이 소프트웨어의 오용이나 손해에 대해 책임을 지지 않습니다.
zig-pe에 대한 기여를 환영합니다! 풀 리퀘스트를 제출하거나, 이슈를 생성하거나, 널리 알려 주시기 바랍니다.
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하십시오.
이 프로젝트는 교육 목적으로만 제공됩니다. PE 파일을 로드하고 실행하기 전에 필요한 권한과 허가가 있는지 확인하십시오.
| 아키텍처 | 머신 코드 | 비트 수 |
|---|
| i386 | 0x014c | 32비트 |
| AMD64 | 0x8664 | 64비트 |
| IA64 | 0x0200 | 64비트 |
| ARM (ARMNT) | 0x01C4 | 32비트 |
| ARM64 | 0xAA64 | 64비트 |