1*a9643ea8Slogwang 2*a9643ea8Slogwang /** 3*a9643ea8Slogwang * Tencent is pleased to support the open source community by making MSEC available. 4*a9643ea8Slogwang * 5*a9643ea8Slogwang * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. 6*a9643ea8Slogwang * 7*a9643ea8Slogwang * Licensed under the GNU General Public License, Version 2.0 (the "License"); 8*a9643ea8Slogwang * you may not use this file except in compliance with the License. You may 9*a9643ea8Slogwang * obtain a copy of the License at 10*a9643ea8Slogwang * 11*a9643ea8Slogwang * https://opensource.org/licenses/GPL-2.0 12*a9643ea8Slogwang * 13*a9643ea8Slogwang * Unless required by applicable law or agreed to in writing, software distributed under the 14*a9643ea8Slogwang * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 15*a9643ea8Slogwang * either express or implied. See the License for the specific language governing permissions 16*a9643ea8Slogwang * and limitations under the License. 17*a9643ea8Slogwang */ 18*a9643ea8Slogwang 19*a9643ea8Slogwang 20*a9643ea8Slogwang #include <stdio.h> 21*a9643ea8Slogwang #include <stdlib.h> 22*a9643ea8Slogwang #include <stdint.h> 23*a9643ea8Slogwang #include <sched.h> 24*a9643ea8Slogwang #include <unistd.h> 25*a9643ea8Slogwang #include <pthread.h> 26*a9643ea8Slogwang #include <errno.h> 27*a9643ea8Slogwang #include <assert.h> 28*a9643ea8Slogwang #include <sys/types.h> 29*a9643ea8Slogwang #include <sys/stat.h> 30*a9643ea8Slogwang #include <sys/ioctl.h> 31*a9643ea8Slogwang #include <fcntl.h> 32*a9643ea8Slogwang #include <stdarg.h> 33*a9643ea8Slogwang #include "ff_api.h" 34*a9643ea8Slogwang #include "mt_sys_hook.h" 35*a9643ea8Slogwang #include "ff_hook.h" 36*a9643ea8Slogwang 37*a9643ea8Slogwang 38*a9643ea8Slogwang 39*a9643ea8Slogwang 40*a9643ea8Slogwang /* 41*a9643ea8Slogwang void ff_hook_new_fd(int fd) 42*a9643ea8Slogwang { 43*a9643ea8Slogwang if (fd < 0 || fd >= ff_HOOK_MAX_FD) { 44*a9643ea8Slogwang return; 45*a9643ea8Slogwang } 46*a9643ea8Slogwang g_ff_hook_fd_tab[fd] = 1; 47*a9643ea8Slogwang } 48*a9643ea8Slogwang 49*a9643ea8Slogwang bool ff_hook_find_fd(int fd) { 50*a9643ea8Slogwang if (fd < 0 || fd >= ff_HOOK_MAX_FD) { 51*a9643ea8Slogwang return false; 52*a9643ea8Slogwang } 53*a9643ea8Slogwang 54*a9643ea8Slogwang if (g_ff_hook_fd_tab[fd] == 1) { 55*a9643ea8Slogwang return true; 56*a9643ea8Slogwang } else { 57*a9643ea8Slogwang return false; 58*a9643ea8Slogwang } 59*a9643ea8Slogwang } 60*a9643ea8Slogwang 61*a9643ea8Slogwang void ff_hook_free_fd(int fd) 62*a9643ea8Slogwang { 63*a9643ea8Slogwang if (fd < 0 || fd >= ff_HOOK_MAX_FD) { 64*a9643ea8Slogwang return; 65*a9643ea8Slogwang } 66*a9643ea8Slogwang g_ff_hook_fd_tab[fd] = 0; 67*a9643ea8Slogwang } 68*a9643ea8Slogwang */ 69*a9643ea8Slogwang 70*a9643ea8Slogwang int ff_hook_socket(int domain, int type, int protocol) 71*a9643ea8Slogwang { 72*a9643ea8Slogwang if (!ff_hook_active() || (AF_INET != domain) || (SOCK_STREAM != type && SOCK_DGRAM != type)) { 73*a9643ea8Slogwang return mt_real_func(socket)(domain, type, protocol); 74*a9643ea8Slogwang } 75*a9643ea8Slogwang int fd = ff_socket(domain, type, protocol); 76*a9643ea8Slogwang if (fd >= 0) { 77*a9643ea8Slogwang fd |= 1 << FF_FD_BITS; 78*a9643ea8Slogwang } 79*a9643ea8Slogwang return fd; 80*a9643ea8Slogwang } 81*a9643ea8Slogwang 82*a9643ea8Slogwang int ff_hook_close(int fd) 83*a9643ea8Slogwang { 84*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 85*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 86*a9643ea8Slogwang return ff_close(fd); 87*a9643ea8Slogwang } else { 88*a9643ea8Slogwang return mt_real_func(close)(fd); 89*a9643ea8Slogwang } 90*a9643ea8Slogwang } 91*a9643ea8Slogwang 92*a9643ea8Slogwang int ff_hook_connect(int fd, const struct sockaddr *address, socklen_t addrlen_len) 93*a9643ea8Slogwang { 94*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 95*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 96*a9643ea8Slogwang return ff_connect(fd, (struct linux_sockaddr *)address, addrlen_len); 97*a9643ea8Slogwang } else { 98*a9643ea8Slogwang return mt_real_func(connect)(fd, address, addrlen_len); 99*a9643ea8Slogwang } 100*a9643ea8Slogwang } 101*a9643ea8Slogwang 102*a9643ea8Slogwang ssize_t ff_hook_read(int fd, void *buf, size_t nbyte) 103*a9643ea8Slogwang { 104*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 105*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 106*a9643ea8Slogwang return ff_read(fd, buf, nbyte); 107*a9643ea8Slogwang } else { 108*a9643ea8Slogwang return mt_real_func(read)(fd, buf, nbyte); 109*a9643ea8Slogwang } 110*a9643ea8Slogwang } 111*a9643ea8Slogwang 112*a9643ea8Slogwang ssize_t ff_hook_write(int fd, const void *buf, size_t nbyte) 113*a9643ea8Slogwang { 114*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 115*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 116*a9643ea8Slogwang return ff_write(fd, buf, nbyte); 117*a9643ea8Slogwang } else { 118*a9643ea8Slogwang return mt_real_func(write)(fd, buf, nbyte); 119*a9643ea8Slogwang } 120*a9643ea8Slogwang } 121*a9643ea8Slogwang ssize_t ff_hook_sendto(int fd, const void *message, size_t length, int flags, 122*a9643ea8Slogwang const struct sockaddr *dest_addr, socklen_t dest_len) 123*a9643ea8Slogwang { 124*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 125*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 126*a9643ea8Slogwang return ff_sendto(fd, message, length, flags, (struct linux_sockaddr *)dest_addr, dest_len); 127*a9643ea8Slogwang } else { 128*a9643ea8Slogwang return mt_real_func(sendto)(fd, message, length, flags, dest_addr, dest_len); 129*a9643ea8Slogwang } 130*a9643ea8Slogwang } 131*a9643ea8Slogwang ssize_t ff_hook_recvfrom(int fd, void *buffer, size_t length, int flags, 132*a9643ea8Slogwang struct sockaddr *address, socklen_t *address_len) 133*a9643ea8Slogwang { 134*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 135*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 136*a9643ea8Slogwang return ff_recvfrom(fd, buffer, length, flags, (struct linux_sockaddr *)address, address_len); 137*a9643ea8Slogwang } else { 138*a9643ea8Slogwang return mt_real_func(recvfrom)(fd, buffer, length, flags, address, address_len); 139*a9643ea8Slogwang } 140*a9643ea8Slogwang } 141*a9643ea8Slogwang ssize_t ff_hook_recv(int fd, void *buffer, size_t length, int flags) 142*a9643ea8Slogwang { 143*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 144*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 145*a9643ea8Slogwang return ff_recv(fd, buffer, length, flags); 146*a9643ea8Slogwang } else { 147*a9643ea8Slogwang return mt_real_func(recv)(fd, buffer, length, flags); 148*a9643ea8Slogwang } 149*a9643ea8Slogwang } 150*a9643ea8Slogwang ssize_t ff_hook_send(int fd, const void *buf, size_t nbyte, int flags) 151*a9643ea8Slogwang { 152*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 153*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 154*a9643ea8Slogwang return ff_send(fd, buf, nbyte, flags); 155*a9643ea8Slogwang } else { 156*a9643ea8Slogwang return mt_real_func(send)(fd, buf, nbyte, flags); 157*a9643ea8Slogwang } 158*a9643ea8Slogwang 159*a9643ea8Slogwang } 160*a9643ea8Slogwang int ff_hook_setsockopt(int fd, int level, int option_name, const void *option_value, socklen_t option_len) 161*a9643ea8Slogwang { 162*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 163*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 164*a9643ea8Slogwang return ff_setsockopt(fd, level, option_name, option_value, option_len); 165*a9643ea8Slogwang } else { 166*a9643ea8Slogwang return mt_real_func(setsockopt)(fd, level, option_name, option_value, option_len); 167*a9643ea8Slogwang } 168*a9643ea8Slogwang } 169*a9643ea8Slogwang 170*a9643ea8Slogwang int ff_hook_ioctl(int fd, int cmd, void *arg) 171*a9643ea8Slogwang { 172*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 173*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 174*a9643ea8Slogwang return ff_ioctl(fd, cmd, arg); 175*a9643ea8Slogwang } else { 176*a9643ea8Slogwang return mt_real_func(ioctl)(fd, cmd, arg); 177*a9643ea8Slogwang } 178*a9643ea8Slogwang } 179*a9643ea8Slogwang 180*a9643ea8Slogwang int ff_hook_fcntl(int fd, int cmd, void *arg) 181*a9643ea8Slogwang { 182*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 183*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 184*a9643ea8Slogwang return ff_fcntl(fd, cmd, arg); 185*a9643ea8Slogwang } else { 186*a9643ea8Slogwang return mt_real_func(fcntl)(fd, cmd, arg); 187*a9643ea8Slogwang } 188*a9643ea8Slogwang } 189*a9643ea8Slogwang 190*a9643ea8Slogwang int ff_hook_listen(int fd, int backlog) 191*a9643ea8Slogwang { 192*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 193*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 194*a9643ea8Slogwang return ff_listen(fd, backlog); 195*a9643ea8Slogwang } else { 196*a9643ea8Slogwang return mt_real_func(listen)(fd, backlog); 197*a9643ea8Slogwang } 198*a9643ea8Slogwang } 199*a9643ea8Slogwang 200*a9643ea8Slogwang int ff_hook_bind(int fd, const struct sockaddr *addr, socklen_t addrlen) 201*a9643ea8Slogwang { 202*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 203*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 204*a9643ea8Slogwang return ff_bind(fd, (struct linux_sockaddr *)addr, addrlen); 205*a9643ea8Slogwang } else { 206*a9643ea8Slogwang return mt_real_func(bind)(fd, addr, addrlen); 207*a9643ea8Slogwang } 208*a9643ea8Slogwang } 209*a9643ea8Slogwang int ff_hook_accept(int fd, struct sockaddr *addr, socklen_t *addrlen) 210*a9643ea8Slogwang { 211*a9643ea8Slogwang if (CHK_FD_BIT(fd)) { 212*a9643ea8Slogwang fd = CLR_FD_BIT(fd); 213*a9643ea8Slogwang int c = ff_accept(fd, (struct linux_sockaddr *)addr, addrlen); 214*a9643ea8Slogwang if (c < 0) { 215*a9643ea8Slogwang return c; 216*a9643ea8Slogwang } 217*a9643ea8Slogwang c |= 1 << FF_FD_BITS; 218*a9643ea8Slogwang return c; 219*a9643ea8Slogwang } else { 220*a9643ea8Slogwang return mt_real_func(accept)(fd, addr, addrlen); 221*a9643ea8Slogwang } 222*a9643ea8Slogwang } 223