
Zig में लिखा गया रिफ्लेक्टिव PE लोडर। नेटिव और .NET PE फ़ाइलों को सीधे मेमोरी से लोड और निष्पादित करता है।
एक प्रतिबिंबित PE लोडर जो Zig में लिखा गया है। यह देशी और .NET PE फ़ाइलों को सीधे मेमोरी से लोड और निष्पादित करता है।
__security_cookie /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 {
// एक एम्बेडेड PE फ़ाइल लोड और निष्पादित करें
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");
// DLL को मेमोरी में लोड करने के बाद...
const base: [*]const u8 = @ptrCast(loaded_base);
const ntheaders = // ... NT हेडर प्राप्त करें
// नाम से हल करें
if (pe.getExportByName(base, ntheaders, "ExportedFunction")) |func_ptr| {
const func: *const fn () void = @ptrCast(@alignCast(func_ptr));
func();
}
// ऑर्डिनल से हल करें
if (pe.getExportByOrdinal(base, ntheaders, 42)) |func_ptr| {
// फ़ंक्शन पॉइंटर का उपयोग करें
}
GetCommandLineW() दिए गए आर्गुमेंट लौटाता हैMain(string[] args) को पास किए जाते हैंइस परियोजना में मनमाना कोड लोड और निष्पादित करना शामिल है, जो संभावित रूप से खतरनाक हो सकता है। इस लोडर का उपयोग केवल विश्वसनीय PE फ़ाइलों और नियंत्रित वातावरण में करें। लेखक इस सॉफ़्टवेयर के किसी भी दुरुपयोग या क्षति के लिए जिम्मेदार नहीं हैं।
zig-pe में योगदान का स्वागत है! कृपया पुल अनुरोध प्रस्तुत करने, मुद्दे बनाने या जानकारी फैलाने में संकोच न करें।
git checkout -b feature/अद्भुतसुविधा)git commit -m 'कुछ अद्भुतसुविधा जोड़ें')git push origin feature/अद्भुतसुविधा)यह परियोजना MIT लाइसेंस के तहत लाइसेंस प्राप्त है - विवरण के लिए LICENSE फ़ाइल देखें।
यह परियोजना केवल शैक्षिक उद्देश्यों के लिए है। किसी भी PE फ़ाइल को लोड और निष्पादित करने से पहले सुनिश्चित करें कि आपके पास आवश्यक अधिकार और अनुमतियाँ हैं।
| आर्किटेक्चर | मशीन कोड | बिटनेस |
|---|
| i386 | 0x014c | 32-बिट |
| AMD64 | 0x8664 | 64-बिट |
| IA64 | 0x0200 | 64-बिट |
| ARM (ARMNT) | 0x01C4 | 32-बिट |
| ARM64 | 0xAA64 | 64-बिट |