
Caricatore PE riflessivo scritto in Zig. Carica ed esegue file PE nativi e .NET direttamente dalla memoria.
Caricatore PE riflessivo scritto in Zig. Carica ed esegue file PE nativi e .NET direttamente dalla memoria.
__security_cookie per la sicurezza del buffer /GS)SetProcessValidCallTargetsFunzioni di utilità per risolvere le esportazioni da un'immagine PE caricata:
getExportByName(base, ntheaders, name) — risolve per nomegetExportByOrdinal(base, ntheaders, ordinal) — risolve per ordinaleGestisce automaticamente le esportazioni inoltrate caricando la DLL di destinazione (ad es., "NTDLL.RtlAllocateHeap" risolve la funzione effettiva in ntdll.dll).
Risolve automaticamente gli API Set di Windows (api-ms-win-*, ext-ms-win-*) nelle loro DLL host effettive utilizzando il PEB ApiSetMap. Ciò consente di caricare PE che importano da DLL virtuali di API Set.
utils.detect_platform(buffer) — Rileva se il PE è a 32 o 64 bitutils.is_dotnet_assembly(ntheaders) — Verifica se il PE è un assembly .NETutils.getDotNetVersion(buffer) — Estrae la stringa della versione del runtime .NET dai metadatiutils.rvaToFileOffset(buffer, rva) — Converte RVA in offset file raw| Architettura | Codice macchina | Bitness |
|---|---|---|
| i386 | 0x014c | 32-bit |
| AMD64 | 0x8664 | 64-bit |
| IA64 | 0x0200 | 64-bit |
| ARM (ARMNT) | 0x01C4 | 32-bit |
| ARM64 | 0xAA64 | 64-bit |
Clona il repository:
git clone https://github.com/Thoxy67/zig-pe.git
cd zig-pe
Compila il progetto:
zig build
zig build -Ddotnet=false # Disabilita il supporto .NET (abilitato per impostazione predefinita)
zig build # Compila tutti i target
zig build run-putty64 # Esegue l'esempio PE nativo a 64 bit
zig build run-putty32 # Esegue l'esempio PE nativo a 32 bit
zig build run-dotnet # Esegue l'esempio assembly .NET
zig build test # Esegue i test unitari
const pe = @import("pe");
pub fn main() !void {
// Carica ed esegue un file PE incorporato
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");
// Dopo aver caricato una DLL in memoria...
const base: [*]const u8 = @ptrCast(loaded_base);
const ntheaders = // ... ottieni gli header NT
// Risolvi per nome
if (pe.getExportByName(base, ntheaders, "ExportedFunction")) |func_ptr| {
const func: *const fn () void = @ptrCast(@alignCast(func_ptr));
func();
}
// Risolvi per ordinale
if (pe.getExportByOrdinal(base, ntheaders, 42)) |func_ptr| {
// Usa il puntatore a funzione
}
GetCommandLineW() restituisca gli argomenti fornitiMain(string[] args) tramite chiamata CLRQuesto progetto prevede il caricamento e l'esecuzione di codice arbitrario, che può essere potenzialmente pericoloso. Utilizza questo caricatore solo con file PE attendibili e in ambienti controllati. Gli autori non sono responsabili per eventuali usi impropri o danni causati da questo software.
I contributi a zig-pe sono benvenuti! Sentiti libero di inviare pull request, aprire issue o diffondere la notizia.
git checkout -b feature/AmazingFeature)git commit -m 'Aggiungi una funzionalità straordinaria')git push origin feature/AmazingFeature)Questo progetto è concesso in licenza con la licenza MIT - vedi il file LICENSE per i dettagli.
Questo progetto ha solo scopo educativo. Assicurati di avere i diritti e le autorizzazioni necessari prima di caricare ed eseguire qualsiasi file PE.