歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核中符號地址的獲取

有些內核函數或者內核變量是不導出的,但是確實需要用,那該怎麼辦?因此尋找內核符號地址就有必要進行一下總結,更有甚,如果想找一條特定的指令,比如movl的指令地址,那更需要投入一些精力!總的來說,我總結了下面五種方式:

1.通過procfs中的kallsym文件或者System.map文件直接查找

這種方式借助於文件,依賴於文件的存在,不需要什麼編程能力,只要會在文件中查找信息即可

2.google一下

這種方式借助於互聯網,依賴你對信息的篩選能力。最有代表性的,尋找system_call和sys_call_table的地址,網上會說先找到0x80個中斷描述符,然後在尋找機器碼特征。這種方式實際上廣泛用於替換系統調用這種小伎倆。

3.使用dump_stack

這種方式需要在你想得到的地址調用鏈條的下游調用dump_stack,然後通過dmesg信息得到相應的地址信息。同理等價的方式就是故意制造錯誤,迫使內核打印地址。

4.利用棧結構和棧原理尋找

記住棧中會有什麼信息,一般會有參數地址信息,會有一個個的棧幀信息,每當調用call指令的時候,還會將下一條指令的地址壓入棧中。通過這些信息我們可以得到大量的地址信息。

5.從/dev/mem中搜索

這個方式最有技術含量,也最困難,然而什麼外界工具都不需要,甚至都不需要你懂編程語言。然而需要你對機器碼指令十分精通,對內存布局十分精通,它實際上是一種機器語言的編碼方式

從上述方法可以看出,從1到5,對外部工具的依賴越來越少,然而對自身的知識儲備要求越來越高,因此完成一件事的成本貌似是守恆的。如果一個人的知識儲備非常豐富,本身有十分聰明,他會使用哪種方式呢?會使用第五種方式嗎?我想絕對不!他肯定嘗試使用第一種方式,然後第二種...他很有可能永遠不會使用第五種方式,雖然他有能力完成!這就是說,在解決問題的時候,我們不會在乎難度和能力,我們只在乎成本,因此我們總是喜歡從阻力最小的方向上切入,有簡單的方式就不使用更復雜的方式,這也印證了簡單就是美的普世原則。在力求簡單的過程中,我們不得不積累更多的知識,進行更多的嘗試...

想起一句廣告詞,加速,是為了放慢腳步!

Copyright © Linux教程網 All Rights Reserved