2010-02-10 12 views
13

में GOT प्रविष्टि पढ़ें मैं थोड़ा फ़ंक्शन का ट्रैसर लिखना चाहता हूं। मैं ptrace का उपयोग करें। मैं उबंटू x86_64 पर हूं। मैं साझा लाइब्रेरी फ़ंक्शन का पता ढूंढना चाहता हूं (जैसे printf)।एल्फ बाइनरी

लेकिन मुझे कुछ समस्या है और ग्लोबल ऑफ़सेट टेबल के बारे में कुछ सवाल है।

size_t baseAddress = this->getBaseAddress(); 
Elf_Ehdr const * headerElf = static_cast<Elf_Ehdr const *> (this->_manager.readMemory((void*) baseAddress, sizeof (Elf_Ehdr))); 
Elf_Phdr const * headerProgram = static_cast<Elf_Phdr const *> (this->_manager.readMemory((void*) (baseAddress + headerElf->e_phoff), headerElf->e_phentsize * headerElf->e_phnum)); 
unsigned int i = 0; 
while (headerProgram[i].p_type != PT_DYNAMIC) 
{ 
    ++i; 
} 
size_t addrToRead = headerProgram[i].p_vaddr; 
Elf_Dyn const * dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, sizeof (Elf_Dyn))); 
while (dynSection->d_tag != DT_PLTGOT) 
{ 
    addrToRead += sizeof (Elf_Dyn); 
    dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, sizeof (Elf_Dyn))); 
} 

size_t addrGot = dynSection->d_un.d_ptr/* + (4 * sizeof (Elf64_Word))*/; 
std::cout << "addr got = " << std::hex << "0x" << dynSection->d_un.d_ptr << " 0x" << addrGot << std::endl; 

Elf64_Word const * temp = (Elf64_Word const *) this->_manager.readMemory((void*) addrGot, sizeof (Elf64_Word)); 
struct link_map * linkList = (struct link_map *) this->_manager.readMemory((void*) *temp, sizeof (struct link_map)); 

समारोह readMemory पता लगाया प्रक्रिया की स्मृति पर पढ़ें: मैं निम्नलिखित कोड है।

जब मैं linkList->l_ld पढ़ने की कोशिश करता हूं, तो यह गतिशील खंड पर इंगित नहीं होता है।

मुझे यकीन नहीं है कि मेरा कोड सही है। जब मैं readelf का उपयोग करता हूं, तो GOT अनुभाग का पता मेरे प्रोग्राम से मिलता है।

मुझे केवल जीओटी अनुभाग या अधिक के पहले ऑफसेट को पढ़ना होगा? GOT प्रविष्टि बिंदु में केवल पूर्ण पता है जो struct link_map पर इंगित करता है?

धन्यवाद।

+0

मैं सी का एक सा पता है, लेकिन पता सी ++ नहीं है। लेकिन वैसे भी, मैं इस प्रश्न को समझने में सक्षम नहीं हूं। इसे सी ++ के रूप में रीटैग किया जाना चाहिए ??? – Alphaneo

+0

चूंकि प्रदान किया गया स्रोत सी ++ है, इसलिए मैंने प्रश्न को दोबारा बदल दिया है। – jschmier

उत्तर

0

आपको शायद _DYNAMIC एल्फ प्रतीक में देखना चाहिए, जहां मैं हूं।

2

वहां पहले से ही इस उद्देश्य को
http://binary.nahi.to/hogetrace/

पूछताछ की बात BFD पुस्तकालय का उपयोग किया जाता के लिए एक कार्यान्वयन है।

अन्य ट्रेसिंग कार्यक्रमों के रूप में प्रसिद्ध नहीं है, लेकिन यह सबसे अच्छा मुझे पता है।

... इस बिंदु को छोड़कर सभी ब्रेकपॉइंट इंजेक्शन के लिए काफी महत्वपूर्ण ओवरहेड है।

और बिंदु मुझे खेद है कि यह PTRACE_SINGLESTEP कार्यक्षमता है, जो हमेशा इस तरह के MIPS के रूप में हर CPU वास्तुकला के लिए उपलब्ध नहीं है जरूरत है ...