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