linux读取内存文件,linux – 使用模块读取内核内存
首先讓我先說讀任意內核內存是一件棘手的事!并且有很多方法可以做到這一點,它們的復雜程度和靈活性各不相同.
1)硬編碼地址.
在內核版本的System.map文件中搜索它:
# grep sys_call_table /boot/System.map-2.6.18-238.12.1.el5
c06254e0 R sys_call_table
有了這個,硬編碼地址:
unsigned long *syscall_table = (unsigned long *)0xc06254e0;
然后,假設您#include< linux / syscalls.h>,您可以使用__NR_syscall定義來獲取代碼中這些系統調用的地址:
syscall_table[__NR_close]
這是最簡單的方法,但到目前為止靈活性最低.該模塊僅適用于該確切的內核.如果你將它發送到另一個內核,你就有可能得到一個內核OOP.
2)對表格進行強力掃描
看看這個:
他使用一種方法來強制內核內存地址范圍來查找sys_call_stable.原樣,它只適用于32位(64位具有不同的內核內存地址范圍).
這種方法有點靈活,但隨著內核語義的改變可能會破壞道路.
3)動態搜索System.map加載時間
加載模塊時,可以讀取內核的System.map文件.我在我寫的tpe-lkm模塊中演示了這一點.該項目托管在github上.
看看這個文件中的find_symbol_address_from_file():
非常靈活,因為你可以找到你想要的任何符號,但是從內核空間讀取文件是一個很大的“不可以”.不要問我為什么,但人們總是告訴我.您還冒著它看到的System.map無效的風險,并可能導致內核OOP.此外,代碼是……凌亂.
4)使用kallsyms_on_each_symbol()
從內核版本2.6.30開始,內核導出kallsyms_on_each_symbol().我們可以感謝ksplice人員.有了這個,你找不到sys_call_table(由于某些原因它不在那里),但你可以找到大多數其他符號.
非常靈活,非常穩定的查找符號地址的方法,但理解起來有些復雜;)
我在tpe-lkm項目中證明了這一點.看看這個文件中的find_symbol_callback()和find_symbol_address()函數:
總結
以上是生活随笔為你收集整理的linux读取内存文件,linux – 使用模块读取内核内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯邮件服务器发送慢,通过腾讯邮件服务器
- 下一篇: java 工厂模式的写法_java工厂模