From 2e093ea637ecb1f37d96a45ab8e36100d9f869f8 Mon Sep 17 00:00:00 2001 From: Alexander Aksenov Date: Mon, 15 Jul 2013 16:41:23 +0400 Subject: [PATCH] [FIX] Remove dependencies from old driver --- build.sh | 3 -- kprobe/dbi_insn_slots.c | 2 +- uprobe/swap_uprobes.h | 2 +- us_manager/Kbuild | 2 +- us_manager/helper.c | 2 - us_manager/sspt/ip.c | 3 +- us_manager/sspt/ip.h | 2 +- us_manager/sspt/sspt.h | 10 +--- us_manager/sspt/sspt_file.c | 7 ++- us_manager/sspt/sspt_proc.c | 1 - us_manager/sspt/us_proc_types.h | 59 +++++++++++++++++++++++ us_manager/us_def_handler.c | 101 ++++++++++++++++++++++++++++++++++++++++ us_manager/us_def_handler.h | 21 +++++++++ us_manager/us_manager.c | 6 +-- us_manager/us_slot_manager.c | 4 +- 15 files changed, 195 insertions(+), 30 deletions(-) create mode 100644 us_manager/sspt/us_proc_types.h create mode 100644 us_manager/us_def_handler.c create mode 100644 us_manager/us_def_handler.h diff --git a/build.sh b/build.sh index f5fbc94..4e51c49 100755 --- a/build.sh +++ b/build.sh @@ -34,9 +34,6 @@ ks_features_dir=${modules_dir}/ks_features sampler_dir=${modules_dir}/sampler parser_dir=${modules_dir}/parser -driver_dir=${modules_dir}/driver -common_dir=${modules_dir}/../common - install_dir="/opt/swap/sdk" rm ${kprobe_arch_dir}/asm diff --git a/kprobe/dbi_insn_slots.c b/kprobe/dbi_insn_slots.c index 7a02e4b..e3d508b 100644 --- a/kprobe/dbi_insn_slots.c +++ b/kprobe/dbi_insn_slots.c @@ -50,7 +50,7 @@ #include #include #include -#include +#include struct chunk { unsigned long *data; diff --git a/uprobe/swap_uprobes.h b/uprobe/swap_uprobes.h index 0980228..7fad2fe 100644 --- a/uprobe/swap_uprobes.h +++ b/uprobe/swap_uprobes.h @@ -27,7 +27,7 @@ * */ -#include "dbi_kprobes.h" +#include struct uprobe { struct kprobe kp; diff --git a/us_manager/Kbuild b/us_manager/Kbuild index b2addfc..9d52c7c 100644 --- a/us_manager/Kbuild +++ b/us_manager/Kbuild @@ -5,4 +5,4 @@ swap_us_manager-y := us_manager.o us_slot_manager.o helper.o \ sspt/ip.o sspt/sspt_page.o sspt/sspt_file.o sspt/sspt_proc.o \ pf/proc_filters.o pf/pf_group.o \ img/img_proc.o img/img_file.o img/img_ip.o \ - ../driver/us_def_handler.o + us_def_handler.o diff --git a/us_manager/helper.c b/us_manager/helper.c index d7a2149..1507b4c 100644 --- a/us_manager/helper.c +++ b/us_manager/helper.c @@ -1,9 +1,7 @@ #include #include #include -#include "us_proc_inst.h" #include "us_slot_manager.h" -#include "storage.h" #include "sspt/sspt.h" #include "helper.h" diff --git a/us_manager/sspt/ip.c b/us_manager/sspt/ip.c index 71d7d09..1946137 100644 --- a/us_manager/sspt/ip.c +++ b/us_manager/sspt/ip.c @@ -27,8 +27,7 @@ #include "sspt_page.h" #include "sspt_file.h" -/* FIXME: */ -#include "../../driver/us_def_handler.h" +#include "us_def_handler.h" struct us_ip *create_ip(unsigned long offset, const char *args) { diff --git a/us_manager/sspt/ip.h b/us_manager/sspt/ip.h index 3e09cf1..358e84b 100644 --- a/us_manager/sspt/ip.h +++ b/us_manager/sspt/ip.h @@ -27,7 +27,7 @@ #include //#include "../../kprobe/dbi_kprobes.h" -#include +#include // TODO: tmp struct ip_data struct ip_data { diff --git a/us_manager/sspt/sspt.h b/us_manager/sspt/sspt.h index 1e71141..a373842 100644 --- a/us_manager/sspt/sspt.h +++ b/us_manager/sspt/sspt.h @@ -30,15 +30,11 @@ #include "sspt_file.h" #include "sspt_proc.h" #include "sspt_debug.h" +#include "us_proc_types.h" #include #include "us_def_handler.h" -#include "../../driver/storage.h" - -#include "picl.h" -#include "../../common/ec_probe.h" - #include #include @@ -109,10 +105,6 @@ static inline int sspt_register_usprobe(struct us_ip *ip) ret = dbi_register_ujprobe(&ip->jprobe); if (ret) { - if (ret == -ENOEXEC) { - pack_event_info(ERR_MSG_ID, RECORD_ENTRY, "dp", - 0x1, ip->jprobe.up.kp.addr); - } printk("dbi_register_ujprobe() failure %d\n", ret); return ret; } diff --git a/us_manager/sspt/sspt_file.c b/us_manager/sspt/sspt_file.c index 03400a8..7407834 100644 --- a/us_manager/sspt/sspt_file.c +++ b/us_manager/sspt/sspt_file.c @@ -26,7 +26,6 @@ #include "sspt_file.h" #include "sspt_page.h" #include "sspt_proc.h" -#include #include #include #include @@ -234,7 +233,7 @@ void sspt_file_set_mapping(struct sspt_file *file, struct vm_area_struct *vma) file->vm_start = vma->vm_start; file->vm_end = vma->vm_end; - ptr_pack_task_event_info(task, DYN_LIB_PROBE_ID, RECORD_ENTRY, "dspdd", - task->tgid, file->dentry->d_iname, vma->vm_start, - vma->vm_end - vma->vm_start, 0); +// ptr_pack_task_event_info(task, DYN_LIB_PROBE_ID, RECORD_ENTRY, "dspdd", +// task->tgid, file->dentry->d_iname, vma->vm_start, +// vma->vm_end - vma->vm_start, 0); } diff --git a/us_manager/sspt/sspt_proc.c b/us_manager/sspt/sspt_proc.c index 496e7d2..69e71c1 100644 --- a/us_manager/sspt/sspt_proc.c +++ b/us_manager/sspt/sspt_proc.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #define mm_read_lock(task, mm, atomic, lock) \ diff --git a/us_manager/sspt/us_proc_types.h b/us_manager/sspt/us_proc_types.h new file mode 100644 index 0000000..6195a67 --- /dev/null +++ b/us_manager/sspt/us_proc_types.h @@ -0,0 +1,59 @@ +typedef struct +{ + struct list_head list; + char *name; + int installed; + struct jprobe jprobe; + struct kretprobe retprobe; + unsigned long offset; + unsigned long got_addr; + + unsigned flag_retprobe:1; + unsigned flag_got:1; +} us_proc_ip_t; + +typedef struct +{ + int installed; + struct jprobe jprobe; + unsigned long addr; + struct list_head list; +} us_proc_vtp_t; + +typedef struct +{ + unsigned func_addr; + unsigned got_addr; + unsigned real_func_addr; +} us_proc_plt_t; + +typedef struct +{ + char *path; + char *path_dyn; + struct dentry *m_f_dentry; + unsigned ips_count; + us_proc_ip_t *p_ips; + unsigned vtps_count; + us_proc_vtp_t *p_vtps; + int loaded; + unsigned plt_count; + us_proc_plt_t *p_plt; + unsigned long vma_start; + unsigned long vma_end; + unsigned vma_flag; +} us_proc_lib_t; + +typedef struct { + char *path; + struct dentry *m_f_dentry; + pid_t tgid; + unsigned unres_ips_count; + unsigned unres_vtps_count; + int is_plt; + unsigned libs_count; + us_proc_lib_t *p_libs; + + // new_dpf + struct sspt_proc *pp; +} inst_us_proc_t; diff --git a/us_manager/us_def_handler.c b/us_manager/us_def_handler.c new file mode 100644 index 0000000..3fb52ca --- /dev/null +++ b/us_manager/us_def_handler.c @@ -0,0 +1,101 @@ +#include +#include +//#include +//#include +#include +#include +#include +//#include "storage.h" +//#include "us_proc_inst.h" +#include +#include + +DEFINE_PER_CPU(struct us_ip *, gpCurIp) = NULL; +EXPORT_PER_CPU_SYMBOL_GPL(gpCurIp); +DEFINE_PER_CPU(struct pt_regs *, gpUserRegs) = NULL; +EXPORT_PER_CPU_SYMBOL_GPL(gpUserRegs); + +unsigned long ujprobe_event_pre_handler(struct us_ip *ip, struct pt_regs *regs) +{ + __get_cpu_var(gpCurIp) = ip; + __get_cpu_var(gpUserRegs) = regs; + + return 0; +} +EXPORT_SYMBOL_GPL(ujprobe_event_pre_handler); + +void ujprobe_event_handler(unsigned long arg0, unsigned long arg1, + unsigned long arg2, unsigned long arg3, + unsigned long arg4, unsigned long arg5) +{ + struct us_ip *ip = __get_cpu_var(gpCurIp); + struct us_ip *regs = __get_cpu_var(gpUserRegs); + unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr; + +#if defined(CONFIG_ARM) + addr = ip->offset & 0x01 ? addr | 0x01 : addr; +#endif + + entry_event(ip->jprobe.args, regs, PT_US, PST_NONE); + + swap_ujprobe_return(); +} +EXPORT_SYMBOL_GPL(ujprobe_event_handler); + +static void send_plt(struct us_ip *ip) +{ + unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr; + struct vm_area_struct *vma = find_vma(current->mm, addr); + + if (vma && check_vma(vma)) { + char *name = NULL; + unsigned long real_addr; + unsigned long real_got = current->mm->exe_file == vma->vm_file ? + ip->got_addr : + ip->got_addr + vma->vm_start; + + if (!read_proc_vm_atomic(current, real_got, &real_addr, sizeof(real_addr))) { + printk("Failed to read got %lx at memory address %lx!\n", ip->got_addr, real_got); + return; + } + + vma = find_vma(current->mm, real_addr); + if (vma && (vma->vm_start <= real_addr) && (vma->vm_end > real_addr)) { + name = vma->vm_file ? vma->vm_file->f_dentry->d_iname : NULL; + } else { + printk("Failed to get vma, includes %lx address\n", real_addr); + return; + } + +// if (name) +// pack_event_info(PLT_ADDR_PROBE_ID, RECORD_RET, "ppsp", +// addr, real_addr, name, +// real_addr - vma->vm_start); +// else +// pack_event_info(PLT_ADDR_PROBE_ID, RECORD_RET, "ppp", +// addr, real_addr, +// real_addr - vma->vm_start); + } +} + +int uretprobe_event_handler(struct uretprobe_instance *probe, + struct pt_regs *regs, + struct us_ip *ip) +{ + int retval = regs_return_value(regs); + unsigned long addr = (unsigned long)ip->jprobe.up.kp.addr; + + if (ip->got_addr && ip->flag_got == 0) { + send_plt(ip); + ip->flag_got = 1; + } + +#if defined(CONFIG_ARM) + addr = ip->offset & 0x01 ? addr | 0x01 : addr; +#endif + + exit_event(regs); + + return 0; +} +EXPORT_SYMBOL_GPL(uretprobe_event_handler); diff --git a/us_manager/us_def_handler.h b/us_manager/us_def_handler.h new file mode 100644 index 0000000..3628ac0 --- /dev/null +++ b/us_manager/us_def_handler.h @@ -0,0 +1,21 @@ +#ifndef _US_DEF_HANDLER_H +#define _US_DEF_HANDLER_H + +#include + +struct us_ip; +struct pt_regs; +struct uretprobe_instance; + +DECLARE_PER_CPU(struct us_ip *, gpCurIp); +DECLARE_PER_CPU(struct pt_regs *, gpUserRegs); + +unsigned long ujprobe_event_pre_handler(struct us_ip *ip, + struct pt_regs *regs); +void ujprobe_event_handler(unsigned long arg0, unsigned long arg1, + unsigned long arg2, unsigned long arg3, + unsigned long arg4, unsigned long arg5); +int uretprobe_event_handler(struct uretprobe_instance *p, + struct pt_regs *regs, struct us_ip *ip); + +#endif /* _US_DEF_HANDLER_H */ diff --git a/us_manager/us_manager.c b/us_manager/us_manager.c index 05501f8..53ddebc 100644 --- a/us_manager/us_manager.c +++ b/us_manager/us_manager.c @@ -1,7 +1,7 @@ #include -#include -#include -#include +#include +#include +#include #include #include "pf/proc_filters.h" diff --git a/us_manager/us_slot_manager.c b/us_manager/us_slot_manager.c index 0131223..3f96b35 100644 --- a/us_manager/us_slot_manager.c +++ b/us_manager/us_slot_manager.c @@ -28,7 +28,7 @@ static unsigned long alloc_user_pages(struct task_struct *task, unsigned long le } // FIXME: its seems to be bad decision to replace 'current' pointer temporarily current_thread_info()->task = task; - ret = do_mmap_pgoff(NULL, 0, len, prot, flags, 0); + ret = do_mmap(NULL, 0, len, prot, flags, 0); current_thread_info()->task = otask; if (!atomic) { downgrade_write (&mm->mmap_sem); @@ -79,7 +79,7 @@ struct slot_manager *create_sm_us(struct task_struct *task) sm->slot_size = UPROBES_TRAMP_LEN; sm->alloc = sm_alloc_us; sm->free = sm_free_us; - INIT_HLIST_NODE(&sm->page_list); + INIT_HLIST_HEAD(&sm->page_list); sm->data = task; return sm; -- 2.7.4