主要参考:https://blog.youkuaiyun.com/ThugKd/article/details/71001853
课设是通过编译内核的办法添加系统调用,缺点很明显,编译时间很长,大概1,2小时。我试了下直接把我虚拟机搞炸了。所以就试了另一种办法,通过编译内核模块添加系统调用
。当然前提是你的系统留出空闲系统调用号,因为这个调用号是写到内存的,你不重新编译是无法改的。
系统环境:
虚拟机 12 pro
系统
有几点不同:
1 我查看虚地址,c中虚地址前要加0x
查看虚地址要在root或者sudo,不然他会给你一个全0的地址,加了sudo就好了
2 没有看到预留的系统调用号
在/usr/src/linux-headers-4.15.0-29/ 通过搜索找到 unistd_64.h
命令:find /usr/src/linux-headers-4.18.0-21/ -name unistd_64.h
注意:这里的4.18.0-21可能会有差别
3 unsupported instruction `mov'
c文件修改 把movl修改movq,还有eax改为rax
因为作者是32环境,我的是64位环境 asm默认32位
至于网上说的什么-m32那就别试了
4 最后一步dmesg会输出很多,所以加-个过滤
Dmesg | grep “hello”
下面的错误可能会出现,我第一次编译时出现,后来居然没了,重现也没成功
1 make时提示miss
复制时tab问题
我用的是kate编译器,修改如下
2 dereferencing pointer to incomplete type ‘struct task_struct’ current->thread.addr_limit = fs;
我用的kubuntu,make时出现
我们代码中用到current宏,虽然我们在文件中引入linux/sched.h但还是出错,我们根据错误定位到.h文件,在那里添加linux/sched.h就好了
这个错误让我以为找到bug了,激动了好一会儿,结果现在没错误了
3 insmod 加载模块后卸载不了
原因是你用了系统调用号,不是预留的那种。所以前一步查看系统预留号很重要
4 makefile注释是用#
效果截图: