免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: g84ch
打印 上一主题 下一主题

[原创]关于劫持系统调用隐藏进程的一些心得 [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
41 [报告]
发表于 2009-10-20 11:03 |只看该作者

回复 #40 CUDev 的帖子

看一下我39楼的问题

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
42 [报告]
发表于 2009-10-20 11:11 |只看该作者

回复 #40 CUDev 的帖子

刚刚看了你博客上一篇文章《通过/dev/mem进行恶意代码注入》:
在大多数的虚拟机中将无法顺利的读取IDTR。因为lidt指令是一个特权指令,将会产生一个异常,并被VM所捕获。这样可以使VM为每一个操作系统维持一个虚拟的IDTR。因为sidt指令没有被处理,它将会返回一个伪造的IDTR地址,通常会大于0xFFC00000。

我测试的环境是虚拟机,要是按照上面的说法,用户控件的sidt指令估计没有被处理,返回的idtr是不真实的。而且也就是大于0xFFC00000。我切换到物理机测试一下。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
43 [报告]
发表于 2009-10-20 11:50 |只看该作者
在大多数的虚拟机中将无法顺利的读取IDTR。因为lidt指令是一个特权指令,将会产生一个异常,并被VM所捕获。这样可以使VM为每一个操作系统维持一个虚拟的IDTR。因为sidt指令没有被处理,它将会返回一个伪造的IDTR地址,通常会大于0xFFC00000。


经过物理机上测试,我在22楼的LKM代码和CUDev兄的应用空间代码的测试结果一致,也正好验证了虚拟机上无法顺利读取IDTR的情况。

呵呵,这个问题也算有结果了。

论坛徽章:
0
44 [报告]
发表于 2009-10-20 12:24 |只看该作者

回复 #42 Godbach 的帖子

汗!原来你是在虚拟机里面做测试啊

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
45 [报告]
发表于 2009-10-20 13:20 |只看该作者

回复 #44 CUDev 的帖子

呵呵,是啊。

以后再说测试环境的时候,若是虚拟机,我会记得说明的。有些内核的测试,虚拟机和物理机会有很大区别的。

论坛徽章:
0
46 [报告]
发表于 2009-10-28 09:28 |只看该作者
收藏,学习中。

论坛徽章:
0
47 [报告]
发表于 2009-10-28 09:58 |只看该作者
看错了

[ 本帖最后由 空灵静世 于 2009-10-28 10:11 编辑 ]

论坛徽章:
0
48 [报告]
发表于 2009-10-28 10:07 |只看该作者
看下我的问题,我的代码试图替换read系统调用,但insmod之后,体统会回到login界面,然后一直提示错误的文件描述符,为什么?代码如下
#include <linux/fs.h>
#include <linux/unistd.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
int errno;
int orig_cr0;
static inline _syscall3(ssize_t,read,int,fd,void*,buf,size_t,count);
static inline _syscall3(ssize_t,write,int,fd,void*,buf,size_t,count);
int (*original_read)(int,void *,size_t);
int (*original_write)(int ,void *,size_t);
struct {
        unsigned short limit;
        unsigned int base;
}__attribute__((packed)) idtr;
struct {
        unsigned short off1;
        unsigned short sel;
        unsigned char none,flagg;
        unsigned short off2;
}__attribute__((packed)) idt;

unsigned int clear_and_return_cr0(void)
{
    unsigned int cr0 = 0;
    unsigned int ret;

    asm volatile ("movl %%cr0, %%eax"
            : "=a"(cr0)
         );
    ret = cr0;

    /*clear the 20th bit of CR0,*/
    cr0 &= 0xfffeffff;
    asm volatile ("movl %%eax, %%cr0"
            :
            : "a"(cr0)
         );
    return ret;
}
void setback_cr0(unsigned int val)
{
    asm volatile ("movl %%eax, %%cr0"
            :

            : "a"(val)
         );
}

void ** get_sys_call_table(void){
        unsigned int sys_call_off;
        unsigned int sys_call_table;
        unsigned char *p;
        int i;
        asm("sidt %0":"=m"(idtr));
        printk("addr of idtr:%x\n",&idtr);

        memcpy(&idt,(void *)(idtr.base+8*0x80),sizeof(idt));
        sys_call_off = (idt.off2<< 16|idt.off1);
        printk("addr of idt ox80:%x\n",sys_call_off);
        p =(unsigned char *)sys_call_off;
        for (i=0;i<100;i++){
                if (p==0xff && p[i+1]==0x14 && p[i+2] == 0x85){
                        sys_call_table = *(unsigned int *)(p+i+3);
                        printk("i:[%d],addr of sys_call_table:%x\n",i,sys_call_table);
                        return sys_call_table;
                }
        }
        return (void **)0;
}

int mystrncmp(char *str1,char *str2,int len){
        int index = 0 ;
        for (;index < len && *str1 && *str2;index++){
                if (*(str1++) != *(str2++))
                        return -1;
        }
        if (index >=len)
                return 0;
        return -1;
}
int hacked_read(int fd,char *buf,size_t count){
        int res = original_read(fd,buf,count); //与int res = (*original_read)(fd,buf,count);情况相同
        return res;

}
int hacked_write(int fd,char *buf,size_t count){
        int res = 0;
/*      if (mystrncmp(buf,"zhzh",4)){
                buf[0] = 'a';
                buf[1] = 'b';
                buf[2] = 'c';
                buf[3] = 'd';
        }
*/
        res = original_write(fd,buf,count);
        return res;

}
int init_module(void){
        void **sys_call_table = get_sys_call_table();
        original_read = sys_call_table[__NR_read];
        original_write = sys_call_table[__NR_write];
        orig_cr0 = clear_and_return_cr0();
        sys_call_table[__NR_read]= hacked_read;
//      sys_call_table[__NR_write]= hacked_write;
        setback_cr0(orig_cr0);
        return 0;
}

void cleanup_module(void)

{       void **sys_call_table = get_sys_call_table();
        orig_cr0 = clear_and_return_cr0();
        sys_call_table[__NR_read] = original_read;
//      sys_call_table[__NR_write] = original_write;
        setback_cr0(orig_cr0);
}


[ 本帖最后由 空灵静世 于 2009-10-28 10:18 编辑 ]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
49 [报告]
发表于 2009-10-28 10:20 |只看该作者
  1. int (*original_read)(int,void *,size_t);
  2. int (*original_write)(int ,void *,size_t);
复制代码

内核中的read和wirte的接口就是你上面所列出的吗?

论坛徽章:
0
50 [报告]
发表于 2009-10-28 10:36 |只看该作者
谢谢楼上的,是这个出错了^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP