- 寻找内核内存中系统调用表的内存地址sys_call_table ,调换该内存中某个函数地址
- 通过部分系统文件 :more /boot/System.map-4.15.0-66-generic (4.15.0-66-generic是内核版本,可以通过uname -r查看)
asmlinkage long (*real_mkdir)(const char __user *pathname,umode_t mode);
asmlinkage long myself_mkdir(const char __user *pathname, umode_t mode)
{
....
}
write_cr0(read_cr0() & (~0x10000)); //关闭内存保护
real_mkdir = (void *)sys_call_table[__NR_mkdir]; //real_mkdir 原mkdir调用的系统调用函数,提前保存原函数。
sys_call_table[__NR_mkdir] = myself_mkdir; //将自定义的mkdir函数进行赋值给sys_call_table[__NR_mkdir] 。
write_cr0(read_cr0() | 0x10000); //开启内存保护