2012-03-22 11 views
5

मैं किसी ऑब्जेक्ट फ़ाइल को मौजूदा बाइनरी में इंजेक्ट करना चाहता हूं। जिस विधि का मैं प्रयास कर रहा हूं वह है:बाइनरी से स्थानांतरित करने योग्य ऑब्जेक्ट फ़ाइल और पीछे से कैसे परिवर्तित करें?

  • एक संकलित बाइनरी को एक स्थानापन्न ऑब्जेक्ट फ़ाइल में कनवर्ट करें।
  • ऑब्जेक्ट फ़ाइल को एम्बेडेड करने के साथ स्थानांतरित करने योग्य ऑब्जेक्ट फ़ाइल को जोड़ने के लिए gcc/ld का उपयोग करें।

स्रोत को देखते हुए:

#include <stdlib.h> 
#include <stdio.h> 

int main(void) 
{ 
    puts("main"); 
    return EXIT_SUCCESS; 
} 

मैं साथ host को यह संकलन निम्नलिखित:

gcc -Wall host.c -o host 

मैं साथ पुनर्निधारणीय वस्तु फाइल करने के लिए रूपांतरण:

objcopy -B i386 -I binary -O elf64-x86-64 host host.o 

इसके बाद मैं एक लिंक का प्रयास करता हूं:

gcc host.o -o host 

आदर्श रूप से, यह स्थानांतरित करने योग्य ऑब्जेक्ट फ़ाइल को बाइनरी में वापस ले जाएगा। यह किसी भी अतिरिक्त ऑब्जेक्ट फ़ाइलों में लिंक करने का मौका भी देगा। दुर्भाग्य से आदेश निम्न त्रुटि देता है:

/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: ld returned 1 exit status 

मेरा प्रश्न क्यों इस त्रुटि दिखाई दे रहा है जाता है और कैसे मैं के बारे में ठीक से relinking जाना चाहते हैं?

मैंने जिस चीज की कोशिश की थी, उस बिंदु पर किसी अन्य ऑब्जेक्ट फ़ाइल में लिंक करना था जिसमें एक डमी मुख्य था (क्योंकि मुझे लगा कि मैं बाद में प्रवेश बिंदु को मैन्युअल रूप से पैच कर सकता हूं), लेकिन क्या हुआ यह था कि नई बाइनरी स्थानांतरित हो रही थी प्रतीक तालिका के साथ एक अजीब तरीके से पुराना कोड पूरी तरह से गड़बड़ हो गया।

[email protected]:~/Desktop/inject-obj$ readelf -h host 
ELF Header: 
    Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF64 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        EXEC (Executable file) 
    Machine:       Advanced Micro Devices X86-64 
    Version:       0x1 
    Entry point address:    0x400410 
    Start of program headers:   64 (bytes into file) 
    Start of section headers:   4424 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   56 (bytes) 
    Number of program headers:   9 
    Size of section headers:   64 (bytes) 
    Number of section headers:   30 
    Section header string table index: 27 

और पुनर्निधारणीय वस्तु फ़ाइल पर:

[email protected]:~/Desktop/inject-obj$ readelf -h host.o 
ELF Header: 
    Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF64 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        REL (Relocatable file) 
    Machine:       Advanced Micro Devices X86-64 
    Version:       0x1 
    Entry point address:    0x0 
    Start of program headers:   0 (bytes into file) 
    Start of section headers:   8480 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   0 (bytes) 
    Number of program headers:   0 
    Size of section headers:   64 (bytes) 
    Number of section headers:   5 
    Section header string table index: 2 

दलील

उन दिलचस्पी के लिए, औचित्य

अतिरिक्त सूचना

readelf द्विआधारी पर निम्नलिखित पैदावार here पाया जा सकता है।

उत्तर

3

एक निष्पादन योग्य फ़ाइल जो पीआईई नहीं है, को स्थानांतरित करना असंभव है। स्थानान्तरण पहले से ही किया जा चुका है और उन स्थानापन्नों का रिकॉर्ड फेंक दिया गया था। यही है, इसे स्थानांतरित करने के लिए कोड और बाइनरी के डेटा के अंदर वस्तुओं या कार्यों के सभी पते खोजने की आवश्यकता होगी, लेकिन यह निर्धारित करना असंभव है कि बाइट्स का अनुक्रम एक पता या किसी अन्य प्रकार का डेटा या कोड है या नहीं।

ऐसा करने का एक तरीका होना चाहिए जो आप मूल रूप से करना चाहते थे (नए कोड में जोड़ना), लेकिन जो दृष्टिकोण आप ले रहे हैं वह विफलता के लिए बर्बाद हो गया है।

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