实验平台i386,linux kernel版本:2..6.22(之后版本原理都是一样)
首先上一副图:
首先知道cpu看到的都是虚拟地址,CR3寄存器,页表中都是存的物理地址,通过MMU把虚拟地址映射到页表中的物理地址,这幅图说的很清楚了,接下来要获取到sys_call_table在内核中的内存地址
export version=$(uname -r)
由于sys_call_table地址对应的物理地址在内核中是只读的,所以主旨就是在页表把它的权限改成可写的w
首先写个小模块,导出内核中sys_call_tabel符号的地址(虚拟地址)
把本模块insmod进内核
sudo insmod myexport.ko svctable=C02FC540
接下来增加(也算是修改)系统调用
sudo insmod mycall.ko
最后写应用程序验证结果
运行此程序,发现最后number=16,验证成功