diff --git a/strace/.gitignore b/strace/.gitignore new file mode 100644 index 00000000..963fa282 --- /dev/null +++ b/strace/.gitignore @@ -0,0 +1 @@ +ft_strace diff --git a/strace/.gitmodules b/strace/.gitmodules new file mode 100644 index 00000000..e69de29b diff --git a/strace/Makefile b/strace/Makefile new file mode 100644 index 00000000..a2b01c98 --- /dev/null +++ b/strace/Makefile @@ -0,0 +1,77 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: wescande +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2016/08/29 21:32:58 by wescande #+# #+# # +# Updated: 2017/04/22 19:26:34 by jhalford ### ########.fr # +# # +# **************************************************************************** # + +SHELL := bash + +NAME = ft_strace + +CC = gcc +W_FLAGS = -Wall -Wextra -Werror +D_FLAGS = +FLAGS = $(W_FLAGS) $(D_FLAGS) + +LEN_NAME = `printf "%s" $(NAME) |wc -c` +DELTA = $$(echo "$$(tput cols)-31-$(LEN_NAME)"|bc) + +SRC_DIR = srcs/ +INC_DIR = includes/ +OBJ_DIR = objs/ + +SRC_BASE = \ +strace.c\ + +SRCS = $(addprefix $(SRC_DIR), $(SRC_BASE)) +OBJS = $(addprefix $(OBJ_DIR), $(SRC_BASE:.c=.o)) +NB = $(words $(SRC_BASE)) +INDEX = 0 + +all : + @make -j $(NAME) + +$(NAME): $(OBJ_DIR) $(OBJS) + @$(CC) $(OBJS) -o $@ \ + -I $(INC_DIR) \ + $(FLAGS) + @printf "\r\033[38;5;117m✓ MAKE $@ \033[0m\033[K\n" + +$(OBJ_DIR) : + @mkdir -p $(OBJ_DIR) + +$(OBJ_DIR)%.o : $(SRC_DIR)%.c | $(OBJ_DIR) + @$(eval DONE=$(shell echo $$(($(INDEX)*20/$(NB))))) + @$(eval PERCENT=$(shell echo $$(($(INDEX)*100/$(NB))))) + @$(eval TO_DO=$(shell echo $$((20-$(INDEX)*20/$(NB) - 1)))) + @$(eval COLOR=$(shell list=(160 196 202 208 215 221 226 227 190 154 118 82 46); index=$$(($(PERCENT) * $${#list[@]} / 100)); echo "$${list[$$index]}")) + @printf "\r\033[38;5;%dm⌛ [%s]: %2d%% `printf '█%.0s' {0..$(DONE)}`%*s❙%*.*s\033[0m\033[K" $(COLOR) ft_p $(PERCENT) $(TO_DO) "" $(DELTA) $(DELTA) "$(shell echo "$@" | sed 's/^.*\///')" + @$(CC) $(FLAGS) $(OBJ_FLAG) -MMD -c $< -o $@\ + -I $(INC_DIR) + @$(eval INDEX=$(shell echo $$(($(INDEX)+1)))) + +clean: + @if [ -e $(OBJ_DIR) ]; then \ + rm -rf $(OBJ_DIR); \ + printf "\r\033[38;5;202m✗ clean $(NAME) \033[0m\033[K\n"; \ + fi; + +fclean: clean + @for file in $(NAME); do \ + if [ -e $$file ]; then \ + rm -f $$file ; \ + printf "\r\033[38;5;196m✗ fclean $$file\033[0m\033[K\n"; \ + fi; \ + done; + +re: fclean all + +.PHONY : fclean clean re + +-include $(OBJS:.o=.d) diff --git a/strace/includes/strace.h b/strace/includes/strace.h new file mode 100644 index 00000000..528f8ac0 --- /dev/null +++ b/strace/includes/strace.h @@ -0,0 +1,370 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* 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 +# include +# include +# include +# 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/strace.c b/strace/srcs/strace.c new file mode 100644 index 00000000..d3d089c4 --- /dev/null +++ b/strace/srcs/strace.c @@ -0,0 +1,111 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* 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 { \ + memcpy(params + 0, ®s->rdi, 8); \ + memcpy(params + 1, ®s->rsi, 8); \ + memcpy(params + 2, ®s->rdx, 8); \ + memcpy(params + 3, ®s->rcx, 8); \ + memcpy(params + 4, ®s->r8, 8); \ + 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) { + /* ptrace(PTRACE_TRACEME, child, 0, 0); */ + raise(SIGSTOP); + execve(av[1], av + 1, environ); + } + ptrace(PTRACE_SEIZE, child, 0, (void*)(PTRACE_O_TRACESYSGOOD)); + ptrace(PTRACE_INTERRUPT, child, 0, 0); + wait(&status); + /* ptrace(PTRACE_SETOPTIONS, child, NULL, PTRACE_O_TRACEEXEC); */ + 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; +}