2011-11-02 15 views
8

में क्रम कोड बदलने के लिए को संबोधित मैं वर्तमान में कुछ कोड का उपयोग कर रहा 32 बिट जहां कोड है जो किसी अन्य स्थिति तक ले जाया जाता है, चर और एक वर्ग के सूचक पढ़ता में योजना बदल दें। चूंकि x86_64 को संबोधित पूर्ण समर्थन नहीं करता मैं मुसीबत कोड की नई स्थिति में चर के लिए सही पतों हो रही है। विस्तार से समस्या यह है कि निर्देश संकेतक को संबोधित करने वाले रिप रिश्तेदार के कारण संकलन समय से अलग है।निरपेक्ष x86_64

तो वहाँ x86_64 या किसी अन्य रास्ते से चर नहीं अनुदेश सूचक रिश्तेदार के पते प्राप्त करने के लिए को संबोधित पूर्ण उपयोग करने के लिए एक तरीका है?

कुछ की तरह: leaq variable(%%rax), %%rbx भी मदद मिलेगी। मैं केवल निर्देश सूचक पर निर्भरता नहीं चाहता हूं।

उत्तर

6

x86_64 के लिए बड़े कोड मॉडल का उपयोग कर प्रयास करें। जीसीसी में इस -mcmodel = बड़े साथ चुना जा सकता है। कंपाइलर कोड और डेटा दोनों के लिए 64 बिट पूर्ण पते का उपयोग करेगा।

आप स्वतंत्र कोड की पीढ़ी को अस्वीकार करने के लिए -fno-pic भी जोड़ सकते हैं।

संपादित करें: मैं -mcmodel = बड़े साथ एक छोटे से परीक्षण ऐप्लिकेशन का निर्माण और जिसके परिणामस्वरूप बाइनरी तरह

400b81:  48 b9 f0 30 60 00 00 movabs $0x6030f0,%rcx 
400b88:  00 00 00 
400b8b:  49 b9 d0 09 40 00 00 movabs $0x4009d0,%r9 
400b92:  00 00 00 
400b95:  48 8b 39    mov (%rcx),%rdi 
400b98:  41 ff d1    callq *%r9 

दृश्यों जो एक पूर्ण 64 बिट तत्काल का भार है (इस मामले में एक भाषण में) शामिल हैं अप्रत्यक्ष कॉल या अप्रत्यक्ष लोड के बाद। अनुदेश अनुक्रम

moveabs variable, %rbx 
addq %rax, %rbx 

एक के बराबर "leaq offset64bit (% Rax),% Rbx" झंडा जैसे कुछ साइड इफेक्ट आदि उत्तर के लिए बदल रहा है

+0

-mcmodel = बड़ा समाधान होना चाहिए। मुझे जांच करनी है कि जीसीसी ओएसएक्स कंपाइलर इसका समर्थन क्यों नहीं करता – nux

+0

शायद यह पुराना हो। छोटे (मानक) और मध्यम कोड मॉडल को जल्दी जोड़ा गया था, बड़े मॉडल बाद में आए थे। – hirschhornsalz

+0

मैं आपको बहुत धन्यवाद देता हूं यह बहुत अच्छा दिखता है और निश्चित रूप से पूर्ण पते की समस्या हल करता है – nux

2

आप के बारे में क्या कह रहे हैं साध्य नहीं, बल्कि बहुत आसान है।

एक तरह से यह करने के लिए उसके निर्देशों में कोड चाल के लिए क्षतिपूर्ति है। आप सभी निर्देशों का है कि आरआईपी-रिश्तेदार को संबोधित कर रहे हैं (वे 05H, 0Dh, 15 एच, 1DH, 25H, 2dh, 35h के ModRM बाइट है या 3dh) और चाल की राशि से उनके disp32 क्षेत्र समायोजित (चाल का उपयोग खोजने की जरूरत है इसलिए वर्चुअल ऐड्रेस स्पेस है, जो इसकी गारंटी नहीं दी जा सकती है 64-बिट पता स्थान 4GB से बड़ा है) में 2GB +/- तक सीमित है।

तुम भी, उनके समकक्ष के साथ उन निर्देशों को बदलने की संभावना सबसे अधिक उदाहरण के लिए, एक से अधिक के साथ हर मूल शिक्षा की जगह कर सकते हैं:

; These replace the original instruction and occupy exactly as many bytes as the original instruction: 
    JMP Equivalent1 
    NOP 
    NOP 
Equivalent1End: 

; This is the code equivalent to the original instruction: 
Equivalent1: 
    Equivalent subinstruction 1 
    Equivalent subinstruction 2 
    ... 
    JMP Equivalent1End 

दोनों ही तरीकों से कम से कम कुछ मौलिक 86 disassembly दिनचर्या की आवश्यकता होगी।

पूर्व को मूल कोड की पैच की गई प्रतिलिपि वाली स्मृति को सुनिश्चित करने के लिए Windows (या लिनक्स पर कुछ समकक्ष) पर VirtualAlloc() के उपयोग की आवश्यकता हो सकती है, उस मूल कोड के +/- 2GB के भीतर है। और विशिष्ट पते पर आवंटन अभी भी असफल हो सकता है।

बाद सिर्फ आदिम disassemblying से अधिक की आवश्यकता होगी, लेकिन यह भी पूर्ण अनुदेश डिकोडिंग और पीढ़ी।

अन्य quirks के आसपास काम करने के लिए हो सकता है।

निर्देश सीमाओं भी RFLAGS रजिस्टर में TF ध्वज की स्थापना सीपीयू हर अनुदेश के निष्पादन के अंत में single-step डिबग बाधा उत्पन्न करने के लिए के द्वारा पाया जा सकता है। एक डीबग अपवाद हैंडलर को उनको पकड़ने और अगले निर्देश के आरआईपी के मूल्य को रिकॉर्ड करने की आवश्यकता होगी। मेरा मानना ​​है कि यह Windows में Structured Exception Handling (SEH) (डिबग बीच में आता है के साथ की कोशिश कभी नहीं), लिनक्स बारे में निश्चित नहीं का उपयोग किया जा सकता है। इसके लिए काम करने के लिए आपको सभी निर्देश निष्पादित करना होगा, हर निर्देश।

बीटीडब्ल्यू, 64-बिट मोड में पूर्ण पते है, उदाहरण के लिए, एमओवी 0A0h से 0A3h से ऑपकोड के साथ संचयक निर्देशों से/से।

+0

धन्यवाद के साथ (जो मौजूद नहीं है), है । जहां तक ​​मैं आपको समझता हूं, दृष्टिकोण रनटाइम पर movs के लिए पता मान को फिर से समझना है। यह योजना के लिए भारी दिखता है, इसलिए यदि यह एकमात्र तरीका है, तो मैं एक अलग कार्यान्वयन के बारे में सोचूंगा – nux

संबंधित मुद्दे