diff --git a/strace/Makefile b/strace/Makefile index 57f53f08..0bc06537 100644 --- a/strace/Makefile +++ b/strace/Makefile @@ -12,7 +12,7 @@ SHELL := bash -NAME = ft_ping +NAME = ft_strace CC = gcc W_FLAGS = -Wall -Wextra -Werror @@ -31,7 +31,7 @@ INC_DIR = includes/ OBJ_DIR = objs/ SRC_BASE = \ -ping.c\ +strace.c\ SRCS = $(addprefix $(SRC_DIR), $(SRC_BASE)) OBJS = $(addprefix $(OBJ_DIR), $(SRC_BASE:.c=.o)) @@ -42,12 +42,11 @@ all : @make -C $(LIBFT_DIR) @make -j $(NAME) -$(NAME): $(LIBFT_LIB) $(OBJ_DIR) $(OBJS) $(CLIENT_OBJ) +$(NAME): $(LIBFT_LIB) $(OBJ_DIR) $(OBJS) @$(CC) $(OBJS) -o $@ \ -I $(INC_DIR) \ -I $(LIBFT_INC) \ - $(LIBFT_LIB) $(CLIENT_OBJ) $(FLAGS) \ - -lm + $(LIBFT_LIB) $(FLAGS) @printf "\r\033[38;5;117m✓ MAKE $@ \033[0m\033[K\n" $(LIBFT_LIB): diff --git a/strace/includes/ping.h b/strace/includes/ping.h deleted file mode 100644 index 62399797..00000000 --- a/strace/includes/ping.h +++ /dev/null @@ -1,36 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ft_ping.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/04/22 14:10:24 by jhalford #+# #+# */ -/* Updated: 2017/04/22 15:52:07 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef FT_PING_H -# define FT_PING_H - -# include "libft.h" -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -#define PACKETSIZE 64 - -struct s_packet -{ - struct icmp hdr; - char msg[PACKETSIZE - sizeof(struct icmp)]; -}; - -#endif diff --git a/strace/includes/strace.h b/strace/includes/strace.h new file mode 100644 index 00000000..09331ee0 --- /dev/null +++ b/strace/includes/strace.h @@ -0,0 +1,367 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_ping.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/04/22 14:10:24 by jhalford #+# #+# */ +/* Updated: 2017/04/22 15:52:07 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_STRACE_H +# define FT_STRACE_H + +# include "libft.h" +# include +# include +# include + +enum e_param { + PARAM_NUMBER = 1, + PARAM_STRING, + PARAM_ADDR, +}; + +struct s_syscall { + char name[40]; + enum e_param params[7]; +}; + +typedef struct s_syscall t_syscall; + +t_syscall g_syscalls[] = { + {"read", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"write", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"open", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"close", {PARAM_NUMBER, 0}}, + + {"stat", {PARAM_STRING, PARAM_ADDR, 0}}, + {"fstat", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"lstat", {PARAM_STRING, PARAM_ADDR, 0}}, + {"poll", {PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"lseek", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mmap", {PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mprotect", {PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"munmap", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"brk", {PARAM_ADDR, 0}}, + {"rt_sigaction", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"rt_sigprocmask", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"rt_sigreturn", {PARAM_NUMBER, 0}}, + {"ioctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pread64", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pwrite64", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"readv", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"writev", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"access", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"pipe", {PARAM_ADDR, 0}}, + {"select", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"sched_yield", {0}}, + {"mremap", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"msync", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mincore", {PARAM_NUMBER, PARAM_NUMBER, PARAM_STRING, 0}}, + {"madvise", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"shmget", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"shmat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"shmctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"dup", {PARAM_NUMBER, 0}}, + {"dup2", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pause", {0}}, + {"nanosleep", {PARAM_ADDR, PARAM_ADDR, 0}}, + {"getitimer", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"alarm", {PARAM_NUMBER, 0}}, + {"setitimer", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"getpid", {0}}, + {"sendfile", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"socket", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"connect", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"accept", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"sendto", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"recvfrom", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"sendmsg", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"recvmsg", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"shutdown", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"bind", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"listen", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getsockname", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"getpeername", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"socketpair", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"setsockopt", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"getsockopt", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, 0}}, + {"clone", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"fork", {0}}, + {"vfork", {0}}, + {"execve", {PARAM_STRING, PARAM_ADDR, PARAM_ADDR, 0}}, + {"exit", {PARAM_NUMBER, 0}}, + {"wait4", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"kill", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"uname", {PARAM_ADDR, 0}}, + {"semget", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"semop", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"semctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"shmdt", {PARAM_STRING, 0}}, + {"msgget", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"msgsnd", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"msgrcv", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"msgctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"fcntl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"flock", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"fsync", {PARAM_NUMBER, 0}}, + {"fdatasync", {PARAM_NUMBER, 0}}, + {"truncate", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"ftruncate", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getdents", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"getcwd", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"chdir", {PARAM_STRING, 0}}, + {"fchdir", {PARAM_NUMBER, 0}}, + {"rename", {PARAM_STRING, PARAM_STRING, 0}}, + {"mkdir", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"rmdir", {PARAM_STRING, 0}}, + {"creat", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"link", {PARAM_STRING, PARAM_STRING, 0}}, + {"unlink", {PARAM_STRING, 0}}, + {"symlink", {PARAM_STRING, PARAM_STRING, 0}}, + {"readlink", {PARAM_STRING, PARAM_STRING, PARAM_NUMBER, 0}}, + {"chmod", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"fchmod", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"chown", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"fchown", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"lchown", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"umask", {PARAM_NUMBER, 0}}, + {"gettimeofday", {PARAM_ADDR, PARAM_ADDR, 0}}, + {"getrlimit", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"getrusage", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sysinfo", {PARAM_ADDR, 0}}, + {"times", {PARAM_ADDR, 0}}, + {"ptrace", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getuid", {0}}, + {"syslog", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"getgid", {0}}, + {"setuid", {PARAM_NUMBER, 0}}, + {"setgid", {PARAM_NUMBER, 0}}, + {"geteuid", {0}}, + {"getegid", {0}}, + {"setpgid", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getppid", {0}}, + {"getpgrp", {0}}, + {"setsid", {0}}, + {"setreuid", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"setregid", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getgroups", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"setgroups", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"setresuid", {PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"getresuid", {PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"setresgid", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getresgid", {PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"getpgid", {PARAM_NUMBER, 0}}, + {"setfsuid", {PARAM_NUMBER, 0}}, + {"setfsgid", {PARAM_NUMBER, 0}}, + {"getsid", {PARAM_NUMBER, 0}}, + {"capget", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"capset", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"rt_sigpending", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"rt_sigtimedwait", {PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"rt_sigqueueinfo", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"rt_sigsuspend", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"sigaltstack", {PARAM_ADDR, PARAM_ADDR, 0}}, + {"utime", {PARAM_STRING, PARAM_ADDR, 0}}, + {"mknod", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"uselib", {PARAM_NUMBER, 0}}, + {"personality", {PARAM_NUMBER, 0}}, + {"ustat", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"statfs", {PARAM_STRING, PARAM_ADDR, 0}}, + {"fstatfs", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sysfs", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getpriority", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"setpriority", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"sched_setparam", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sched_getparam", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sched_setscheduler", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sched_getscheduler", {PARAM_NUMBER, 0}}, + {"sched_get_priority_max", {PARAM_NUMBER, 0}}, + {"sched_get_priority_min", {PARAM_NUMBER, 0}}, + {"sched_rr_get_interval", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"mlock", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"munlock", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mlockall", {PARAM_NUMBER, 0}}, + {"munlockall", {0}}, + {"vhangup", {0}}, + {"modify_ldt", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"pivot_root", {PARAM_STRING, PARAM_STRING, 0}}, + {"_sysctl", {PARAM_ADDR, 0}}, + {"prctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"arch_prctl", {PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"adjtimex", {PARAM_ADDR, 0}}, + {"setrlimit", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"chroot", {PARAM_STRING, 0}}, + {"sync", {0}}, + {"acct", {PARAM_STRING, 0}}, + {"settimeofday", {PARAM_ADDR, PARAM_ADDR, 0}}, + {"mount", {PARAM_STRING, PARAM_STRING, PARAM_STRING, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"umount2", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"swapon", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"swapoff", {PARAM_STRING, 0}}, + {"reboot", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sethostname", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"setdomainname", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"iopl", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"ioperm", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"create_module", {PARAM_NUMBER, 0}}, + {"init_module", {PARAM_ADDR, PARAM_NUMBER, PARAM_STRING, 0}}, + {"delete_module", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"get_kernel_syms", {PARAM_NUMBER, 0}}, + {"query_module", {PARAM_NUMBER, 0}}, + {"quotactl", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"nfsservctl", {PARAM_NUMBER, 0}}, + {"getpmsg", {PARAM_NUMBER, 0}}, + {"putpmsg", {PARAM_NUMBER, 0}}, + {"afs_syscall", {PARAM_NUMBER, 0}}, + {"tuxcall", {PARAM_NUMBER, 0}}, + {"security", {PARAM_NUMBER, 0}}, + {"gettid", {0}}, + {"readahead", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"setxattr", {PARAM_STRING, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"lsetxattr", {PARAM_STRING, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"fsetxattr", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getxattr", {PARAM_STRING, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"lgetxattr", {PARAM_STRING, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"fgetxattr", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"listxattr", {PARAM_STRING, PARAM_STRING, PARAM_NUMBER, 0}}, + {"llistxattr", {PARAM_STRING, PARAM_STRING, PARAM_NUMBER, 0}}, + {"flistxattr", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"removexattr", {PARAM_STRING, PARAM_STRING, 0}}, + {"lremovexattr", {PARAM_STRING, PARAM_STRING, 0}}, + {"fremovexattr", {PARAM_NUMBER, PARAM_STRING, 0}}, + {"tkill", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"time", {PARAM_ADDR, 0}}, + {"futex", {PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"sched_setaffinity", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sched_getaffinity", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"set_thread_area", {PARAM_NUMBER, 0}}, + {"io_setup", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"io_destroy", {PARAM_NUMBER, 0}}, + {"io_getevents", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"io_submit", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"io_cancel", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"get_thread_area", {PARAM_NUMBER, 0}}, + {"lookup_dcookie", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"epoll_create", {PARAM_NUMBER, 0}}, + {"epoll_ctl_old", {PARAM_NUMBER, 0}}, + {"epoll_wait_old", {PARAM_NUMBER, 0}}, + {"remap_file_pages", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getdents64", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"set_tid_address", {PARAM_ADDR, 0}}, + {"restart_syscall", {0}}, + {"semtimedop", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"fadvise64", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"timer_create", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"timer_settime", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"timer_gettime", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"timer_getoverrun", {PARAM_NUMBER, 0}}, + {"timer_delete", {PARAM_NUMBER, 0}}, + {"clock_settime", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"clock_gettime", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"clock_getres", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"clock_nanosleep", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"exit_group", {PARAM_NUMBER, 0}}, + {"epoll_wait", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"epoll_ctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"tgkill", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"utimes", {PARAM_STRING, PARAM_ADDR, 0}}, + {"vserver", {PARAM_NUMBER, 0}}, + {"mbind", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"set_mempolicy", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"get_mempolicy", {PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mq_open", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"mq_unlink", {PARAM_STRING, 0}}, + {"mq_timedsend", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"mq_timedreceive", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"mq_notify", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"mq_getsetattr", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"kexec_load", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"waitid", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"add_key", {PARAM_STRING, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"request_key", {PARAM_STRING, PARAM_STRING, PARAM_STRING, PARAM_NUMBER, 0}}, + {"keyctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"ioprio_set", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"ioprio_get", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"inotify_init", {0}}, + {"inotify_add_watch", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"inotify_rm_watch", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"migrate_pages", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"openat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mkdirat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"mknodat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"fchownat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"futimesat", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, 0}}, + {"newfstatat", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"unlinkat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"renameat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_STRING, 0}}, + {"linkat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"symlinkat", {PARAM_STRING, PARAM_NUMBER, PARAM_STRING, 0}}, + {"readlinkat", {PARAM_NUMBER, PARAM_STRING, PARAM_STRING, PARAM_NUMBER, 0}}, + {"fchmodat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"faccessat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"pselect6", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"ppoll", {PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"unshare", {PARAM_NUMBER, 0}}, + {"set_robust_list", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"get_robust_list", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"splice", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"tee", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"sync_file_range", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"vmsplice", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"move_pages", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"utimensat", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"epoll_pwait", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"signalfd", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"timerfd_create", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"eventfd", {PARAM_NUMBER, 0}}, + {"fallocate", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"timerfd_settime", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"timerfd_gettime", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"accept4", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"signalfd4", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"eventfd2", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"epoll_create1", {PARAM_NUMBER, 0}}, + {"dup3", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pipe2", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"inotify_init1", {PARAM_NUMBER, 0}}, + {"preadv", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pwritev", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"rt_tgsigqueueinfo", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"perf_event_open", {PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"recvmmsg", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"fanotify_init", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"fanotify_mark", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"prlimit64", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"name_to_handle_at", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"open_by_handle_at", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"clock_adjtime", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"syncfs", {PARAM_NUMBER, 0}}, + {"sendmmsg", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"setns", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getcpu", {PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"process_vm_readv", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"process_vm_writev", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"kcmp", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"finit_module", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"sched_setattr", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"sched_getattr", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"renameat2", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"seccomp", {PARAM_NUMBER, PARAM_NUMBER, PARAM_STRING, 0}}, + {"getrandom", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"memfd_create", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"kexec_file_load", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"bpf", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"stub_execveat", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"userfaultfd", {PARAM_NUMBER, 0}}, + {"membarrier", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mlock2", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"copy_file_range", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"preadv2", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pwritev2", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, +}; + +#endif diff --git a/strace/srcs/ping.c b/strace/srcs/ping.c deleted file mode 100644 index 8255115a..00000000 --- a/strace/srcs/ping.c +++ /dev/null @@ -1,154 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* main.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/04/22 14:10:24 by jhalford #+# #+# */ -/* Updated: 2017/04/23 18:18:41 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "ping.h" - -int g_pid=-1; -int g_pkt_rec=0; -char g_domain[256]; -struct s_stats g_rs; - -unsigned short ping_cksum(void *b, int len) -{ - unsigned short *buf = b; - unsigned int sum=0; - - for (sum = 0; len > 1; len -= 2) - sum += *((unsigned short*)buf++); - if (len == 1) - sum += *(unsigned char*)buf; - - sum = (sum >> 16) + (sum & 0xFFFF); - return (~(sum + (sum >> 16))); -} - -void display(void *buf, int bytes, struct sockaddr_in *addr) -{ - struct ip *ip = buf; - struct icmp *icmp; - struct s_packet *pkt; - int hlen; - char addrstr[INET_ADDRSTRLEN]; - struct timeval start, end, triptime; - double diff; - - (void)bytes; - hlen = ip->ip_hl << 2; - pkt = (struct s_packet*)(buf + hlen); - icmp = &pkt->hdr; - start = *(struct timeval*)&pkt->msg; - - if (icmp->icmp_id != g_pid) - return ; - if (gettimeofday(&end, NULL) != 0) - return ; - timersub(&end, &start, &triptime); - diff = (triptime.tv_sec + triptime.tv_usec / 1000000.0) * 1000.0; - rs_push(diff); - g_pkt_rec++; - printf("%d bytes from %s: icmp_seq=%d ttl=%i time=%.3f ms\n", - ip->ip_len, - inet_ntop(AF_INET, &(addr->sin_addr), addrstr, INET_ADDRSTRLEN), - icmp->icmp_seq, ip->ip_ttl, diff); -} - - -void ping(struct sockaddr_in *addr) -{ - const int val = 255; - int i; - int sd; - int cnt; - struct s_packet pkt; - struct timeval time; - - if ((sd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) - return (perror("sender socket")); - if (setsockopt(sd, 0, IP_TTL, &val, sizeof(val)) != 0) - perror("set TTL option"); - cnt = 0; - while (1) - { - bzero(&pkt, sizeof(pkt)); - pkt.hdr.icmp_type = ICMP_ECHO; - pkt.hdr.icmp_id = g_pid; - pkt.hdr.icmp_seq = cnt++; - - for (i=0; i < (int)sizeof(pkt.msg); i++) - pkt.msg[i] = i+'0'; - pkt.msg[i] = 0; - if (gettimeofday(&time, NULL) != 0) - return ; - ft_memcpy(pkt.msg, (void*)&time, sizeof(time)); - time = *(struct timeval*)&pkt.msg; - pkt.hdr.icmp_cksum = ping_cksum(&pkt, sizeof(pkt)); - if (sendto(sd, &pkt, sizeof(pkt), 0, (struct sockaddr*)addr, sizeof(*addr)) <= 0) - perror("sendto"); - sleep(1); - } -} - -void stats_recap(int signo) -{ - double loss; - - (void)signo; - rs_calcmore(); - loss = g_rs.count ? 100 * ((float) (g_rs.count - g_pkt_rec) / (float)g_rs.count) : 0; - printf("\n--- %s ping statistics ---", g_domain); - printf("\n%d packets transmitted, %d packets received, %0.1f%% packet loss", g_rs.count, g_pkt_rec, loss); - printf("\nround-trip min/avg/max/stddev = %.3f/%.3f/%.3f/%.3f ms", g_rs.min, g_rs.avg, g_rs.max, g_rs.stdev); - exit(0); -} - -int main(int ac, char **av) -{ - struct sockaddr_in *addr; - struct addrinfo *result, hints; - char addrstr[INET_ADDRSTRLEN]; - - if (ac != 2) - { - printf("usage: %s \n", av[0]); - exit(1); - } - - memset (&hints, 0, sizeof (hints)); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags |= AI_CANONNAME; - if (getaddrinfo(av[1], NULL, &hints, &result) != 0) - { - perror("getaddrinfo"); - exit(1); - } - addr = (struct sockaddr_in*)result->ai_addr; - inet_ntop(AF_INET, &(addr->sin_addr), addrstr, INET_ADDRSTRLEN); - - g_pid = getpid(); - ft_strcpy(g_domain, addrstr); - if (result->ai_canonname) - ft_strcpy(g_domain, result->ai_canonname); - printf("PING %s (%s): %i data bytes\n", FT_TRY(result->ai_canonname, addrstr), addrstr, 64); - if (fork() == 0) - { - signal(SIGINT, stats_recap); - rs_clear(); - listener(PF_INET, SOCK_RAW, IPPROTO_ICMP, &display); - } - else - { - ping(addr); - wait(0); - } - return (0); -} diff --git a/strace/srcs/strace.c b/strace/srcs/strace.c new file mode 100644 index 00000000..3bd6f52a --- /dev/null +++ b/strace/srcs/strace.c @@ -0,0 +1,112 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/04/22 14:10:24 by jhalford #+# #+# */ +/* Updated: 2017/04/23 18:18:41 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "strace.h" + +extern char **environ; + +extern t_syscall g_syscalls[]; + +#define LOAD_PARAMS(params, regs) do { \ + ft_memcpy(params + 0, ®s->rdi, 8); \ + ft_memcpy(params + 1, ®s->rsi, 8); \ + ft_memcpy(params + 2, ®s->rdx, 8); \ + ft_memcpy(params + 3, ®s->rcx, 8); \ + ft_memcpy(params + 4, ®s->r8, 8); \ + ft_memcpy(params + 5, ®s->r9, 8); \ +} while (0) + +void print_syscall_params(t_syscall syscall, struct user_regs_struct *regs) +{ + enum e_param type; + unsigned long long params[7]; + + LOAD_PARAMS(params, regs); + for (int i = 0; syscall.params[i]; i++) { + type = syscall.params[i]; + if (i != 0) + printf(", "); + if (type == PARAM_NUMBER) + printf("%d", (int)params[i]); + if (type == PARAM_STRING) + { + if (params[i] == 0) + printf("NULL"); + /* else */ + /* printf("\"%s\"", (char *)params[i]); */ + } + if (type == PARAM_ADDR) + { + if (params[i] == 0) + printf("NULL"); + else + printf("%#llx", params[i]); + } + } +} + +void print_syscall_ret(unsigned long long ret) +{ + printf(") = "); + if ((signed long long)ret < 0) + printf("-1 (errno %lld)", -ret); + else if (ret >> 16) + printf("%#llx", ret); + else + printf("%lld", ret); + printf("\n"); +} + +int main(int ac, char **av) +{ + int child; + int status; + unsigned long old; + struct user_regs_struct regs; + + (void)ac; + if ((child = fork()) == 0) { + // child process + ptrace(PTRACE_TRACEME, child, 0, 0); + raise(SIGSTOP); + execve(av[1], av + 1, environ); + } + /* ptrace(PTRACE_SEIZE, child, 0, 0); */ + wait(&status); + ptrace(PTRACE_SETOPTIONS, child, NULL, PTRACE_O_TRACEEXEC); + ptrace(PTRACE_SETOPTIONS, child, NULL, PTRACE_O_TRACESYSGOOD); + while (1) { + ptrace(PTRACE_SYSCALL, child, NULL, NULL); + waitpid(child, &status, 0); + if (WIFEXITED(status)) + { + if (old != 0) + printf(") = ?\n+++ exited with %d +++\n", WEXITSTATUS(status)); + break ; + } + else if (!(WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)) + continue ; + + ptrace(PTRACE_GETREGS, child, NULL, ®s); + if (old != regs.rip) { + printf("%s(", g_syscalls[regs.orig_rax].name); + print_syscall_params(g_syscalls[regs.orig_rax], ®s); + old = regs.rip; + } + else + { + print_syscall_ret(regs.rax); + old = 0; + } + } + return (0); +} diff --git a/strace/test.c b/strace/test.c new file mode 100644 index 00000000..e14c964b --- /dev/null +++ b/strace/test.c @@ -0,0 +1,11 @@ +#include +#include + +int main(void) +{ + write(1, "write in tracee\n", 16); + int fd = open("test.c", 0); + close(fd); + dup2(3, fd); + return 0; +}