예제 #1
0
def new_proc(pid, pgd, name):
    '''
	Process creation callback. Receives 3 parameters:
		:param pid: The pid of the process
		:type pid: int
		:param pgd: The PGD of the process
		:type pgd: int
		:param name: The name of the process
		:type name: str
	'''
    global pyrebox_print
    global procs_created
    global target_procname
    global cm
    global pgd_target
    global process_is_created

    pyrebox_print("New process created! pid: %x, pgd: %x, name: %s" %
                  (pid, pgd, name))
    procs_created += 1
    # For instance, we can start the shell whenever a process is created
    if target_procname != "" and target_procname.lower() in name.lower():
        pgd_target = pgd
        # At this point, the process has been created, but
        # the main module (and dlls) have not been loaded yet.
        # We put a callback on the context changes, and wait for
        # the process to start executing.
        process_is_created = 1
        # set monitor to target process
        api.start_monitoring_process(pgd_target)
        cm.add_callback(CallbackManager.CONTEXTCHANGE_CB,
                        functools.partial(context_change, pgd, name),
                        name="context_change")
예제 #2
0
 def __new_process_callback(self, params):
     """
         Called by the callback manager when a new process is created.
     """
     pid = params["pid"]
     pgd = params["pgd"]
     name = params["name"]
     try:
         # If we already have a running agent, ignore it
         if self.__status < GuestAgentPlugin.__AGENT_RUNNING:
             # Use only the first 8 characters since the name could be truncated
             if name is not None and name != "" and name in self.__agent_filename:
                 self.__agent_pgd = pgd
                 # Monitor context change to check we can get the base address
                 # for the process main module
                 self.__cb.add_callback(api.CallbackManager.CONTEXTCHANGE_CB, functools.partial(
                     self.__context_change_callback, pgd, name), name="context_change_guest_agent")
                 self.__cb.add_callback(
                     api.CallbackManager.OPCODE_RANGE_CB, self.__opcode_range_callback,
                     name="host_file_plugin_opcode_range",
                     start_opcode=0x13f,
                     end_opcode=0x13f)
                 api.start_monitoring_process(pgd)
                 self.__status = GuestAgentPlugin.__AGENT_RUNNING
     except Exception as e:
         self.__printer("Exception occurred on create process callback: %s" % str(e))
예제 #3
0
def module_entry_point(params):
    '''
        Callback on the entry point of the main module being monitored
    '''
    global cm
    global entry_point_bp
    from api import CallbackManager
    import api

    # Get pameters
    cpu_index = params["cpu_index"]
    cpu = params["cpu"]

    # Disable the entrypoint
    entry_point_bp.disable()

    # Get running process
    pgd = api.get_running_process(cpu_index)

    # Start monitoring process
    api.start_monitoring_process(pgd)

    pyrebox_print("Started monitoring process")

    # Call all our internal callbacks
    for cb in entry_point_callbacks:
        cb(params)
예제 #4
0
 def __new_process_callback(self, params):
     """
         Called by the callback manager when a new process is created.
     """
     pid = params["pid"]
     pgd = params["pgd"]
     name = params["name"]
     try:
         # If we already have a running agent, ignore it
         if self.__status < GuestAgentPlugin.__AGENT_RUNNING:
             # Use only the first 8 characters since the name could be truncated
             if name is not None and name != "" and name in self.__agent_filename:
                 self.__agent_pgd = pgd
                 # Monitor context change to check we can get the base address
                 # for the process main module
                 self.__cb.add_callback(api.CallbackManager.CONTEXTCHANGE_CB, functools.partial(
                     self.__context_change_callback, pgd, name), name="context_change_guest_agent")
                 self.__cb.add_callback(
                     api.CallbackManager.OPCODE_RANGE_CB, self.__opcode_range_callback,
                     name="host_file_plugin_opcode_range",
                     start_opcode=0x13f,
                     end_opcode=0x13f)
                 api.start_monitoring_process(pgd)
                 self.__status = GuestAgentPlugin.__AGENT_RUNNING
     except Exception as e:
         self.__printer("Exception occurred on create process callback: %s" % str(e))
