From e8f474b5a4543acfb47c9f6534981c302ddeb419 Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Thu, 11 Apr 2013 16:54:04 +0400 Subject: [PATCH] [REFACTOR] create /un/init_helper() --- driver/probes_manager.c | 32 +++++--------------------------- driver/probes_manager.h | 4 ---- driver/us_proc_inst.c | 41 +++++++++++++++++++++++++++++++++++++---- driver/us_proc_inst.h | 3 +++ 4 files changed, 45 insertions(+), 35 deletions(-) diff --git a/driver/probes_manager.c b/driver/probes_manager.c index 82834c8..41c2492 100644 --- a/driver/probes_manager.c +++ b/driver/probes_manager.c @@ -20,41 +20,18 @@ #include "module.h" #include "probes_manager.h" -unsigned long pf_addr; -unsigned long cp_addr; -unsigned long mr_addr; -unsigned long unmap_addr; - int probes_manager_init (void) { + int ret; #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) spin_lock_init(&ec_spinlock); spin_lock_init(&ec_probe_spinlock); #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ - pf_addr = swap_ksyms("do_page_fault"); - if (pf_addr == 0) { - EPRINTF("Cannot find address for page fault function!"); - return -EINVAL; - } - - cp_addr = swap_ksyms("copy_process"); - if (cp_addr == 0) { - EPRINTF("Cannot find address for copy_process function!"); - return -EINVAL; - } - mr_addr = swap_ksyms("mm_release"); - if (mr_addr == 0) { - EPRINTF("Cannot find address for mm_release function!"); - return -EINVAL; - } - - unmap_addr = swap_ksyms("do_munmap"); - if (unmap_addr == 0) { - EPRINTF("Cannot find address for do_munmap function!"); - return -EINVAL; - } + ret = init_helper(); + if (ret) + return ret; return storage_init (); } @@ -63,6 +40,7 @@ void probes_manager_down (void) { detach_selected_probes (); + uninit_helper(); storage_down (); } diff --git a/driver/probes_manager.h b/driver/probes_manager.h index b96f466..0586d1d 100644 --- a/driver/probes_manager.h +++ b/driver/probes_manager.h @@ -48,10 +48,6 @@ int install_kern_otg_probe(unsigned long addr, unsigned long jp_handler, unsigned long rp_handler); -extern unsigned long pf_addr; -extern unsigned long cp_addr; -extern unsigned long mr_addr; -extern unsigned long unmap_addr; #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) extern spinlock_t ec_probe_spinlock; #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ diff --git a/driver/us_proc_inst.c b/driver/us_proc_inst.c index be9c198..0969457 100644 --- a/driver/us_proc_inst.c +++ b/driver/us_proc_inst.c @@ -391,13 +391,49 @@ int install_otg_ip(unsigned long addr, } EXPORT_SYMBOL_GPL(install_otg_ip); +int init_helper(void) +{ + unsigned long addr; + addr = swap_ksyms("do_page_fault"); + if (addr == 0) { + EPRINTF("Cannot find address for page fault function!"); + return -EINVAL; + } + pf_kretprobe.kp.addr = (kprobe_opcode_t *)addr; + + addr = swap_ksyms("copy_process"); + if (addr == 0) { + EPRINTF("Cannot find address for copy_process function!"); + return -EINVAL; + } + cp_kretprobe.kp.addr = (kprobe_opcode_t *)addr; + + addr = swap_ksyms("mm_release"); + if (addr == 0) { + EPRINTF("Cannot find address for mm_release function!"); + return -EINVAL; + } + mr_jprobe.kp.addr = (kprobe_opcode_t *)addr; + + addr = swap_ksyms("do_munmap"); + if (addr == 0) { + EPRINTF("Cannot find address for do_munmap function!"); + return -EINVAL; + } + unmap_jprobe.kp.addr = (kprobe_opcode_t *)addr; + + return 0; +} + +void uninit_helper(void) +{ +} static int register_helper_ks_probes(void) { int ret = 0; /* install jprobe on 'do_munmap' to detect when for remove user space probes */ - unmap_jprobe.kp.addr = unmap_addr; ret = dbi_register_jprobe(&unmap_jprobe); if (ret) { EPRINTF("dbi_register_jprobe(do_munmap) result=%d!", ret); @@ -405,7 +441,6 @@ static int register_helper_ks_probes(void) } /* install jprobe on 'mm_release' to detect when for remove user space probes */ - mr_jprobe.kp.addr = mr_addr; ret = dbi_register_jprobe(&mr_jprobe); if (ret != 0) { EPRINTF("dbi_register_jprobe(mm_release) result=%d!", ret); @@ -414,7 +449,6 @@ static int register_helper_ks_probes(void) /* install kretprobe on 'copy_process' */ - cp_kretprobe.kp.addr = cp_addr; ret = dbi_register_kretprobe(&cp_kretprobe); if (ret) { EPRINTF("dbi_register_kretprobe(copy_process) result=%d!", ret); @@ -422,7 +456,6 @@ static int register_helper_ks_probes(void) } /* install kretprobe on 'do_page_fault' to detect when they will be loaded */ - pf_kretprobe.kp.addr = pf_addr; ret = dbi_register_kretprobe(&pf_kretprobe); if (ret) { EPRINTF("dbi_register_kretprobe(do_page_fault) result=%d!", ret); diff --git a/driver/us_proc_inst.h b/driver/us_proc_inst.h index cb3faa8..a42254a 100644 --- a/driver/us_proc_inst.h +++ b/driver/us_proc_inst.h @@ -24,6 +24,9 @@ #include // struct sigpending #include "sspt/ip.h" +int init_helper(void); +void uninit_helper(void); + /* Instruments or schedules pending instrumentation of user space process. */ extern int inst_usr_space_proc (void); extern int deinst_usr_space_proc (void); -- 2.7.4