
Cargador de PE reflexivo escrito en Zig. Carga y ejecuta archivos PE nativos y .NET directamente desde la memoria.
Cargador de PE reflexivo escrito en Zig. Carga y ejecuta archivos PE nativos y .NET directamente desde la memoria.
__security_cookie para seguridad de búfer /GS)SetProcessValidCallTargetsFunciones auxiliares para resolver exportaciones de una imagen PE cargada:
getExportByName(base, ntheaders, name) — resolver por nombregetExportByOrdinal(base, ntheaders, ordinal) — resolver por ordinalManeja exportaciones reenviadas automáticamente cargando el DLL destino (ej., "NTDLL.RtlAllocateHeap" se resuelve a la función real en ntdll.dll).
Resuelve automáticamente los conjuntos de API de Windows (api-ms-win-*, ext-ms-win-*) a sus DLL anfitrionas reales usando el ApiSetMap del PEB. Esto permite cargar PE que importan de DLL de conjuntos de API virtuales.
utils.detect_platform(buffer) — Detecta si el PE es de 32 o 64 bitsutils.is_dotnet_assembly(ntheaders) — Verifica si el PE es un ensamblado .NETutils.getDotNetVersion(buffer) — Extrae la cadena de versión del runtime .NET de los metadatosutils.rvaToFileOffset(buffer, rva) — Convierte RVA a desplazamiento de archivo sin procesar| Arquitectura | Código de máquina | Bits |
|---|---|---|
| i386 | 0x014c | 32 |
| AMD64 | 0x8664 | 64 |
| IA64 | 0x0200 | 64 |
| ARM (ARMNT) | 0x01C4 | 32 |
| ARM64 | 0xAA64 | 64 |
Clona el repositorio:
git clone https://github.com/Thoxy67/zig-pe.git
cd zig-pe
Compila el proyecto:
zig build
zig build -Ddotnet=false # Deshabilitar soporte .NET (habilitado por defecto)
zig build # Compilar todos los objetivos
zig build run-putty64 # Ejecutar ejemplo de PE nativo de 64 bits
zig build run-putty32 # Ejecutar ejemplo de PE nativo de 32 bits
zig build run-dotnet # Ejecutar ejemplo de ensamblado .NET
zig build test # Ejecutar pruebas unitarias
const pe = @import("pe");
pub fn main() !void {
// Cargar y ejecutar un archivo PE incrustado
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");
// Después de cargar un DLL en memoria...
const base: [*]const u8 = @ptrCast(loaded_base);
const ntheaders = // ... obtener cabeceras NT
// Resolver por nombre
if (pe.getExportByName(base, ntheaders, "ExportedFunction")) |func_ptr| {
const func: *const fn () void = @ptrCast(@alignCast(func_ptr));
func();
}
// Resolver por ordinal
if (pe.getExportByOrdinal(base, ntheaders, 42)) |func_ptr| {
// Usar el puntero a función
}
GetCommandLineW() devuelve los argumentos proporcionadosMain(string[] args) mediante invocación CLREste proyecto implica cargar y ejecutar código arbitrario, lo que puede ser potencialmente peligroso. Use este cargador únicamente con archivos PE de confianza y en entornos controlados. Los autores no son responsables por cualquier uso indebido o daño causado por este software.
¡Las contribuciones a zig-pe son bienvenidas! No dude en enviar pull requests, crear issues o difundir el proyecto.
git checkout -b feature/CaracteristicaIncreible)git commit -m 'Añadir alguna CaracterísticaIncreible')git push origin feature/CaracteristicaIncreible)Este proyecto está bajo la Licencia MIT; consulte el archivo LICENSE para más detalles.
Este proyecto es solo con fines educativos. Asegúrese de tener los derechos y permisos necesarios antes de cargar y ejecutar cualquier archivo PE.