예제 #5
0
def mw_monitor_start_monitoring_process(new_proc, insert_proc=True):
    '''
        This function sets up all the callbacks and structures
        necessary to monitor a process.

        :param new_proc: The process to start monitoring as a instance of Process
        :type new_proc: Process

        :param insert_proc: (Optional) Whether to insert the process in the list of
                            monitored processes (internal to this script).
        :type insert_proc: bool
    '''
    from coverage import block_executed
    from api_tracer import apitracer_start_monitoring_process
    from dumper import dumper_start_monitoring_process
    from api import CallbackManager
    import api

    # Insert the process, if necessary
    if insert_proc:
        mwmon.data.procs.append(new_proc)
    # Start monitoring the process
    api.start_monitoring_process(new_proc.get_pgd())
    mwmon.printer("Started monitoring process with PGD %x and name %s" %
                  (new_proc.get_pgd(), new_proc.get_proc_name()))

    # coverage module
    # Create a callback and trigger for each process
    if mwmon.coverage and (mwmon.coverage_procs is None
                           or new_proc.proc_name in mwmon.coverage_procs):
        mwmon.cm.add_callback(CallbackManager.BLOCK_BEGIN_CB,
                              functools.partial(block_executed, proc=new_proc),
                              name="block_begin_coverage_%d" %
                              new_proc.proc_num)
        mwmon.cm.add_trigger("block_begin_coverage_%d" % new_proc.proc_num,
                             "triggers/trigger_block_user_only_coverage.so")
        mwmon.cm.set_trigger_var(
            "block_begin_coverage_%d" % (new_proc.proc_num), "cr3",
            new_proc.get_pgd())
        mwmon.cm.set_trigger_var(
            "block_begin_coverage_%d" % (new_proc.proc_num), "proc_num",
            new_proc.proc_num)
        # Output file name, with pid
        mwmon.cm.set_trigger_var(
            "block_begin_coverage_%d" % (new_proc.proc_num), "log_name",
            mwmon.coverage_log_name + ".%x" % (new_proc.pid))

    # api tracer module
    if mwmon.api_tracer and (mwmon.api_tracer_procs is None
                             or new_proc.proc_name in mwmon.api_tracer_procs):
        apitracer_start_monitoring_process(new_proc)

    # dumper module
    if mwmon.dumper:
        dumper_start_monitoring_process(new_proc)

    mwmon.cm.add_callback(CallbackManager.CONTEXTCHANGE_CB,
                          functools.partial(context_change, new_proc,
                                            new_proc.get_proc_name()),
                          name="context_change_%x" % new_proc.get_pgd())
예제 #6
0
def module_entry_point(params):
    '''
        Callback on the entry point of the main module being monitored
    '''
    global cm
    global UNPACKER_LOG_PATH
    global UNPACKER_DUMP_PATH
    global pyrebox_print
    global ntdll_space

    from api import CallbackManager
    import api

    # Get pameters
    cpu_index = params["cpu_index"]
    cpu = params["cpu"]

    # Get running process
    pgd = api.get_running_process(cpu_index)

    pyrebox_print("Reached entry point of new process: %x" % pgd)

    # Add memory write / memory execute callbacks, and their triggers
    cm.add_callback(CallbackManager.MEM_WRITE_CB,
                    mem_write,
                    name="mem_write_%x" % pgd)
    cm.add_callback(CallbackManager.BLOCK_BEGIN_CB,
                    block_exec,
                    name="block_begin_%x" % pgd)

    cm.add_trigger("mem_write_%x" % pgd, "triggers/trigger_memwrite_wx.so")
    cm.set_trigger_var("mem_write_%x" % pgd, "begin", 0x0)
    if TARGET_LONG_SIZE == 4:
        cm.set_trigger_var("mem_write_%x" % pgd, "end", 0x80000000)
    else:
        cm.set_trigger_var("mem_write_%x" % pgd, "end", 0x000007FFFFFFFFFF)
    cm.set_trigger_var("mem_write_%x" % pgd, "pgd", pgd)

    cm.add_trigger("block_begin_%x" % pgd, "triggers/trigger_blockbegin_wx.so")
    cm.set_trigger_var("block_begin_%x" % pgd, "begin", 0x0)
    if TARGET_LONG_SIZE == 4:
        cm.set_trigger_var("block_begin_%x" % pgd, "end", 0x80000000)
    else:
        cm.set_trigger_var("block_begin_%x" % pgd, "end", 0x000007FFFFFFFFFF)
    cm.set_trigger_var("block_begin_%x" % pgd, "pgd", pgd)

    # Start monitoring process
    api.start_monitoring_process(pgd)

    # Create a dump, on process entry point for every process
    generate_dump(pgd, "Dump at process entry point for PGD 0x%x" % pgd)

    # Get the address space for ntdll
    for mod in api.get_module_list(pgd):
        if "ntdll.dll" in mod["name"].lower():
            ntdll_space = (mod["base"], mod["size"])
