内核调试和系统调用劫持
如何在不重新編譯內核,不rmmod內核模塊的情況下修改系統(tǒng)調用
為了解決這個問題,最終實現(xiàn)了兩種解決方式:
1.Linux系統(tǒng)調用劫持
2.Kprobes內核調試技術(并非真正的修改)
?
下面分別說下:
?
Linux系統(tǒng)調用劫持:
其實就是修改內核符號表,來達到一個劫持的作用。因為系統(tǒng)調用實際上是觸發(fā)了一個0x80的軟中斷,然后轉到了系統(tǒng)調用處理程序的入口system_call()。system_call()會檢查系統(tǒng)調用號來得出到底是調用哪種服務,然后會根據(jù)內核符號表跳轉到所需要調用的內核函數(shù)的入口地址,所以,如果我們這個時候修改了內核符號表,使其跳轉到我們自己的函數(shù)上,就可以完成劫持。
不過2.6之后,內核符號表便不再導出了,所以需要我們在內存中找到它的位置。具體查找的方式為:查找到中斷向量表中的0x80中斷服務函數(shù)的位置,然后在這個中斷服務函數(shù)代碼中查找根據(jù)內核符號表跳轉的指令,從指令中可以分析出內核符號表的位置。
下面的是一個簡單的劫持mkdir系統(tǒng)調用的測試,通過加載hook.ko內核模塊,劫持mkdir系統(tǒng)調用,然后使用mkdir命令創(chuàng)建一個目錄,來測試是否截齒成功。如果成功的話會輸出“PID?xxx?called?sys?mkdir?!?By?qiankun”。結果測試成功。下面是經(jīng)過。
?
?
?
kprobes內核調試技術
?????首先聲明兩點:
?1.這種方式其實并非修改,而是只是在運行的內核中動態(tài)的插入探測點,當內核運行到該探測點后可以執(zhí)行用戶預定義的回調函數(shù)。執(zhí)行完畢后返回正常的執(zhí)行流程。所以說他其實并非真正的修改了原有的系統(tǒng)調用。但是可以達到一定類似于修改了的效果,暫且算作一種“偽修改”吧。
2.我在測試的時候使用的是kprobes中的jprobe探測方式,其實其他的內核調試技術比如systemtap等應該能夠實現(xiàn)這種功能,但是我就不一一實現(xiàn)了。
??
Kprobes是一個輕量級的內核調試工具,利用kprobes技術可以再運行的內核中動態(tài)的插入探測點,在探測點進行用戶預定義的操作。
?
Kprobes使用主要可以分為三部分:
1.注冊探測點部分。
2.調試處理部分。
3.注銷探測點部分。
?
下面是使用kprobes中jprobe探測方式,對sys_open和sys_write進行添加探測點。這樣可以一定程度上影響sys_open和sys_write的最后結果,達到類似修改的目的。下面是測試過程,可以看到,每當內核調用sys_write和sys_open的時候,都會先調用我們的探測函數(shù)。
?
?
?
?
? ? ?代碼如下:
附件列表
?
轉載于:https://www.cnblogs.com/dchipnau/p/5043575.html
總結
以上是生活随笔為你收集整理的内核调试和系统调用劫持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xcode7在运行包含HTTP协议的程序
- 下一篇: break 与continue 语句