2017-07-25 33 views
0

我已经改变了一个ELF二进制文件,现在我正在试图找出我搞错了什么。 我在下面粘贴的文本中将我的插装二进制文件称为mutatee_out。 它所说的未定义的符号确实在动态表中,我已经检查过。并且在.text部分也有正确的地址。为什么一个符号不能在二进制文件上搜索?

所以我的问题是:什么是未定义符号的原因? (所以我可以检查可能发生了什么问题)。

当我用LD_DEBUG=symbols运行时,我注意到它没有在文件本身中查找这个符号,因此是未定义的符号。您也可以在下面看到其他符号在文件中查找。

任何想法?为什么这个符号不能在二进制文件上搜索?

17405:  symbol=_ZTVSt11regex_error; lookup in file=mutatee_out [0] 
17405:  symbol=_ZTVSt11regex_error; lookup in file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 [0] 
17405:  symbol=__gxx_personality_v0; lookup in file=mutatee_out [0] 
17405:  symbol=_ZN9__gnu_cxx27__verbose_terminate_handlerEv; lookup in file=mutatee_out [0] 
17405:  symbol=_ZN9__gnu_cxx27__verbose_terminate_handlerEv; lookup in file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 [0] 
17405:  symbol=_ZSt9terminatev; lookup in file=mutatee_out [0] 
17405:  symbol=_ZSt9terminatev; lookup in file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 [0] 
17405:  symbol=__gmon_start__; lookup in file=mutatee_out [0] 
17405:  symbol=__gmon_start__; lookup in file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 [0] 
17405:  symbol=__gmon_start__; lookup in file=/lib/x86_64-linux-gnu/libgcc_s.so.1 [0] 
17405:  symbol=__gmon_start__; lookup in file=/lib/x86_64-linux-gnu/libc.so.6 [0] 
17405:  symbol=__gmon_start__; lookup in file=/lib/x86_64-linux-gnu/libm.so.6 [0] 
17405:  symbol=__gmon_start__; lookup in file=/lib64/ld-linux-x86-64.so.2 [0] 
17405:  symbol=__gmon_start__; lookup in file=/lib/x86_64-linux-gnu/libdl.so.2 [0] 
17405:  symbol=_ZN9decl_test8call_cppEi; lookup in file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 [0] 
17405:  symbol=_ZN9decl_test8call_cppEi; lookup in file=/lib/x86_64-linux-gnu/libgcc_s.so.1 [0] 
17405:  symbol=_ZN9decl_test8call_cppEi; lookup in file=/lib/x86_64-linux-gnu/libc.so.6 [0] 
17405:  symbol=_ZN9decl_test8call_cppEi; lookup in file=/lib/x86_64-linux-gnu/libm.so.6 [0] 
17405:  symbol=_ZN9decl_test8call_cppEi; lookup in file=/lib64/ld-linux-x86-64.so.2 [0] 
17405:  symbol=_ZN9decl_test8call_cppEi; lookup in file=/lib/x86_64-linux-gnu/libdl.so.2 [0] 
17405:  mutatee_out: error: symbol lookup error: undefined symbol: _ZN9decl_test8call_cppEi (fatal) 
+0

可执行文件是否工作_before_您添加了病毒代码?...我的意思是在编辑二进制可执行文件之前? –

+0

这不是病毒代码。这是一个严肃的项目,你可以在GitHub.com/dyninst查看。是的,它的工作原理是,而且目标是在以后也能使用它。 –

回答

2

您更改了二进制文件的哪些部分?只需.dynsym?或者.gnu.hash?如果散列表不同步,ld.so将找不到某些符号。

+0

我解析整个二进制文件并重新写入。但我相信一些矮人解析可能是错误的,或者.eh_frame部分的写作可能是错误的。我会检查gnu哈希。 –

1

为什么这个符号不能在二进制文件上搜索?

或许二进制ld.so不要在二进制本身进行搜索?

它可以做到这一点与:

void *sym = dlsym(RTLD_NEXT, "_ZN9decl_test8call_cppEi"); 

我分析整个二进制,并再次改写。

在已经链接的二进制文件上正确执行这种转换是非常困难的。

但我相信一些矮人解析可能是错误的或者.eh_frame部分的写入可能是错误的。

以上都不是与符号解析有关。

虽然我会检查gnu散列。

未能建立哈希表将导致查找失败,但在你的情况ld.so甚至没有搜索,所以原因必须是别的东西。

+0

它不应该要求不被搜索。我们有一个二进制仪器库,所以这并不困难,它被称为dyninst。问题是我现在只更改矮人相关代码,现在试图弄清楚整个过程中发生了什么。符号被找到并正在被搜索,但中间的东西被做错了。 –

+0

如果仅更改DWARF,则完全不会影响ld.so符号查找。 –

+0

我更改了解析矮小部分和eh_frame部分的代码。 –

相关问题