예제 #7
0
def mw_monitor_start_monitoring_process(new_proc, insert_proc=True):
    '''
        This function sets up all the callbacks and structures
        necessary to monitor a process.

        :param new_proc: The process to start monitoring as a instance of Process
        :type new_proc: Process

        :param insert_proc: (Optional) Whether to insert the process in the list of
                            monitored processes (internal to this script).
        :type insert_proc: bool
    '''
    from coverage import block_executed
    from api_tracer import apitracer_start_monitoring_process
    from dumper import dumper_start_monitoring_process
    from api import CallbackManager
    import api

    # Insert the process, if necessary
    if insert_proc:
        mwmon.data.procs.append(new_proc)
    # Start monitoring the process
    api.start_monitoring_process(new_proc.get_pgd())
    mwmon.printer("Started monitoring process with PGD %x and name %s" %
                  (new_proc.get_pgd(),
                   new_proc.get_proc_name()))

    # coverage module
    # Create a callback and trigger for each process
    if mwmon.coverage and (mwmon.coverage_procs is None or new_proc.proc_name in mwmon.coverage_procs):
        mwmon.cm.add_callback(CallbackManager.BLOCK_BEGIN_CB, functools.partial(
            block_executed, proc=new_proc), name="block_begin_coverage_%d" % new_proc.proc_num)
        mwmon.cm.add_trigger("block_begin_coverage_%d" %
                             new_proc.proc_num, "triggers/trigger_block_user_only_coverage.so")
        mwmon.cm.set_trigger_var("block_begin_coverage_%d" %
                                 (new_proc.proc_num), "cr3", new_proc.get_pgd())
        mwmon.cm.set_trigger_var("block_begin_coverage_%d" %
                                 (new_proc.proc_num), "proc_num", new_proc.proc_num)
        # Output file name, with pid
        mwmon.cm.set_trigger_var("block_begin_coverage_%d" %
                                 (new_proc.proc_num), "log_name", mwmon.coverage_log_name + ".%x" % (new_proc.pid))

    # api tracer module
    if mwmon.api_tracer and (mwmon.api_tracer_procs is None or new_proc.proc_name in mwmon.api_tracer_procs):
        apitracer_start_monitoring_process(new_proc)

    # dumper module
    if mwmon.dumper:
        dumper_start_monitoring_process(new_proc)        

    mwmon.cm.add_callback(CallbackManager.CONTEXTCHANGE_CB,
                          functools.partial(context_change, new_proc, new_proc.get_proc_name()),
                          name="context_change_%x" % new_proc.get_pgd())
예제 #8
0
def ep_hit(cpu_index, cpu):
    global target_pgd
    api.start_monitoring_process(target_pgd)
    simbols = api.get_symbol_list(target_pgd)
    for sim in simbols:
        if sim["name"] == "GetDiskFreeSpaceExW" or sim[
                "name"] == "GetDiskFreeSpaceExA":
            pyrebox_print("found! %s" % sim["addr"])
            cm.add_callback(CallbackManager.INSN_BEGIN_CB,
                            GetFreeSpaceCalled,
                            addr=sim["addr"],
                            pgd=target_pgd)
    start_shell()
예제 #9
0
def new_process_created(pid, pgd, name):
    global process_is_created
    global cm
    global target_pgd
    global sample_name
    global pyrebox_print

    if name == sample_name:
        target_pgd = pgd

        process_is_created = 1
        pyrebox_print("[*] Process created")
        api.start_monitoring_process(target_pgd)
        cm.add_callback(CallbackManager.CONTEXTCHANGE_CB,
                        functools.partial(context_change, pgd, name),
                        name="context_change")
        cm.rm_callback("vmi_new_proc")
