2017-07-25 60 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部分的代碼。 –

相關問題