
Рефлективный загрузчик PE, написанный на Zig. Загружает и выполняет нативные и .NET PE-файлы напрямую из памяти.
Загрузчик PE рефлексивного типа, написанный на Zig. Загружает и выполняет нативные и .NET PE-файлы непосредственно из памяти.
__security_cookie для защиты буфера /GS)SetProcessValidCallTargetsВспомогательные функции для разрешения экспорта из загруженного PE-образа:
getExportByName(base, ntheaders, name) — разрешение по имениgetExportByOrdinal(base, ntheaders, ordinal) — разрешение по порядковому номеруАвтоматически обрабатывает перенаправленные экспорты, загружая целевую DLL (например, "NTDLL.RtlAllocateHeap" разрешается в фактическую функцию в ntdll.dll).
Автоматически разрешает наборы API Windows (api-ms-win-*, ext-ms-win-*) в их фактические DLL-хостфайлы с помощью PEB ApiSetMap. Это позволяет загружать PE-файлы, которые импортируют из виртуальных DLL наборов API.
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 # Disable .NET support (enabled by default)
zig build # Build all targets
zig build run-putty64 # Run 64-bit native PE example
zig build run-putty32 # Run 32-bit native PE example
zig build run-dotnet # Run .NET assembly example
zig build test # Run unit tests
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) через вызов CLRЭтот проект включает загрузку и выполнение произвольного кода, что может быть потенциально опасно. Используйте этот загрузчик только с доверенными PE-файлами и в контролируемых средах. Авторы не несут ответственности за любое неправомерное использование или ущерб, причиненный этим программным обеспечением.
Вклад в zig-pe приветствуется! Пожалуйста, не стесняйтесь отправлять pull request'ы, создавать issue или распространять информацию.
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-бит |