Merge strace with full history
This commit is contained in:
commit
b7bfabed15
6 changed files with 570 additions and 0 deletions
1
strace/.gitignore
vendored
Normal file
1
strace/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
ft_strace
|
||||
0
strace/.gitmodules
vendored
Normal file
0
strace/.gitmodules
vendored
Normal file
77
strace/Makefile
Normal file
77
strace/Makefile
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
# **************************************************************************** #
|
||||
# #
|
||||
# ::: :::::::: #
|
||||
# Makefile :+: :+: :+: #
|
||||
# +:+ +:+ +:+ #
|
||||
# By: wescande <wescande@student.42.fr> +#+ +:+ +#+ #
|
||||
# +#+#+#+#+#+ +#+ #
|
||||
# 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)
|
||||
370
strace/includes/strace.h
Normal file
370
strace/includes/strace.h
Normal file
|
|
@ -0,0 +1,370 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* ft_ping.h :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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 <unistd.h>
|
||||
# include <stdlib.h>
|
||||
# include <stdio.h>
|
||||
# include <string.h>
|
||||
# include <sys/ptrace.h>
|
||||
# include <sys/user.h>
|
||||
# include <sys/wait.h>
|
||||
|
||||
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
|
||||
111
strace/srcs/strace.c
Normal file
111
strace/srcs/strace.c
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* main.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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);
|
||||
}
|
||||
11
strace/test.c
Normal file
11
strace/test.c
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
write(1, "write in tracee\n", 16);
|
||||
int fd = open("test.c", 0);
|
||||
close(fd);
|
||||
dup2(3, fd);
|
||||
return 0;
|
||||
}
|
||||
Loading…
Reference in a new issue