RawrXD PE Writer - पूर्ण कार्यान्वयन
अवलोकन
यह एक पूर्ण PE32+ लेखक और मशीन कोड उत्सर्जक है जो शुद्ध x64 MASM असेंबली में कार्यान्वित है, जिसमें कोई निर्भरता नहीं है और CRT का उपयोग नहीं किया गया है। यह शुरू से चलने योग्य Windows निष्पादन योग्य फ़ाइलें उत्पन्न करता है।
वास्तुकला
PE लेखक एक बैकएंड डिज़ाइनर दृष्टिकोण का पालन करता है, जो इसके लिए एक स्वच्छ API प्रदान करता है:
- PE निष्पादन योग्य संदर्भ बनाना
- उचित IAT/INT संरचनाओं के साथ आयात जोड़ना
- अनुभाग प्रबंधन के साथ मशीन कोड उत्सर्जन
- सभी आवश्यक हेडर के साथ पूर्ण PE फ़ाइलें लिखना
मुख्य घटक
1. परिभाषित संरचनाएँ
- IMAGE_DOS_HEADER: e_lfanew पॉइंटर के साथ मानक DOS हेडर
- IMAGE_NT_HEADERS64: फ़ाइल हेडर और वैकल्पिक हेडर के साथ NT हेडर
- IMAGE_SECTION_HEADER: .text, .rdata, .idata के लिए अनुभाग हेडर
- IMAGE_IMPORT_DESCRIPTOR: आयात तालिका विवरणक
- PE_CONTEXT: PE फ़ाइलें बनाने के लिए आंतरिक संदर्भ संरचना
2. मुख्य फ़ंक्शन
PEWriter_CreateExecutable
- इनपुट: RCX = छवि आधार (0 = डिफ़ॉल्ट), RDX = प्रवेश बिंदु RVA
- आउटपुट: RAX = PE संदर्भ हैंडल (0 = विफलता)
- उद्देश्य: पूर्ण PE संदर्भ संरचना आवंटित और प्रारंभ करता है
कार्यान्वयन विवरण:
- DOS हेडर, NT हेडर, अनुभाग हेडर के लिए मेमोरी आवंटित करता है
- उचित हस्ताक्षर और e_lfanew के साथ DOS हेडर प्रारंभ करता है
- AMD64 मशीन प्रकार और PE32+ मैजिक के साथ NT हेडर सेट करता है
- छवि आधार, अनुभाग/फ़ाइल संरेखण के साथ वैकल्पिक हेडर कॉन्फ़िगर करता है
- कोड बफ़र और आयात तालिकाएँ आवंटित करता है
- डिफ़ॉल्ट वर्चुअल पते और फ़ाइल ऑफ़सेट सेट करता है
PEWriter_AddImport
- इनपुट: RCX = PE संदर्भ, RDX = DLL नाम, R8 = फ़ंक्शन नाम
- आउटपुट: RAX = 1 सफलता, 0 विफलता
- उद्देश्य: उचित IAT/INT संरचनाओं के साथ आयात तालिका बनाता है
कार्यान्वयन विवरण:
- कई DLL के लिए आयात विवरणकों का प्रबंधन करता है
- आयात लुकअप तालिका (INT) प्रविष्टियाँ बनाता है
- आयात पता तालिका (IAT) प्रविष्टियाँ सेट करता है
- नाम से आयात संरचनाओं को संभालता है
- आयात गणना को ट्रैक करता है और सीमाओं को मान्य करता है
PEWriter_AddCode
- इनपुट: RCX = PE संदर्भ, RDX = कोड बफ़र, R8 = कोड आकार
- आउटपुट: RAX = कोड का RVA (0 = विफलता)
- उद्देश्य: उचित अनुभाग प्रबंधन के साथ मशीन कोड उत्सर्जन को संभालता है
कार्यान्वयन विवरण:
- मशीन कोड को आंतरिक बफ़र में कॉपी करता है
- कोड आकार को अधिकतम सीमा के विरुद्ध मान्य करता है
- कोड के लिए RVA की गणना और वापसी करता है
- आंतरिक कोड आकार ट्रैकिंग को अपडेट करता है
- .text अनुभाग सामग्री का प्रबंधन करता है
PEWriter_WriteFile
- इनपुट: RCX = PE संदर्भ, RDX = फ़ाइल नाम
- आउटपुट: RAX = 1 सफलता, 0 विफलता
- उद्देश्य: सभी हेडर, अनुभागों और आयात तालिका के साथ पूर्ण फ़ाइल लेखन
कार्यान्वयन विवरण:
- उचित Win32 API कॉल के साथ आउटपुट फ़ाइल बनाता है
- DOS हेडर और DOS स्टब लिखता है
- अंतिम NT हेडर मानों की गणना और अद्यतन करता है
- .text, .rdata, .idata के लिए अनुभाग हेडर लिखता है
- उचित फ़ाइल पैडिंग और संरेखण लागू करता है
- आयात तालिका के साथ अनुभाग डेटा लिखता है
- सभी RVA गणनाओं और फ़ाइल ऑफ़सेट को संभालता है
मेमोरी प्रबंधन
कार्यान्वयन Windows हीप API का उपयोग करता है:
- GetProcessHeap(): वर्तमान प्रक्रिया हीप प्राप्त करता है
- HeapAlloc(): शून्य-प्रारंभित मेमोरी आवंटित करता है
- HeapFree(): सफाई पर आवंटित मेमोरी मुक्त करता है
सभी मेमोरी आवंटन में उचित त्रुटि हैंडलिंग और सफाई शामिल है।
फ़ाइल संरचना लेआउट
DOS हेडर (64 बाइट्स)
DOS स्टब (परिवर्तनीय आकार, 0x80 तक पैडेड)
NT हेडर (PE32+ के लिए 248 बाइट्स)
अनुभाग हेडर (40 बाइट्स × 3 अनुभाग)
फ़ाइल संरेखण (0x400) तक पैडिंग
.text अनुभाग (कोड)
- मशीन कोड
- फ़ाइल संरेखण तक पैडेड
.rdata अनुभाग (केवल-पढ़ने योग्य डेटा)
- स्ट्रिंग स्थिरांक, संसाधन
- फ़ाइल संरेखण तक पैडेड
.idata अनुभाग (आयात डेटा)
- आयात विवरणक
- आयात लुकअप तालिका
- आयात पता तालिका
- नाम से आयात संरचनाएँ
- फ़ाइल संरेखण तक पैडेड
वर्चुअल पता लेआउट
0x1000: .text अनुभाग (SECTION_ALIGNMENT)
0x2000: .rdata अनुभाग
0x3000: .idata अनुभाग
0x4000: अगला उपलब्ध वर्चुअल पता
स्थिरांक और डिफ़ॉल्ट
- छवि आधार: 0x140000000 (x64 के लिए डिफ़ॉल्ट)
- अनुभाग संरेखण: 0x1000 (4KB)
- फ़ाइल संरेखण: 0x200 (512 बाइट्स)
- प्रवेश बिंदु: कॉन्फ़िगरेबल RVA
- उपप्रणाली: कंसोल एप्लिकेशन (IMAGE_SUBSYSTEM_WINDOWS_CUI)
उपयोग उदाहरण
; PE संदर्भ बनाएँ
mov rcx, 0 ; डिफ़ॉल्ट छवि आधार
mov rdx, 1000h ; प्रवेश बिंदु RVA
call PEWriter_CreateExecutable
mov rbx, rax ; संदर्भ सहेजें
; kernel32.dll आयात जोड़ें
mov rcx, rbx
mov rdx, offset dll_kernel32
mov r8, offset func_GetStdHandle
call PEWriter_AddImport
; मशीन कोड जोड़ें
mov rcx, rbx
mov rdx, offset code_buffer
mov r8, code_size
call PEWriter_AddCode
; निष्पादन योग्य फ़ाइल लिखें
mov rcx, rbx
mov rdx, offset filename
call PEWriter_WriteFile
निर्माण निर्देश
- सुनिश्चित करें कि MASM64 और Windows SDK स्थापित हैं
- PE लेखक और उदाहरण संकलित करने के लिए
build.bat चलाएँ
hello.exe उत्पन्न करने के लिए PE_Writer_Example.exe निष्पादित करें
- उत्पन्न निष्पादन योग्य का परीक्षण करें
त्रुटि हैंडलिंग
सभी फ़ंक्शन विफलता पर 0 और सफलता पर गैर-शून्य लौटाते हैं। कार्यान्वयन में शामिल है:
- मेमोरी आवंटन विफलता जाँच
- फ़ाइल I/O त्रुटि हैंडलिंग
- इनपुट सत्यापन
- उचित संसाधन सफाई
- बफ़र्स के लिए सीमा जाँच
सीमाएँ
- अधिकतम 99 आयात (MAX_IMPORTS - 1)
- अधिकतम 64KB कोड आकार (MAX_CODE_SIZE)
- तीन निश्चित अनुभाग (.text, .rdata, .idata)
- केवल कंसोल उपप्रणाली
- कोई रिलोकेशन समर्थन नहीं
- कोई डिजिटल हस्ताक्षर नहीं
उन्नत सुविधाएँ
कार्यान्वयन इसके लिए एक ठोस आधार प्रदान करता है:
- कस्टम अनुभाग निर्माण
- जटिल आयात बंधन
- संसाधन एम्बेडिंग
- डिजिटल हस्ताक्षर
- रिलोकेशन समर्थन
- अपवाद हैंडलिंग तालिकाएँ
तकनीकी नोट्स
- शुद्ध x64 MASM असेंबली - कोई CRT निर्भरता नहीं
- मेमोरी प्रबंधन के लिए Windows हीप का उपयोग करता है
- x64 के लिए PE32+ प्रारूप उत्पन्न करता है
- Windows Vista और बाद के संस्करणों के साथ संगत
- Microsoft PE विनिर्देश का पालन करता है
- kernel32.dll को छोड़कर कोई बाहरी लाइब्रेरी निर्भरता नहीं
यह कार्यान्वयन कोड जनरेशन बैकएंड, कस्टम कंपाइलर और निष्पादन योग्य पैकर्स के लिए उपयुक्त एक पूर्ण, उत्पादन-तैयार PE32+ लेखक प्रदान करता है।