LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: datar

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

[复制链接]
发表于 2006-1-4 12:02:01 | 显示全部楼层
Post by 小锁

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
复制代码

关于这种方法,可以看一下System.map,就明白了.sys_call_table符号在loops_per_jiffy和boot_cpu_data之间,不过这个方法也有其局限性,我在FC3(原内核)上试过,就不行,要稍微改动一下才可以.相比校而言,第二种方法倒是比较通用的.
回复 支持 反对

使用道具 举报

发表于 2006-1-4 13:27:04 | 显示全部楼层
那如果进入系统调用不是用int 0x80怎办?比如用sysenter指令,是不是找到sysenter的二进制码,然后照int 0x80的葫芦画sysenter的瓢-__-
回复 支持 反对

使用道具 举报

发表于 2006-1-4 16:46:59 | 显示全部楼层
Post by jszhang3
那如果进入系统调用不是用int 0x80怎办?比如用sysenter指令,是不是找到sysenter的二进制码,然后照int 0x80的葫芦画sysenter的瓢-__-


这个没关系呀. 除非int 0x80方式被linux抛弃,否则这一段都会被编译到内核,那么就可以通过他获取sys_call_table的地址
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-5 01:19:29 | 显示全部楼层
Post by 小锁
你原来是如何做到的?
...


INT80,GOOGLE来的代码,不太理解,而且好像代码不够强健,所以最后还是决定用System.map
回复 支持 反对

使用道具 举报

发表于 2006-1-5 10:48:14 | 显示全部楼层
贴出来看看啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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