13

関数のトレーサーを少し書きたいと思います。私はptraceを使っています。私はubuntu x86_64を使用しています。共有ライブラリ関数 ( など) のアドレスを見つけたいprintf

しかし、Global Offset Table についていくつか問題と質問があります。次のコードがあります。

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 セクションの最初のオフセットのみを読み取る必要がありますか? GOT エントリ ポイントには、struct link_map?を指す絶対アドレスのみが含まれます。

ありがとうございました。

4

2 に答える 2

2

この目的の実装は既にあります
http://binary.nahi.to/hogetrace/

問題点は bfd ライブラリを使用して行われます。

他のトレーシング プログラムほど有名ではありませんが、これは私が知っている最高のものです。

...ポイントを除いて、これにはすべてのブレークポイントを挿入するためのかなりのオーバーヘッドがあります。

そして、私が後悔している点は、MIPS などのすべての CPU アーキテクチャで常に利用できるとは限らない PTRACE_SINGLESTEP 機能が必要なことです...

于 2010-02-27T14:41:16.650 に答える
0

おそらく、私がいる場所である_DYNAMICElfシンボルを調べる必要があります。

于 2010-02-11T04:09:02.753 に答える