LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1217|回复: 14

[有问题] 劫获系统调用之后

[复制链接]
发表于 2006-1-2 15:06:02 | 显示全部楼层 |阅读模式
看了几篇劫获系统调用的文章,自己也照样写了个程序试验,MAKE通过但INSMOD时出错:unresolved symbol sys_call_table, GOOGLE得知2.4.18以后不再能直接得到sys_call_talbe的地址,需要加载模块由INT80取得sys_call_table的引用再算出系统调用open()的地址.
照做/出错/GOOGLE/修改.....最后总算截获open(), 现在想得知哪个进程/哪个用户调用了open(),( 也就是我的hack函数要做的功能), 该如何实现?请各位指教,谢谢!

直接在hacked_open()里调用getpid(),getuid()恐怕不行
发表于 2006-1-2 22:56:32 | 显示全部楼层
System.map
回复 支持 反对

使用道具 举报

发表于 2006-1-3 12:35:34 | 显示全部楼层
task_struct 结构里面有pid,uid信息,可通过current宏获取当前进程的task_struct结构指针
回复 支持 反对

使用道具 举报

发表于 2006-1-3 14:41:49 | 显示全部楼层
[php]

#ifndef __KERNEL__
#define __KERNEL__
#endif

#ifndef MODULE
#define MODULE
#endif

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/unistd.h>
#include <linux/linkage.h>
#include <linux/syscalls.h>
#include <asm/current.h>

//extern void* sys_call_table[];
/*
* After version 2.4.18, the symbol sys_call_table is not exported,
* but you can get the address from the file System.map, Just like
* this `grep sys_call_table /boot/System.map'.
*/
void** sys_call_table = (void **)0xc03835c0;
long (*orig_mkdir)(const char *path, int mode);

asmlinkage long hacked_mkdir(const char *path, int mode)
{
        struct task_struct *ts;

        ts = current;
        printk("sys_mkdir(%s, %d) is called by (uid = %d, pid = %d)\n",
                        path, mode, ts->uid, ts->pid);
        return orig_mkdir(path, mode);
}

static int hacked_init(void)
{
        orig_mkdir=sys_call_table[__NR_mkdir];
        sys_call_table[__NR_mkdir]=hacked_mkdir;
        return 0;
}

static void hacked_exit(void)
{
        sys_call_table[__NR_mkdir]=orig_mkdir; /*set mkdir syscall to the origal
                                                                                        one*/
}

module_init(hacked_init);
module_exit(hacked_exit);

MODULE_LICENSE("GPL2");
MODULE_AUTHOR("xiaosuo@gmail.com");
[/php]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-3 15:50:13 | 显示全部楼层
谢谢楼上各位,真是醍醐灌顶如坐春风

p.s.代码中 0xc03835c0 这个地址来得好突然啊?劳烦解释一下?
回复 支持 反对

使用道具 举报

发表于 2006-1-3 16:06:18 | 显示全部楼层
Post by datar
谢谢楼上各位,真是醍醐灌顶如坐春风

p.s.代码中 0xc03835c0 这个地址来得好突然啊?劳烦解释一下?


该地址是从System.map中读出来的.不过该方法不推荐使用,系统依赖性太强.估计你用的也不是这个方法,关于这个方法,以前也有过讨论:http://www.linuxsir.cn/bbs/showthread.php?t=183102
回复 支持 反对

使用道具 举报

发表于 2006-1-3 18:24:31 | 显示全部楼层
大多数情况下,没必要替换系统调用, 使用LSM就行了。
回复 支持 反对

使用道具 举报

发表于 2006-1-3 23:11:40 | 显示全部楼层
Post by datar
谢谢楼上各位,真是醍醐灌顶如坐春风

p.s.代码中 0xc03835c0 这个地址来得好突然啊?劳烦解释一下?

grep sys_call_table /boot/System.map
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-4 06:11:00 | 显示全部楼层
再次感谢楼上各位不吝赐教!

p.s.最后还是不太优雅的使用了System.map,而非INT80来取得了sys_call_table的地址;current很好用……linux is facsinating and chaotic
回复 支持 反对

使用道具 举报

发表于 2006-1-4 11:40:29 | 显示全部楼层
你原来是如何做到的?
我目前知道三种方法:
1)System.map
2)idtr => idt => find the opcode of "call *sys_call_table(,%eax,4)"
3)看不懂的一种,贴上源码吧先:
  1. /* system hook */
  2. #ifdef HIDDEN_SCT
  3. static void** dazuko_get_sct()
  4. {
  5.     unsigned long    ptr;
  6.     extern int    loops_per_jiffy;
  7.     unsigned long    *p;
  8.     for (ptr=(unsigned long)&loops_per_jiffy ; ptr<(unsigned long)&boot_cpu_data ; ptr+=sizeof(void *))
  9.     {
  10.         p = (unsigned long *)ptr;
  11.         if (p[6] == (unsigned long)sys_close)
  12.         {
  13.             return (void **)p;
  14.         }
  15.     }
  16.     return NULL;
  17. }
  18. #endif
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表