Tjchen_520 2023-01-25 23:57 采纳率: 100%
浏览 9
已结题

在协议栈使用strncmp

本人新手上路,想通过加日志的办法追踪一下socket发送数据的流程,
使用的是linux 5.4.100版本内核, ubuntu64位18.04版本 ,在协议栈
socket.c的sock_sendmsg函数中加入了一句strncpy或者使用strncmp系统直接崩溃起不来。
代码如下:

int sock_sendmsg(struct socket *sock, struct msghdr *msg)
{
    int err;
    char content[16] = {0};

    strncpy(content, msg->msg_iter.kvec->iov_base, 9);
    err = security_socket_sendmsg(sock, msg,
                      msg_data_left(msg));
          
    return err ?: sock_sendmsg_nosec(sock, msg);
}

或者

if(!strncmp((char *)msg->msg_iter.kvec->iov_base, "mytest", strlen("mytest"))) {
        printk("<=============okokok===================>");
}

编译和安装语句:
sudo rm arch/x86_64/boot/bzImage
sudo make -j4 bzImage
sudo make install
sudo update-grub
编译和安装内核有警告无错误,

img

img

然后sudo reboot

img

img


在网上找了一些方法也不管用,求指点。

我尝试只修改此处又是是OK的,代码如下:

int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
           struct kvec *vec, size_t num, size_t size)
{
    printk("<======%s======>\n", vec->iov_base);
    iov_iter_kvec(&msg->msg_iter, WRITE, vec, num, size);
    return sock_sendmsg(sock, msg);
}

这里可以正常在日志中显示。

  • 写回答

3条回答 默认 最新

  • Tjchen_520 2023-01-26 11:35
    关注

    突然想到TCP协议中的端口号,把这个给忘了,让自己蹉跎的2天!在此做个笔记。
    代码如下:

    int sock_sendmsg(struct socket *sock, struct msghdr *msg)
    {
        int err = security_socket_sendmsg(sock, msg,
                          msg_data_left(msg));
        if (sock->sk->sk_dport == htons(9000)) {
            printk("<====%s======>msg=%s\n", __FUNCTION__, msg->msg_iter.kvec->iov_base);
        }
    
        return err ?: sock_sendmsg_nosec(sock, msg);
    }
    EXPORT_SYMBOL(sock_sendmsg);
    
    /**
     *    kernel_sendmsg - send a message through @sock (kernel-space)
     *    @sock: socket
     *    @msg: message header
     *    @vec: kernel vec
     *    @num: vec array length
     *    @size: total message data size
     *
     *    Builds the message data with @vec and sends it through @sock.
     *    Returns the number of bytes sent, or an error code.
     */
    
    int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
               struct kvec *vec, size_t num, size_t size)
    {
        iov_iter_kvec(&msg->msg_iter, WRITE, vec, num, size);
        printk("============%s===============\n", __FUNCTION__);
        if (sock->sk->sk_dport == htons(9000)) {
            printk("<====%s======>msg=%s\n", __FUNCTION__, msg->msg_iter.kvec->iov_base);
        }
    
        return sock_sendmsg(sock, msg);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月3日
  • 已采纳回答 1月26日
  • 创建了问题 1月25日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效