예제 #10
0
def module_entry_point(params):
    '''
        Callback on the entry point of the main module being monitored
    '''
    global cm
    global entry_point_bp
    global UNPACKER_LOG_PATH
    global UNPACKER_DUMP_PATH

    from api import CallbackManager
    import api

    # Get pameters
    cpu_index = params["cpu_index"]
    cpu = params["cpu"]

    # Get running process
    pgd = api.get_running_process(cpu_index)

    # Add memory write / memory execute callbacks, and their triggers
    cm.add_callback(CallbackManager.MEM_WRITE_CB, mem_write, name="mem_write")
    cm.add_callback(CallbackManager.BLOCK_BEGIN_CB,
                    block_exec,
                    name="block_begin")

    cm.add_trigger("mem_write", "triggers/trigger_memwrite_wx.so")
    cm.set_trigger_var("mem_write", "begin", 0x0)
    if TARGET_LONG_SIZE == 4:
        cm.set_trigger_var("mem_write", "end", 0x80000000)
    else:
        cm.set_trigger_var("mem_write", "end", 0x000007FFFFFFFFFF)
    cm.set_trigger_var("mem_write", "pgd", pgd)

    cm.add_trigger("block_begin", "triggers/trigger_blockbegin_wx.so")
    cm.set_trigger_var("block_begin", "begin", 0x0)
    if TARGET_LONG_SIZE == 4:
        cm.set_trigger_var("block_begin", "end", 0x80000000)
    else:
        cm.set_trigger_var("block_begin", "end", 0x000007FFFFFFFFFF)
    cm.set_trigger_var("block_begin", "pgd", pgd)

    # Start monitoring process
    api.start_monitoring_process(pgd)

    pyrebox_print("Started monitoring process")
def new_proc(pid, pgd, name):
    global cm
    global target_procname
    global pyrebox_print
    import api
    if target_procname is not None and target_procname in name.lower():
        pyrebox_print("Started monitoring process %s" % name)
        cm.add_trigger("mem_write", "triggers/trigger_memwrite_wx.so")
        cm.set_trigger_var("mem_write", "begin", 0x0)
        cm.set_trigger_var("mem_write", "end", 0x80000000)
        cm.set_trigger_var("mem_write", "pgd", pgd)

        cm.add_trigger("block_begin", "triggers/trigger_blockbegin_wx.so")
        cm.set_trigger_var("block_begin", "begin", 0x0)
        cm.set_trigger_var("block_begin", "end", 0x80000000)
        cm.set_trigger_var("block_begin", "pgd", pgd)

        api.start_monitoring_process(pgd)
예제 #12
0
def new_proc(params):
    global cm
    global target_procname
    global target_pgd
    global pyrebox_print
    import api

    pid = params["pid"]
    pgd = params["pgd"]
    name = params["name"]

    if target_procname is not None and target_procname in name.lower():
        pyrebox_print("Started monitoring process %s" % name)

        cm.add_trigger(
            "block_begin",
            "exploit_detect/trigger_block_begin_shellcode_detect.so")
        cm.set_trigger_var("block_begin", "pgd", pgd)
        cm.set_trigger_var("block_begin", "shift", 0x1000)

        api.start_monitoring_process(pgd)
        target_pgd = pgd
