#ifndef INTERCEPT_INTERCEPT_H
#define INTERCEPT_INTERCEPT_H
#include <stdbool.h>
#include <elf.h>
#include <unistd.h>
#include <dlfcn.h>
#include <link.h>
#include "disasm_wrapper.h"
extern bool debug_dumps_on;
void debug_dump(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
#define INTERCEPTOR_EXIT_CODE 111
__attribute__((noreturn)) void xabort_errno(int error_code, const char *msg);
__attribute__((noreturn)) void xabort(const char *msg);
void xabort_on_syserror(long syscall_result, const char *msg);
struct syscall_desc {
int nr;
long args[6];
};
struct range {
unsigned char *address;
size_t size;
};
struct patch_desc {
unsigned char *syscall_addr;
const char *containing_lib_path;
unsigned long syscall_offset;
unsigned char *asm_wrapper;
unsigned char *dst_jmp_patch;
unsigned char *return_address;
struct intercept_disasm_result preceding_ins_2;
struct intercept_disasm_result preceding_ins;
struct intercept_disasm_result following_ins;
bool uses_prev_ins_2;
bool uses_prev_ins;
bool uses_next_ins;
bool uses_nop_trampoline;
struct range nop_trampoline;
};
struct section_list {
Elf64_Half count;
Elf64_Shdr headers[0x10];
};
struct intercept_desc {
bool uses_trampoline_table;
unsigned char *base_addr;
const char *path;
Elf64_Half text_section_index;
Elf64_Shdr sh_text_section;
struct section_list symbol_tables;
struct section_list rela_tables;
unsigned long text_offset;
unsigned char *text_start;
unsigned char *text_end;
struct patch_desc *items;
unsigned count;
unsigned char *jump_table;
size_t nop_count;
size_t max_nop_count;
struct range *nop_table;
unsigned char *trampoline_table;
size_t trampoline_table_size;
unsigned char *next_trampoline;
};
bool has_jump(const struct intercept_desc *desc, unsigned char *addr);
void mark_jump(const struct intercept_desc *desc, const unsigned char *addr);
void allocate_trampoline_table(struct intercept_desc *desc);
void find_syscalls(struct intercept_desc *desc);
void init_patcher(void);
void create_patch_wrappers(struct intercept_desc *desc, unsigned char **dst);
void mprotect_asm_wrappers(void);
void activate_patches(struct intercept_desc *desc);
#define SYSCALL_INS_SIZE 2
#define JUMP_INS_SIZE 5
#define CALL_OPCODE 0xe8
#define JMP_OPCODE 0xe9
#define SHORT_JMP_OPCODE 0xeb
#define PUSH_IMM_OPCODE 0x68
#define NOP_OPCODE 0x90
#define INT3_OPCODE 0xCC
bool is_overwritable_nop(const struct intercept_disasm_result *ins);
void create_jump(unsigned char opcode, unsigned char *from, void *to);
extern const char *cmdline;
#define PAGE_SIZE ((size_t)0x1000)
static inline unsigned char *
round_down_address(unsigned char *address)
{
return (unsigned char *)(((uintptr_t)address) & ~(PAGE_SIZE - 1));
}
extern size_t asm_wrapper_tmpl_size;
#endif