
Reflektierender PE-Lader, geschrieben in Zig. Lädt native und .NET PE-Dateien direkt aus dem Speicher und führt sie aus.
Reflektiver PE-Lader geschrieben in Zig. Lädt und führt native und .NET PE-Dateien direkt aus dem Speicher aus.
__security_cookie für /GS-Puffersicherheit)SetProcessValidCallTargetsHilfsfunktionen zum Auflösen von Exporten aus einem geladenen PE-Image:
getExportByName(base, ntheaders, name) — nach Name auflösengetExportByOrdinal(base, ntheaders, ordinal) — nach Ordinal auflösenBehandelt weitergeleitete Exporte automatisch, indem die Ziel-DLL geladen wird (z.B. "NTDLL.RtlAllocateHeap" wird zur tatsächlichen Funktion in ntdll.dll aufgelöst).
Löst automatisch Windows-API-Sets (api-ms-win-*, ext-ms-win-*) zu ihren tatsächlichen Host-DLLs auf, unter Verwendung der PEB ApiSetMap. Dies ermöglicht das Laden von PEs, die aus virtuellen API-Set-DLLs importieren.
utils.detect_platform(buffer) — Erkennt, ob PE 32-Bit oder 64-Bit istutils.is_dotnet_assembly(ntheaders) — Überprüft, ob PE eine .NET-Assembly istutils.getDotNetVersion(buffer) — Extrahiert die .NET-Laufzeitversionszeichenfolge aus Metadatenutils.rvaToFileOffset(buffer, rva) — Konvertiert RVA in rohen Dateioffset| Architektur | Maschinencode | Bitness |
|---|---|---|
| i386 | 0x014c | 32-Bit |
| AMD64 | 0x8664 | 64-Bit |
| IA64 | 0x0200 | 64-Bit |
| ARM (ARMNT) | 0x01C4 | 32-Bit |
| ARM64 | 0xAA64 | 64-Bit |
Klonen Sie das Repository:
git clone https://github.com/Thoxy67/zig-pe.git
cd zig-pe
Erstellen Sie das Projekt:
zig build
zig build -Ddotnet=false # .NET-Unterstützung deaktivieren (standardmäßig aktiviert)
zig build # Alle Ziele erstellen
zig build run-putty64 # 64-Bit natives PE-Beispiel ausführen
zig build run-putty32 # 32-Bit natives PE-Beispiel ausführen
zig build run-dotnet # .NET-Assembly-Beispiel ausführen
zig build test # Komponententests ausführen
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() die bereitgestellten Argumente zurückgibtMain(string[] args) über CLR-Aufruf übergebenDieses Projekt beinhaltet das Laden und Ausführen von beliebigem Code, was potenziell gefährlich sein kann. Verwenden Sie diesen Lader nur mit vertrauenswürdigen PE-Dateien und in kontrollierten Umgebungen. Die Autoren übernehmen keine Verantwortung für Missbrauch oder Schäden, die durch diese Software verursacht werden.
Beiträge zu zig-pe sind willkommen! Zögern Sie nicht, Pull-Requests einzureichen, Issues zu erstellen oder die Nachricht zu verbreiten.
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Dieses Projekt ist unter der MIT-Lizenz lizenziert - siehe die Datei LICENSE für Details.
Dieses Projekt dient nur zu Bildungszwecken. Stellen Sie sicher, dass Sie die notwendigen Rechte und Berechtigungen haben, bevor Sie eine PE-Datei laden und ausführen.