免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3773 | 回复: 7
打印 上一主题 下一主题

[内核模块] 关于netlink_unicast的问题 [复制链接]

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-16 17:08 |只看该作者 |倒序浏览
我现在在实现一个系统调用劫持的功能,就是如果有某个进程调用open打开特定文件的话,我会像一个告警进程发送消息。
现在的问题是我调用netlink_unicast发送消息给告警进程的时候,这边显示发送成功,但是告警进程却没有收到。但是如果是我的内核模块直接调用netlink_unicast发送消息就没有问题,也就是说,当我的内核模块处于用户进程的上下文的时候,调用netlink_unicast发送消息就会失败,不知道什么原因,是不是这种情况不能用netlink_unicast发送消息啊,那该怎么和另外一个进程通信呢?
主要代码如下:
asmlinkage int our_sys_open(const char* filename, int flags, int mode)
{
        int i = 0;
        char ch;
        struct task_struct * pcurrent;
        char filenm[256];


           if(strcmp(filename, "test") == 0)

           {

           send_to_user(g_nlskt,"PID send success");
           }


         

     return original_call(filename, flags, mode);
}

int send_to_user(struct sock *nlfd,char *info)     //发送到用户态
{
struct sk_buff  *skb;
        struct nlmsghdr *nlh;
        void            *data;
        int ret;

    skb = nlmsg_new(strlen(info), GFP_KERNEL);
    if (!skb)
            return 0;

    nlh     = NLMSG_NEW(skb, pids, 0, WARN_MSG, strlen(info), 0);
    data    = NLMSG_DATA(nlh);
    memcpy(data, info, strlen(info));



ret = netlink_unicast(nlfd, skb, pids[0], MSG_DONTWAIT);
return 0;
nlmsg_failure:
   if(skb)
      kfree_skb(skb);
   return 0;
}
内核直接调用send_to_user发送给告警模块是没问题的,就是当用户调用open的时候再调用就不行,也就是说在用户上下文环境中调用send_to_user函数,告警模块是收不到消息的,请高人指点一下,万分感谢!

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
2 [报告]
发表于 2014-09-16 17:08 |只看该作者
skb = nlmsg_new(strlen(info), GFP_KERNEL);
    if (!skb)
            return 0;

    nlh     = NLMSG_NEW(skb, pids, 0, WARN_MSG, strlen(info), 0);
    data    = NLMSG_DATA(nlh);
    memcpy(data, info, strlen(info));



ret = netlink_unicast(nlfd, skb, pids[0], MSG_DONTWAIT);
return 0;
nlmsg_failure:
   if(skb)
      kfree_skb(skb);
   return 0;
}
内核直接调用send_to_user发送给告警模块是没问题的,就是当用户调用open的时候再调用就不行,也就是说在用户上下文环境中调用send_to_user函数,告警模块是收不到消息的,请高人指点一下,万分感谢

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
3 [报告]
发表于 2014-09-16 17:09 |只看该作者
抱歉,多发了

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
4 [报告]
发表于 2014-09-16 17:37 |只看该作者
为什么总是没有问题回答啊,是我的问题太简单了,还是我的表述有问题?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
5 [报告]
发表于 2014-09-16 19:53 |只看该作者
你以为这是QQ吗?
别人也没有义务给你回呀。
发贴要有耐心。CU的回贴率和回贴质量还是比较高的。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
6 [报告]
发表于 2014-09-16 20:26 |只看该作者
把netlink_unicast的返回结果打出来看看。

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
7 [报告]
发表于 2014-09-17 11:01 |只看该作者
不好意思,主要是比较急。netlink_unicast发送是返回成功的,但是另外一个进程就是接收不到,所以我就怀疑是不是处于用户上下文的时候,netlink_unicast发送消息是不是不行

论坛徽章:
2
申猴
日期:2013-12-26 22:11:31天秤座
日期:2014-12-23 10:23:19
8 [报告]
发表于 2014-09-19 23:34 |只看该作者
ret = netlink_unicast(nlfd, skb, pids[0], MSG_DONTWAIT);


pids[0]是啥玩意?

内核很多地方都是在进程上下文调用 netlink_unicast的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP