Example #1
0
static int __init my_init (void)
{
    register_jprobe (&jp);
    printk (KERN_INFO "plant jprobe at %p, handler addr %p\n", jp.kp.addr,
            jp.entry);
    return 0;
}
Example #2
0
static __init int dccpprobe_init(void)
{
    int ret = -ENOMEM;

    init_waitqueue_head(&dccpw.wait);
    spin_lock_init(&dccpw.lock);
    dccpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &dccpw.lock);
    if (IS_ERR(dccpw.fifo))
        return PTR_ERR(dccpw.fifo);

    if (!proc_net_fops_create(procname, S_IRUSR, &dccpprobe_fops))
        goto err0;

    ret = register_jprobe(&dccp_send_probe);
    if (ret)
        goto err1;

    pr_info("DCCP watch registered (port=%d)\n", port);
    return 0;
err1:
    proc_net_remove(procname);
err0:
    kfifo_free(dccpw.fifo);
    return ret;
}
Example #3
0
int kmemchecker_probes_init(void)
{
	int ret;

	my_kmalloc_kretprobe.kp.symbol_name = func_name;
	ret = register_kretprobe(&my_kmalloc_kretprobe);
	if (ret < 0) {
		printk(KERN_INFO "kretprobe failed, returned %d\n",
			ret);
		return -1;
	}

	printk(KERN_INFO "Planted return probe at %s: %p\n",
			my_kmalloc_kretprobe.kp.symbol_name, 
			my_kmalloc_kretprobe.kp.addr);
	ret = register_jprobe(&my_kfree_jprobe);
	if (ret < 0) {
		unregister_kretprobe(&my_kmalloc_kretprobe);
		return -1;
	}
	printk(KERN_INFO "hook kfree\n");

	my_kmem_cache_alloc_kretprobe.kp.symbol_name = "__slab_alloc";
	ret = register_kretprobe(&my_kmem_cache_alloc_kretprobe);
	if (ret < 0) {
		unregister_kretprobe(&my_kmalloc_kretprobe);
		unregister_jprobe(&my_kfree_jprobe);
		return -1;
	}
	printk(KERN_INFO "hook __slab_alloc\n");
	return 0;
}
Example #4
0
static int __init
jprobe_init(void)
{
register_jprobe(&my_jprobe);
printk(KERN_ALERT "plant jprobe at %p, handler addr %p\n",my_jprobe.kp.addr, my_jprobe.entry); 

    return 0;
}
Example #5
0
static __init int init_schk(void)
{
  printk("Hello\n");

  //
  // Settting up kprobes;
  //
  jp.kp.symbol_name = "fb_set_var";
  jp.entry= JPROBE_ENTRY(jp_fb_set_var);
  register_jprobe(&jp);

  jp0.kp.symbol_name = "fb_ioctl";
  jp0.entry= JPROBE_ENTRY(jp_fb_ioctl);
  register_jprobe(&jp0);

  return 0;
}
Example #6
0
static int __init jprobe_sys_mount_init(void)
{
	jprobe_sys_mount.kp.symbol_name = "sys_mount";
	jprobe_sys_mount.entry = (kprobe_opcode_t *) jprobe_sys_mount_handler;
	register_jprobe(&jprobe_sys_mount);
	printk(KERN_INFO "Register %s module\n", module_name(THIS_MODULE));
	return 0;
}
Example #7
0
static int register_hypercall_fi(void)
{
	test_count = 0;
	my_probe.kp.addr = (kprobe_opcode_t *) 0xc01d2d20; //sys_ioctl
	my_probe.entry = (kprobe_opcode_t *)my_handler;
	register_jprobe(&my_probe);
	return 0;
}
Example #8
0
/*
    Module entry point 
    Acquire resources and initialize global variables.
    Resources allocated are:
    1. Allocate circular log buffer
    2. Install hooks on
    2.1 On entry call of free_task
    2.2 On exit call of do_fork
    3. Create a proc file 
*/ 
int probe_processes_init(void)
{
    int iRet              = 0;
    int ijprobe_free_task = -1;
    int iret_do_fork      = -1;
    int iproc_file        = -1;
    trace(DETAIL_LEVEL, "Entering, init_module(); iMaxLineSize=%d, iMaxNbOfLines=%d, iDebugLevel=%d\n", 
        iMaxLineSize, iMaxNbOfLines, iDebugLevel);

    atomic_set(&s_wrOff, 0);
    atomic_set(&s_cnt, 0);

    do {
        // Create circular log buffer
        s_pLog = (char*)kmalloc(iMaxLineSize * iMaxNbOfLines, GFP_KERNEL);
        if(s_pLog == NULL) {
            iRet = -ENOMEM;
            break;
        }
        memset(s_pLog, 0, iMaxLineSize * iMaxNbOfLines);

        // Register hook on the entry of free_task kernel method
        if ((ijprobe_free_task = register_jprobe(&jprobe_free_task)) < 0) {
            trace(ERROR_LEVEL, "register_jprobe(%s) failed, returned %d\n", 
                jprobe_free_task.kp.symbol_name, ijprobe_free_task);
            iRet = ijprobe_free_task;
            break;
        }
        trace(DETAIL_LEVEL, "On call of %s at %p, handler addr %p\n", 
            jprobe_free_task.kp.symbol_name, jprobe_free_task.kp.addr, jprobe_free_task.entry);

        // Register hook on the exit of do_fork kernel method
        if ((iret_do_fork = register_kretprobe(&kret_do_fork)) < 0) {
            trace(ERROR_LEVEL, "register_kretprobe(%s) failed, returned %d\n", 
                kret_do_fork.kp.symbol_name, iret_do_fork);
            iRet = iret_do_fork;
            break;
        }
        trace(DETAIL_LEVEL, "On return of %s at %p, handler addr %p\n", 
            kret_do_fork.kp.symbol_name, kret_do_fork.kp.addr, kret_do_fork.handler);

        // Create a /proc/taskinfo file
        if((iproc_file = CreateProcFile()) < 0) {
            iRet = iproc_file;
            break;
        }
    } while(false);

    // Run clean up code if we fail to acquire any resources.
    if(iRet < 0) {
        ReleaseResources(ijprobe_free_task==0?true:false, iret_do_fork==0?true:false);
    }

    trace(INFO_LEVEL, "Exiting, %d = init_module();\n", iRet);
    return iRet;
}
Example #9
0
static int __init kprobe_init(void)
{
	int ret;

	ret = register_jprobe(&tcp_hook_jp);
	if (ret == 0)
		printk(KERN_INFO "Register tcp hook OK\n");

	return ret;
}
Example #10
0
static int __init tp_init(void)
{
	int ret;

	ret = register_jprobe(&my_jprobe);
	if (ret < 0) {
		printk(KERN_INFO "TP: register_jprobe failed, returned %d\n", ret);
		return -1;
	}
	pr_info("TP: Locked and loaded.\n");
	return 0;
}
static int __init kprobe_init(void)
{
	int ret;
	jp.kp.symbol_name = (char *)probed_func;

	if ((ret = register_jprobe(&jp)) < 0) {
		printk("%s: register_jprobe failed, returned %d\n",
			__FUNCTION__, ret);
		return -1;
	}
	return 0;
}
Example #12
0
int myinit(void)
{
	printk("module_inserted\n");
//	my_probe.kp.addr = (kprobe_opcode_t *)0xc071c9a9;  /*kp.symbol_name  = "ip_rcv"; */
//	my_probe.entry	 = (kprobe_opcode_t *)my_handler;
	my_probe.kp.symbol_name	= "ip_rcv";
	my_probe.entry		= *my_handler;
	printk("registering probe\n");
	register_jprobe(&my_probe);
	printk("register successful");
	//return 0;
}
Example #13
0
int init_module(void)
{
    hid_register_report_probe.entry=(kprobe_opcode_t*)hijack_hid_register_report;
    hid_register_report_probe.kp.addr=(kprobe_opcode_t*)kallsyms_lookup_name("hid_register_report");
    register_jprobe(&hid_register_report_probe);
    printk("HIDHUNTER :: hid_register_report hooked\n");

    hid_add_field_probe.entry=(kprobe_opcode_t*)hijack_hid_add_field;
    hid_add_field_probe.kp.addr=(kprobe_opcode_t*)kallsyms_lookup_name("hid_add_field");
    register_jprobe(&hid_add_field_probe);
    printk("HIDHUNTER :: hid_add_field hooked\n");

    hid_parser_main_probe.entry=(kprobe_opcode_t*)hijack_hid_parser_main;
    hid_parser_main_probe.kp.addr=(kprobe_opcode_t*)kallsyms_lookup_name("hid_parser_main");
    register_jprobe(&hid_parser_main_probe);
    printk("HIDHUNTER :: hid_parser_main hooked\n");

    hid_parser_global_probe.entry=(kprobe_opcode_t*)hijack_hid_parser_global;
    hid_parser_global_probe.kp.addr=(kprobe_opcode_t*)kallsyms_lookup_name("hid_parser_global");
    register_jprobe(&hid_parser_global_probe);
    printk("HIDHUNTER :: hid_parser_global hooked\n");

    hid_parser_local_probe.entry=(kprobe_opcode_t*)hijack_hid_parser_local;
    hid_parser_local_probe.kp.addr=(kprobe_opcode_t*)kallsyms_lookup_name("hid_parser_local");
    register_jprobe(&hid_parser_local_probe);
    printk("HIDHUNTER :: hid_parser_local hooked\n");

    hid_parser_reserved_probe.entry=(kprobe_opcode_t*)hijack_hid_parser_reserved;
    hid_parser_reserved_probe.kp.addr=(kprobe_opcode_t*)kallsyms_lookup_name("hid_parser_reserved");
    register_jprobe(&hid_parser_reserved_probe);
    printk("HIDHUNTER :: hid_parser_reserved hooked\n");

    return 0;
}
static int __init hybla_cong_avoid_jprobe_init(void)
{
	int ret;

	ret = register_jprobe(&hybla_cong_avoid_jprobe);
	if (ret < 0) {
		printk(KERN_INFO "register_jprobe hybla_cong_avoid failed, returned %d\n", ret);
		return -1;
	}
	printk(KERN_INFO "Planted hybla_cong_avoid_jprobe at %p, handler addr %p\n",
	       hybla_cong_avoid_jprobe.kp.addr, hybla_cong_avoid_jprobe.entry);
	return 0;
}
static int __init jprobe_init(void)
{
    int ret;

    ret = register_jprobe(&my_jprobe);
    if (ret < 0) {
        printk(KERN_INFO "register_jprobe failed, returned %d\n", ret);
        return -1;
    }
    printk(KERN_INFO "Planted jprobe at %p, handler addr %p\n",
           my_jprobe.kp.addr, my_jprobe.entry);
    return 0;
}
Example #16
0
static int __init tcp_slow_start_jprobe_init(void)
{
	int ret;

	ret = register_jprobe(&tcp_slow_start_jprobe);
	if (ret < 0) {
		printk(KERN_INFO "register_jprobe tcp_slow_start failed, returned %d\n", ret);
		return -1;
	}
	printk(KERN_INFO "Planted tcp_slow_start_jprobe at %p, handler addr %p\n",
	       tcp_slow_start_jprobe.kp.addr, tcp_slow_start_jprobe.entry);
	return 0;
}
Example #17
0
static int __init jprobe_init(void)
{
	int ret;
	my_jprobe.kp.symbol_name = "do_fork";

	if ((ret = register_jprobe(&my_jprobe)) <0) {
		printk("register_jprobe failed, returned %d\n", ret);
		/* XXX: Exit code is wrong. */
		return -1;
	}
	printk("Planted jprobe at %p, handler addr %p\n",
	    my_jprobe.kp.addr, my_jprobe.entry);
	return 0;
}
Example #18
0
int __init probe_init(struct hook *hooks, struct rhook *rhooks)
{
	int err;
	struct hook *p;
	struct rhook *q;

	p = hooks;
	while (p->funcname) {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
		p->jp.kp.symbol_name = p->funcname;
#else
		p->jp.kp.addr = (void*)kallsyms_lookup_name(p->funcname);
		BUG_ON(!p->jp.kp.addr);
#endif
		p++;
	}
	q = rhooks;
	while (q->funcname) {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
		q->rp.kp.symbol_name = q->funcname;
#else
		q->rp.kp.addr = (void*)kallsyms_lookup_name(q->funcname);
		BUG_ON(!q->rp.kp.addr);
#endif
		q++;
	}

	err = 0;
	p = hooks;
	while (p->funcname && !err) {
		err = register_jprobe(&p->jp);
		p++;
	}
	if (!err) {
		q = rhooks;
		while (q->funcname && !err) {
			err = register_kretprobe(&q->rp);
			q++;
		}
		if (!err)
			return 0;
		while (--q != rhooks)
			unregister_kretprobe(&q->rp);
	}

	while (--p != hooks)
		unregister_jprobe(&p->jp);
	return err;
}
Example #19
0
static int __init lttng_addons_elv_init(void)
{
	int ret;

	(void) wrapper_lttng_fixup_sig(THIS_MODULE);
	ret = register_jprobe(&elv_jprobe);
	if (ret < 0) {
		printk("register_jprobe failed, returned %d\n", ret);
		goto out;
	}

	printk("lttng-elv loaded\n");
out:
	return ret;
}
static int __init addons_lttng_ovs_upcall_end_init(void)
{
	int ret;

//	(void) wrapper_lttng_fixup_sig(THIS_MODULE);
	ret = register_jprobe(&lttng_ovs_upcall_end_jprobe);
	if (ret < 0) {
		printk("register_jprobe failed, returned %d\n", ret);
		goto out;
	}

	printk("lttng-ovs-upcall-end-probe loaded\n");
out:
	return ret;
}
Example #21
0
int init_module(void)
{
	int ret;
	my_jprobe.kp.addr = (kprobe_opcode_t *) kallsyms_lookup_name("do_fork");
	if (!my_jprobe.kp.addr) {
		printk("Couldn't find %s to plant jprobe\n", "do_fork");
		return -1;
	}

	if ((ret = register_jprobe(&my_jprobe)) <0) {
		printk("register_jprobe failed, returned %d\n", ret);
		return -1;
	}
	printk("Planted jprobe at %p, handler addr %p\n",
			my_jprobe.kp.addr, my_jprobe.entry);
	return 0;
}
Example #22
0
static int __init my_init(void)
{
	/* set the handler functions */

	kp.pre_handler = handler_pre;
	kp.post_handler = handler_post;
	kp.fault_handler = handler_fault;
	kp.symbol_name = "mycdrv_generic_open";

	if (register_kprobe(&kp)) {
		pr_info("Failed to register kprobe, quitting\n");
		return -1;
	}
	register_jprobe(&jp);
	pr_info("plant jprobe at %p, handler addr %p\n", jp.kp.addr, jp.entry);
	return 0;
}
int init_module(void)
{
        int ret;
        printk("Entering: %s\n",__FUNCTION__);
        nl_sk_udp=netlink_kernel_create(&init_net, NETLINK_USER, 0, nl_recv_msg_udp, NULL, THIS_MODULE);
        my_jprobe_udp.kp.addr = 
                (kprobe_opcode_t *) kallsyms_lookup_name("udp_sendmsg");
        if (!my_jprobe_udp.kp.addr) {
                 printk("Couldn't find %s to plant jprobe\n", "udp_sendmsg");
                 return -1;
         }
      if ((ret = register_jprobe(&my_jprobe_udp)) <0) {
                 printk("register_jprobe failed, returned %d\n", ret);
                 return -1;
         }
        printk("Planted jprobe at %p, handler addr %p\n",
                 my_jprobe_udp.kp.addr, my_jprobe_udp.entry);
      return 0;
}
Example #24
0
static int __init jprobe_init(void)
{
    int ret;
    int i;

    for (i = 0; i < sizeof(my_jprobes)/sizeof(struct jprobe); ++i) {
        ret = register_jprobe(&my_jprobes[i]);
        if (ret < 0) {
            printk(KERN_INFO "register_jprobe failed, returned %d for probe %d\n", ret, i);
            my_jprobes[i].kp.addr = 0;
            cleanup();
            return -1;
        } else {
            printk(KERN_INFO "Planted jprobe at %p, handler addr %p\n",
                   my_jprobes[i].kp.addr, my_jprobes[i].entry);
        }
    }

    return 0;
}
static int test_jprobe(void)
{
	int ret;

	ret = register_jprobe(&jp);
	if (ret < 0) {
		printk(KERN_ERR "Kprobe smoke test failed: "
				"register_jprobe returned %d\n", ret);
		return ret;
	}

	ret = target(rand1);
	unregister_jprobe(&jp);
	if (jph_val == 0) {
		printk(KERN_ERR "Kprobe smoke test failed: "
				"jprobe handler not called\n");
		handler_errors++;
	}

	return 0;
}
Example #26
0
_STATIC int __init socket_notify_init(void)
{
	int err;

	if ((err = install_hook("IPv4", &inet_family_ops, &hooked_inet_family_ops)))
		return err;
	if ((err = register_jprobe(&inet_sock_destruct_jprobe)) < 0) {
		printk(KERN_ERR "error registering inet_sock_destruct_jprobe\n");
		sock_unregister(hooked_inet_family_ops.family);
		reinstall_family("IPv4", &inet_family_ops);		
		return err;
	}
#if defined(CONFIG_IPV6)
	if ((err = install_hook("IPv6", &inet6_family_ops, &hooked_inet6_family_ops))) {
		unregister_jprobe(&inet_sock_destruct_jprobe);
		sock_unregister(hooked_inet_family_ops.family);
		reinstall_family("IPv4", &inet_family_ops);
		return err;
	}
#endif
	return 0;
}
static int __init jprobe_init(void)
{
	int ret;

	ret = register_jprobe(&my_jprobe);
	if (ret < 0) {
		printk(KERN_INFO "register_jprobe failed, returned %d\n", ret);
		return -1;
	}
	printk(KERN_INFO "Planted jprobe at %p, handler addr %p\n",
	       my_jprobe.kp.addr, my_jprobe.entry);
	

	my_kretprobe.kp.symbol_name = "sys_accept4";
	ret = register_kretprobe(&my_kretprobe);
	if (ret < 0) {
		printk(KERN_INFO "register_kretprobe failed, returned %d\n",
				ret);
		return -1;
	}
	printk(KERN_INFO "Planted return probe at %s: %p\n",
			my_kretprobe.kp.symbol_name, my_kretprobe.kp.addr);

	my_socket_kretprobe.kp.symbol_name = "sys_socket";

	ret = register_kretprobe(&my_socket_kretprobe);
	if (ret < 0) {
		printk(KERN_INFO "register_kretprobe failed, returned %d\n",
				ret);
		return -1;
	}
	printk(KERN_INFO "Planted return probe at %s: %p\n",
			my_socket_kretprobe.kp.symbol_name, my_socket_kretprobe.kp.addr);

	return 0;
}
Example #28
0
static int minit(void)
{
	int err = 0;

	init_hash_parameters();

	if (0 > (err = init_some_parameters()))
		goto out;

	if (0 > (err = alloc_percpu_file()))
		goto err_alloc_file;

	if (0 > (err = alloc_slab()))
		goto err_alloc_slab;

	if (0 > (err = alloc_bitmap()))
		goto err_bitmap;

	if (0 > (err = initial_hash_table_cache()))
		goto err_hash_table_cache;

	printk(KERN_INFO "Start %s.", THIS_MODULE->name);

	if (0 > (err = nf_register_hook(&nf_out_ops))) {
		printk(KERN_ERR "Failed to register nf_out %s.\n", THIS_MODULE->name);
		goto err_nf_reg_out;
	}

	if (0 > (err = nf_register_hook(&nf_in_ops))) {
		printk(KERN_ERR "Failed to register nf_in %s.\n", THIS_MODULE->name);
		goto err_nf_reg_in;
	}    
	
	if (tcp_alloc_sha1sig_pool() == NULL) { 
		printk(KERN_ERR "Failed to alloc sha1 pool %s.\n", THIS_MODULE->name);
		goto err_sha1siq_pool;
	}   

	err = register_jprobe(&jps_netif_receive_skb);
    if (err < 0) {
        printk(KERN_ERR "Failed to register jprobe netif_receive_skb %s.\n", THIS_MODULE->name);
        goto out;
    }
    kprobe_in_reged = 1; 

	goto out;

err_sha1siq_pool:
	tcp_free_sha1sig_pool();
err_nf_reg_in:
	nf_unregister_hook(&nf_in_ops);
err_nf_reg_out:
	nf_unregister_hook(&nf_out_ops);
err_hash_table_cache:
	release_hash_table_cache();
err_bitmap:
	free_bitmap();
err_alloc_slab:
	free_slab();
err_alloc_file:
	free_percpu_file();
out:
	return err;    
}
Example #29
0
static int lkdtm_register_cpoint(enum cname which)
{
	int ret;

	cpoint = CN_INVALID;
	if (lkdtm.entry != NULL)
		unregister_jprobe(&lkdtm);

	switch (which) {
	case CN_DIRECT:
		lkdtm_do_action(cptype);
		return 0;
	case CN_INT_HARDWARE_ENTRY:
		lkdtm.kp.symbol_name = "do_IRQ";
		lkdtm.entry = (kprobe_opcode_t*) jp_do_irq;
		break;
	case CN_INT_HW_IRQ_EN:
		lkdtm.kp.symbol_name = "handle_IRQ_event";
		lkdtm.entry = (kprobe_opcode_t*) jp_handle_irq_event;
		break;
	case CN_INT_TASKLET_ENTRY:
		lkdtm.kp.symbol_name = "tasklet_action";
		lkdtm.entry = (kprobe_opcode_t*) jp_tasklet_action;
		break;
	case CN_FS_DEVRW:
		lkdtm.kp.symbol_name = "ll_rw_block";
		lkdtm.entry = (kprobe_opcode_t*) jp_ll_rw_block;
		break;
	case CN_MEM_SWAPOUT:
		lkdtm.kp.symbol_name = "shrink_inactive_list";
		lkdtm.entry = (kprobe_opcode_t*) jp_shrink_inactive_list;
		break;
	case CN_TIMERADD:
		lkdtm.kp.symbol_name = "hrtimer_start";
		lkdtm.entry = (kprobe_opcode_t*) jp_hrtimer_start;
		break;
	case CN_SCSI_DISPATCH_CMD:
		lkdtm.kp.symbol_name = "scsi_dispatch_cmd";
		lkdtm.entry = (kprobe_opcode_t*) jp_scsi_dispatch_cmd;
		break;
	case CN_IDE_CORE_CP:
#ifdef CONFIG_IDE
		lkdtm.kp.symbol_name = "generic_ide_ioctl";
		lkdtm.entry = (kprobe_opcode_t*) jp_generic_ide_ioctl;
#else
		pr_info("Crash point not available\n");
		return -EINVAL;
#endif
		break;
	default:
		pr_info("Invalid Crash Point\n");
		return -EINVAL;
	}

	cpoint = which;
	if ((ret = register_jprobe(&lkdtm)) < 0) {
		pr_info("Couldn't register jprobe\n");
		cpoint = CN_INVALID;
	}

	return ret;
}
Example #30
0
static int linuxdrv_init(void)
{
    int i;
    
    jprobes[0].kp.symbol_name = "proc_fork_connector";
    jprobes[0].entry = (void*)linuxdrv_finish_fork;
    jprobes[1].kp.symbol_name = "proc_exit_connector";
    jprobes[1].entry = (void*)linuxdrv_finish_exit;
    jprobes[2].kp.symbol_name = "proc_exec_connector";
    jprobes[2].entry = (void*)linuxdrv_finish_exec;
    jprobes[3].kp.symbol_name = "vma_link";
    jprobes[3].entry = (void*)linuxdrv_insert_vma;
    jprobes[4].kp.symbol_name = "vma_adjust";
    jprobes[4].entry = (void*)linuxdrv_adjust_vma;
    jprobes[5].kp.symbol_name = "remove_vma";
    jprobes[5].entry = (void*)linuxdrv_remove_vma;
    

    printk(KERN_INFO 
        "strName = %s\n" /* entry name */
        "init_task_addr  = %lu\n" /* address of init_task */
        "init_task_size  = %lu\n" /* size of task_struct */
        "ts_tasks        = %lu\n" /* offset of tasks */
        "ts_pid          = %lu\n" /* offset of pid */
        "ts_tgid         = %lu\n" /* offset of tgid */
        "ts_group_leader = %lu\n" /* offset of group_leader */
        "ts_thread_group = %lu\n" /* offset of thread_group */
        "ts_real_parent  = %lu\n" /* offset of real_parent */
        "ts_mm           = %lu\n" /* offset of mm */
        "ts_stack        = %lu\n", /* offset of stack */
        UTS_RELEASE,
        (unsigned long)&init_task, 
        (unsigned long)sizeof(init_task),
        OFFSET_OF(task_struct, tasks),
        OFFSET_OF(task_struct, pid), 
        OFFSET_OF(task_struct, tgid),
        OFFSET_OF(task_struct, group_leader),
        OFFSET_OF(task_struct, thread_group),
        OFFSET_OF(task_struct, real_parent),
        OFFSET_OF(task_struct, mm),
        OFFSET_OF(task_struct, stack)  // TODO: not sure which field of the union should be filled
    );

    // cred, real_cred and related fields may not exist in Linux kernel 2.6
    printk(KERN_INFO
        "ts_real_cred    = %lu\n" /* offset of real_cred */
        "ts_cred         = %lu\n" /* offset of cred */
        "ts_comm         = %lu\n" /* offset of comm */
        "cred_uid        = %lu\n" /* offset of uid in cred */
        "cred_gid        = %lu\n" /* offset of gid in cred */
        "cred_euid       = %lu\n" /* offset of euid in cred */
        "cred_egid       = %lu\n", /* offset of egid in cred */
        OFFSET_OF(task_struct, real_cred),
        OFFSET_OF(task_struct, cred),
        OFFSET_OF(task_struct, comm),
        OFFSET_OF(cred, uid),
        OFFSET_OF(cred, gid),
        OFFSET_OF(cred, euid),
        OFFSET_OF(cred, egid)
        );

    printk(KERN_INFO 
        "mm_mmap         = %lu\n" /* offset of mmap in mm_struct */
        "mm_pgd          = %lu\n" /* offset of pgd in mm_struct */
        "mm_arg_start    = %lu\n" /* offset of arg_start in mm_struct */
        "mm_start_brk    = %lu\n" /* offset of start_brk in mm_struct */
        "mm_brk          = %lu\n" /* offset of brk in mm_struct */
        "mm_start_stack  = %lu\n", /* offset of start_stack in mm_struct */
        OFFSET_OF(mm_struct, mmap),
        OFFSET_OF(mm_struct, pgd),
        OFFSET_OF(mm_struct, arg_start),
        OFFSET_OF(mm_struct, start_brk),
        OFFSET_OF(mm_struct, brk),
        OFFSET_OF(mm_struct, start_stack)
        );

    printk(KERN_INFO
        "vma_vm_start    = %lu\n" /* offset of vm_start in vm_area_struct */
        "vma_vm_end      = %lu\n" /* offset of vm_end in vm_area_struct */
        "vma_vm_next     = %lu\n" /* offset of vm_next in vm_area_struct */
        "vma_vm_file     = %lu\n" /* offset of vm_file in vm_area_struct */
        "vma_vm_flags    = %lu\n" /* offset of vm_flags in vm_area_struct */
        "vma_vm_pgoff    = %lu\n", /* offset of vm_pgoff in vm_area_struct */
        OFFSET_OF(vm_area_struct, vm_start),
        OFFSET_OF(vm_area_struct, vm_end),
        OFFSET_OF(vm_area_struct, vm_next),
        OFFSET_OF(vm_area_struct, vm_file),
        OFFSET_OF(vm_area_struct, vm_flags),
        OFFSET_OF(vm_area_struct, vm_pgoff)
        );

    printk(KERN_INFO
        "file_dentry     = %lu\n" /* offset of f_dentry in file */
        "file_inode      = %lu\n" /* inode of file struct */
        "dentry_d_name   = %lu\n" /* offset of d_name in dentry */
        "dentry_d_iname  = %lu\n" /* offset of d_iname in dentry */ 
        "dentry_d_parent = %lu\n" /* offset of d_parent in dentry */
        "ti_task         = %lu\n" /* offset of task in thread_info */
        "inode_ino   = %lu\n", /* offset of inode index in inode struct */
        OFFSET_OF(file, f_dentry),
        OFFSET_OF(dentry, d_inode),
        OFFSET_OF(dentry, d_name),
        OFFSET_OF(dentry, d_iname),
        OFFSET_OF(dentry, d_parent),
        OFFSET_OF(thread_info, task),
        OFFSET_OF(inode,i_ino)
        );


    for(i = 0; i < JPROBE_TOTAL; i++) {
        register_jprobe(&jprobes[i]);
    }
    
    for(i = 0; i < JPROBE_TOTAL; i++)  {
        if(jprobes[i].kp.addr != NULL)  {
            printk(KERN_INFO
            "%s  = %lu\n",
            jprobes[i].kp.symbol_name,
            jprobes[i].kp.addr);
        }
    }

    for(i = 0; i < JPROBE_TOTAL; i++) {
        unregister_jprobe(&jprobes[i]);
    } 
    return -1;
}