1 #include <dbi_kprobes.h>
2 #include <dbi_kprobes_deps.h>
4 #include "us_proc_inst.h"
5 #include "us_slot_manager.h"
12 struct task_struct *check_task(struct task_struct *task);
15 ******************************************************************************
17 ******************************************************************************
24 static int entry_handler_pf(struct kretprobe_instance *ri, struct pt_regs *regs)
26 struct pf_data *data = (struct pf_data *)ri->data;
28 #if defined(CONFIG_X86)
29 data->addr = read_cr2();
30 #elif defined(CONFIG_ARM)
31 data->addr = regs->ARM_r0;
33 #error this architecture is not supported
39 /* Detects when IPs are really loaded into phy mem and installs probes. */
40 static int ret_handler_pf(struct kretprobe_instance *ri, struct pt_regs *regs)
42 struct task_struct *task;
43 unsigned long page_addr;
45 task = current->group_leader;
49 page_addr = ((struct pf_data *)ri->data)->addr & PAGE_MASK;
50 call_page_fault(task, page_addr);
55 static struct kretprobe pf_kretprobe = {
56 .entry_handler = entry_handler_pf,
57 .handler = ret_handler_pf,
58 .data_size = sizeof(struct pf_data)
64 ******************************************************************************
66 ******************************************************************************
69 static void recover_child(struct task_struct *child_task, struct sspt_proc *proc)
71 sspt_proc_uninstall(proc, child_task, US_DISARM);
72 dbi_disarm_urp_inst_for_task(current, child_task);
75 static void rm_uprobes_child(struct task_struct *task)
77 struct sspt_proc *proc = sspt_proc_get_by_task(current);
79 recover_child(task, proc);
83 /* Delete uprobs in children at fork */
84 static int ret_handler_cp(struct kretprobe_instance *ri, struct pt_regs *regs)
86 struct task_struct *task = (struct task_struct *)regs_return_value(regs);
88 if(!task || IS_ERR(task))
91 if(task->mm != current->mm) { /* check flags CLONE_VM */
92 rm_uprobes_child(task);
95 * Ignoring page_addr, because it is
96 * first calling call_page_fault()
98 call_page_fault(task, 0xbadc0de);
104 static struct kretprobe cp_kretprobe = {
105 .handler = ret_handler_cp,
111 ******************************************************************************
113 ******************************************************************************
116 /* Detects when target process removes IPs. */
117 static int mr_pre_handler(struct kprobe *p, struct pt_regs *regs)
119 struct sspt_proc *proc = NULL;
120 struct task_struct *task;
122 #if defined(CONFIG_X86)
123 task = (struct task_struct *)regs->EREG(ax);
124 #elif defined(CONFIG_ARM)
125 task = (struct task_struct *)regs->ARM_r0;
127 #error this architecture is not supported
130 if (is_kthread(task))
133 if (task->tgid != task->pid) {
137 call_mm_release(task);
142 static struct kprobe mr_kprobe = {
143 .pre_handler = mr_pre_handler
149 ******************************************************************************
151 ******************************************************************************
154 static int remove_unmap_probes(struct task_struct *task, struct sspt_proc *proc, unsigned long start, size_t len)
156 struct mm_struct *mm = task->mm;
157 struct vm_area_struct *vma;
159 /* FIXME: not implemented */
162 if ((start & ~PAGE_MASK) || start > TASK_SIZE || len > TASK_SIZE - start) {
166 if ((len = PAGE_ALIGN(len)) == 0) {
170 vma = find_vma(mm, start);
171 if (vma && check_vma(vma)) {
172 struct sspt_file *file;
173 unsigned long end = start + len;
174 struct dentry *dentry = vma->vm_file->f_dentry;
176 file = sspt_proc_find_file(proc, dentry);
178 if (vma->vm_start == start || vma->vm_end == end) {
179 sspt_file_uninstall(file, task, US_UNREGS_PROBE);
182 unsigned long page_addr;
183 struct sspt_page *page;
185 for (page_addr = vma->vm_start; page_addr < vma->vm_end; page_addr += PAGE_SIZE) {
186 page = sspt_find_page_mapped(file, page_addr);
188 sspt_unregister_page(page, US_UNREGS_PROBE, task);
192 if (sspt_file_check_install_pages(file)) {
202 /* Detects when target removes IPs. */
203 static int unmap_pre_handler(struct kprobe *p, struct pt_regs *regs)
206 struct mm_struct *mm;
210 #if defined(CONFIG_X86)
211 mm = (struct mm_struct *)regs->EREG(ax);
212 start = regs->EREG(dx);
213 len = (size_t)regs->EREG(cx);
214 #elif defined(CONFIG_ARM)
215 mm = (struct mm_struct *)regs->ARM_r0;
216 start = regs->ARM_r1;
217 len = (size_t)regs->ARM_r2;
219 #error this architecture is not supported
222 struct sspt_proc *proc = NULL;
223 struct task_struct *task = current;
225 if (is_kthread(task))
228 proc = sspt_proc_get_by_task(task);
230 if (remove_unmap_probes(task, proc, start, len)) {
231 printk("ERROR do_munmap: start=%lx, len=%x\n", start, len);
239 static struct kprobe unmap_kprobe = {
240 .pre_handler = unmap_pre_handler
245 int register_helper(void)
249 /* install kprobe on 'do_munmap' to detect when for remove user space probes */
250 ret = dbi_register_kprobe(&unmap_kprobe);
252 printk("dbi_register_kprobe(do_munmap) result=%d!\n", ret);
256 /* install kprobe on 'mm_release' to detect when for remove user space probes */
257 ret = dbi_register_kprobe(&mr_kprobe);
259 printk("dbi_register_kprobe(mm_release) result=%d!\n", ret);
260 goto unregister_unmap;
264 /* install kretprobe on 'copy_process' */
265 ret = dbi_register_kretprobe(&cp_kretprobe);
267 printk("dbi_register_kretprobe(copy_process) result=%d!\n", ret);
271 /* install kretprobe on 'do_page_fault' to detect when they will be loaded */
272 ret = dbi_register_kretprobe(&pf_kretprobe);
274 printk("dbi_register_kretprobe(do_page_fault) result=%d!\n", ret);
281 dbi_unregister_kretprobe(&cp_kretprobe);
284 dbi_unregister_kprobe(&mr_kprobe, NULL);
287 dbi_unregister_kprobe(&unmap_kprobe, NULL);
292 void unregister_helper(void)
294 /* uninstall kretprobe with 'do_page_fault' */
295 dbi_unregister_kretprobe(&pf_kretprobe);
297 /* uninstall kretprobe with 'copy_process' */
298 dbi_unregister_kretprobe(&cp_kretprobe);
300 /* uninstall kprobe with 'mm_release' */
301 dbi_unregister_kprobe(&mr_kprobe, NULL);
303 /* uninstall kprobe with 'do_munmap' */
304 dbi_unregister_kprobe(&unmap_kprobe, NULL);
307 int init_helper(void)
310 addr = swap_ksyms("do_page_fault");
312 printk("Cannot find address for page fault function!\n");
315 pf_kretprobe.kp.addr = (kprobe_opcode_t *)addr;
317 addr = swap_ksyms("copy_process");
319 printk("Cannot find address for copy_process function!\n");
322 cp_kretprobe.kp.addr = (kprobe_opcode_t *)addr;
324 addr = swap_ksyms("mm_release");
326 printk("Cannot find address for mm_release function!\n");
329 mr_kprobe.addr = (kprobe_opcode_t *)addr;
331 addr = swap_ksyms("do_munmap");
333 printk("Cannot find address for do_munmap function!\n");
336 unmap_kprobe.addr = (kprobe_opcode_t *)addr;
341 void uninit_helper(void)