예제 #13
0
def module_entry_point(params):
    '''
        Callback on the entry point of the main module being monitored
    '''
    global cm
    global entry_point_bp
    from api import CallbackManager
    import api
    import functools
    from ipython_shell import start_shell

    # Get pameters
    cpu_index = params["cpu_index"]
    cpu = params["cpu"]

    # Disable the entrypoint
    entry_point_bp.disable()

    # Get running process
    pgd = api.get_running_process(cpu_index)

    #E8 cw   CALL rel16  Call near, relative, displacement relative to next instruction
    #E8 cd   CALL rel32  Call near, relative, displacement relative to next instruction
    #FF /2   CALL r/m16  Call near, absolute indirect, address given in r/m16
    #FF /2   CALL r/m32  Call near, absolute indirect, address given in r/m32
    #9A cd   CALL ptr16:16   Call far, absolute, address given in operand
    #9A cp   CALL ptr16:32   Call far, absolute, address given in operand
    #FF /3   CALL m16:16 Call far, absolute indirect, address given in m16:16
    #FF /3   CALL m16:32 Call far, absolute indirect, address given in m16:32

    cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                    functools.partial(opcode_range, "call_e8"),
                    name="call_e8",
                    start_opcode=0xE8,
                    end_opcode=0xE8)
    cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                    functools.partial(opcode_range, "call_ff"),
                    name="call_ff",
                    start_opcode=0xFF,
                    end_opcode=0xFF)
    cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                    functools.partial(opcode_range, "call_9a"),
                    name="call_9a",
                    start_opcode=0x9A,
                    end_opcode=0x9A)

    #C3 RET NP Valid Valid Near return to calling procedure.
    #CB RET NP Valid Valid Far return to calling procedure.
    #C2 iw RET imm16 I Valid Valid Near return to calling procedure and pop imm16 bytes from stack.
    #CA iw RET imm16 I Valid Valid Far return to calling procedure and pop imm16 bytes from stack.

    cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                    functools.partial(opcode_range, "ret_c3"),
                    name="ret_c3",
                    start_opcode=0xC3,
                    end_opcode=0xC3)
    cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                    functools.partial(opcode_range, "ret_cb"),
                    name="ret_cb",
                    start_opcode=0xCB,
                    end_opcode=0xCB)
    cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                    functools.partial(opcode_range, "ret_c2"),
                    name="ret_c2",
                    start_opcode=0xC2,
                    end_opcode=0xC2)
    cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                    functools.partial(opcode_range, "ret_ca"),
                    name="ret_ca",
                    start_opcode=0xCA,
                    end_opcode=0xCA)

    cm.add_trigger("call_e8", "exploit_detect/trigger_shadow_stack.so")
    cm.set_trigger_var("call_e8", "pgd", pgd)
    cm.set_trigger_var("call_e8", "thread_independent", 0)

    cm.add_trigger("call_ff", "exploit_detect/trigger_shadow_stack.so")
    cm.set_trigger_var("call_ff", "pgd", pgd)
    cm.set_trigger_var("call_ff", "thread_independent", 0)

    cm.add_trigger("call_9a", "exploit_detect/trigger_shadow_stack.so")
    cm.set_trigger_var("call_9a", "pgd", pgd)
    cm.set_trigger_var("call_9a", "thread_independent", 0)

    cm.add_trigger("ret_c3", "exploit_detect/trigger_shadow_stack.so")
    cm.set_trigger_var("ret_c3", "pgd", pgd)
    cm.set_trigger_var("ret_c3", "thread_independent", 0)

    cm.add_trigger("ret_cb", "exploit_detect/trigger_shadow_stack.so")
    cm.set_trigger_var("ret_cb", "pgd", pgd)
    cm.set_trigger_var("ret_cb", "thread_independent", 0)

    cm.add_trigger("ret_c2", "exploit_detect/trigger_shadow_stack.so")
    cm.set_trigger_var("ret_c2", "pgd", pgd)
    cm.set_trigger_var("ret_c2", "thread_independent", 0)

    cm.add_trigger("ret_ca", "exploit_detect/trigger_shadow_stack.so")
    cm.set_trigger_var("ret_ca", "pgd", pgd)
    cm.set_trigger_var("ret_ca", "thread_independent", 0)

    pyrebox_print("Started monitoring process")

    # Start monitoring process
    api.start_monitoring_process(pgd)
예제 #14
0
def module_entry_point(params):
    '''
        Callback on the entry point of the main module being monitored
    '''
    global APITRACER_ANTI_STOLEN
    global APITRACER_ENABLE_JMP
    global APITRACER_ENABLE_RET

    global cm
    global pyrebox_print
    import os
    from api import CallbackManager
    import api
    from interproc import interproc_data

    # Get pameters
    cpu_index = params["cpu_index"]
    cpu = params["cpu"]

    # Get running process
    pgd = api.get_running_process(cpu_index)

    new_proc = interproc_data.get_process_by_pgd(pgd)

    pid = new_proc.get_pid()

    pyrebox_print("Initializing API tracer for process %x" % pgd)

    cb_func = functools.partial(opcodes, proc=new_proc)

    #E8 cw   CALL rel16  Call near, relative, displacement relative to next instruction
    #E8 cd   CALL rel32  Call near, relative, displacement relative to next instruction
    #FF /2   CALL r/m16  Call near, absolute indirect, address given in r/m16
    #FF /2   CALL r/m32  Call near, absolute indirect, address given in r/m32
    #9A cd   CALL ptr16:16   Call far, absolute, address given in operand
    #9A cp   CALL ptr16:32   Call far, absolute, address given in operand
    #FF /3   CALL m16:16 Call far, absolute indirect, address given in m16:16
    #FF /3   CALL m16:32 Call far, absolute indirect, address given in m16:32

    cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                    functools.partial(cb_func, cb_name="call_e8_%x" % pid),
                    name="call_e8_%x" % pid,
                    start_opcode=0xE8,
                    end_opcode=0xE8)
    cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                    functools.partial(cb_func, cb_name="call_ff_%x" % pid),
                    name="call_ff_%x" % pid,
                    start_opcode=0xFF,
                    end_opcode=0xFF)
    cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                    functools.partial(cb_func, cb_name="call_9a_%x" % pid),
                    name="call_9a_%x" % pid,
                    start_opcode=0x9A,
                    end_opcode=0x9A)

    cm.add_trigger("call_e8_%x" % pid,
                   "mw_monitor2/trigger_jmp_call_ret_tracer.so")
    cm.set_trigger_var("call_e8_%x" % pid, "pgd", pgd)
    cm.set_trigger_var("call_e8_%x" % pid, "enable_ff_jmp",
                       1 if APITRACER_ENABLE_JMP else 0)

    cm.add_trigger("call_ff_%x" % pid,
                   "mw_monitor2/trigger_jmp_call_ret_tracer.so")
    cm.set_trigger_var("call_ff_%x" % pid, "pgd", pgd)
    cm.set_trigger_var("call_ff_%x" % pid, "enable_ff_jmp",
                       1 if APITRACER_ENABLE_JMP else 0)

    cm.add_trigger("call_9a_%x" % pid,
                   "mw_monitor2/trigger_jmp_call_ret_tracer.so")
    cm.set_trigger_var("call_9a_%x" % pid, "pgd", pgd)
    cm.set_trigger_var("call_9a_%x" % pid, "enable_ff_jmp",
                       1 if APITRACER_ENABLE_JMP else 0)

    #C3 RET NP Valid Valid Near return to calling procedure.
    #CB RET NP Valid Valid Far return to calling procedure.
    #C2 iw RET imm16 I Valid Valid Near return to calling procedure and pop imm16 bytes from stack.
    #CA iw RET imm16 I Valid Valid Far return to calling procedure and pop imm16 bytes from stack.

    if APITRACER_ENABLE_RET:
        cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                        functools.partial(cb_func, cb_name="ret_c3_%x" % pid),
                        name="ret_c3_%x" % pid,
                        start_opcode=0xC3,
                        end_opcode=0xC3)
        cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                        functools.partial(cb_func, cb_name="ret_cb_%x" % pid),
                        name="ret_cb_%x" % pid,
                        start_opcode=0xCB,
                        end_opcode=0xCB)
        cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                        functools.partial(cb_func, cb_name="ret_c2_%x" % pid),
                        name="ret_c2_%x" % pid,
                        start_opcode=0xC2,
                        end_opcode=0xC2)
        cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                        functools.partial(cb_func, cb_name="ret_ca_%x" % pid),
                        name="ret_ca_%x" % pid,
                        start_opcode=0xCA,
                        end_opcode=0xCA)

        cm.add_trigger("ret_c3_%x" % pid,
                       "mw_monitor2/trigger_jmp_call_ret_tracer.so")
        cm.set_trigger_var("ret_c3_%x" % pid, "pgd", pgd)
        cm.set_trigger_var("ret_c3_%x" % pid, "enable_ff_jmp",
                           1 if APITRACER_ENABLE_JMP else 0)

        cm.add_trigger("ret_cb_%x" % pid,
                       "mw_monitor2/trigger_jmp_call_ret_tracer.so")
        cm.set_trigger_var("ret_cb_%x" % pid, "pgd", pgd)
        cm.set_trigger_var("ret_cb_%x" % pid, "enable_ff_jmp",
                           1 if APITRACER_ENABLE_JMP else 0)

        cm.add_trigger("ret_c2_%x" % pid,
                       "mw_monitor2/trigger_jmp_call_ret_tracer.so")
        cm.set_trigger_var("ret_c2_%x" % pid, "pgd", pgd)
        cm.set_trigger_var("ret_c2_%x" % pid, "enable_ff_jmp",
                           1 if APITRACER_ENABLE_JMP else 0)

        cm.add_trigger("ret_ca_%x" % pid,
                       "mw_monitor2/trigger_jmp_call_ret_tracer.so")
        cm.set_trigger_var("ret_ca_%x" % pid, "pgd", pgd)
        cm.set_trigger_var("ret_ca_%x" % pid, "enable_ff_jmp",
                           1 if APITRACER_ENABLE_JMP else 0)

    #EB cb JMP rel8       Jump short, RIP = RIP + 8-bit displacement sign extended to 64-bits
    #E9 cw JMP rel16      Jump near, relative, displacement relative to next instruction. Not supported in 64-bit mode.
    #E9 cd JMP rel32      Jump near, relative, RIP = RIP + 32-bit displacement sign extended to 64-bits
    #FF /4 JMP r/m16      Jump near, absolute indirect, address = zeroextended r/m16. Not supported in 64-bit mode.
    #FF /4 JMP r/m32      Jump near, absolute indirect, address given in r/m32. Not supported in 64-bit mode.
    #FF /4 JMP r/m64      Jump near, absolute indirect, RIP = 64-Bit offset from register or memory
    #EA cd JMP ptr16:16   Jump far, absolute, address given in operand
    #EA cp JMP ptr16:32   Jump far, absolute, address given in operand
    #FF /5 JMP m16:16     Jump far, absolute indirect, address given in m16:16
    #FF /5 JMP m16:32     Jump far, absolute indirect, address given in m16:32.
    #FF /5 JMP m16:64     Jump far, absolute indirect, address given in m16:64

    if APITRACER_ENABLE_JMP:
        cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                        functools.partial(cb_func, cb_name="jmp_e9_%x" % pid),
                        name="jmp_e9_%x" % pid,
                        start_opcode=0xE9,
                        end_opcode=0xE9)
        cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                        functools.partial(cb_func, cb_name="jmp_ea_%x" % pid),
                        name="jmp_ea_%x" % pid,
                        start_opcode=0xEA,
                        end_opcode=0xEA)
        cm.add_callback(CallbackManager.OPCODE_RANGE_CB,
                        functools.partial(cb_func, cb_name="jmp_eb_%x" % pid),
                        name="jmp_eb_%x" % pid,
                        start_opcode=0xEB,
                        end_opcode=0xEB)

        cm.add_trigger("jmp_e9_%x" % pid,
                       "mw_monitor2/trigger_jmp_call_ret_tracer.so")
        cm.set_trigger_var("jmp_e9_%x" % pid, "pgd", pgd)
        cm.set_trigger_var("jmp_e9_%x" % pid, "enable_ff_jmp",
                           1 if APITRACER_ENABLE_JMP else 0)

        cm.add_trigger("jmp_ea_%x" % pid,
                       "mw_monitor2/trigger_jmp_call_ret_tracer.so")
        cm.set_trigger_var("jmp_ea_%x" % pid, "pgd", pgd)
        cm.set_trigger_var("jmp_ea_%x" % pid, "enable_ff_jmp",
                           1 if APITRACER_ENABLE_JMP else 0)

        cm.add_trigger("jmp_eb_%x" % pid,
                       "mw_monitor2/trigger_jmp_call_ret_tracer.so")
        cm.set_trigger_var("jmp_eb_%x" % pid, "pgd", pgd)
        cm.set_trigger_var("jmp_eb_%x" % pid, "enable_ff_jmp",
                           1 if APITRACER_ENABLE_JMP else 0)

    # Start monitoring process
    api.start_monitoring_process(pgd)