mirror of
https://github.com/cemu-project/idapython.git
synced 2024-11-25 02:26:55 +01:00
1258fab948
- IDA Pro 6.2 support - added set_idc_func_ex(): it is now possible to add new IDC functions using Python - added visit_patched_bytes() (see ex_patch.py) - added support for the multiline text input control in the Form class - added support for the editable/readonly dropdown list control in the Form class - added execute_sync() to register a function call into the UI message queue - added execute_ui_requests() / check ex_uirequests.py - added add_hotkey() / del_hotkey() to bind Python methods to hotkeys - added register_timer()/unregister_timer(). Check ex_timer.py - added the IDC (Arrays) netnode manipulation layer into idc.py - added idautils.Structs() and StructMembers() generator functions - removed the "Run Python Statement" menu item. IDA now has a unified dialog. Use RunPlugin("python", 0) to invoke it manually. - better error messages for script plugins, loaders and processor modules - bugfix: Dbg_Hooks.dbg_run_to() was receiving wrong input - bugfix: A few Enum related functions were not properly working in idc.py - bugfix: GetIdaDirectory() and GetProcessName() were broken in idc.py - bugfix: idaapi.get_item_head() / idc.ItemHead() were not working
108 lines
3.5 KiB
Python
108 lines
3.5 KiB
Python
#---------------------------------------------------------------------
|
|
# Debug notification hook test
|
|
#
|
|
# This script start the executable and steps through the first five
|
|
# instructions. Each instruction is disassembled after execution.
|
|
#
|
|
# Original Author: Gergely Erdelyi <gergely.erdelyi@d-dome.net>
|
|
#
|
|
# Maintained By: IDAPython Team
|
|
#
|
|
#---------------------------------------------------------------------
|
|
from idaapi import *
|
|
|
|
class MyDbgHook(DBG_Hooks):
|
|
""" Own debug hook class that implementd the callback functions """
|
|
|
|
def dbg_process_start(self, pid, tid, ea, name, base, size):
|
|
print("Process started, pid=%d tid=%d name=%s" % (pid, tid, name))
|
|
|
|
def dbg_process_exit(self, pid, tid, ea, code):
|
|
print("Process exited pid=%d tid=%d ea=0x%x code=%d" % (pid, tid, ea, code))
|
|
|
|
def dbg_library_unload(self, pid, tid, ea, info):
|
|
print("Library unloaded: pid=%d tid=%d ea=0x%x info=%s" % (pid, tid, ea, info))
|
|
return 0
|
|
|
|
def dbg_process_attach(self, pid, tid, ea, name, base, size):
|
|
print("Process attach pid=%d tid=%d ea=0x%x name=%s base=%x size=%x" % (pid, tid, ea, name, base, size))
|
|
|
|
def dbg_process_detach(self, pid, tid, ea):
|
|
print("Process detached, pid=%d tid=%d ea=0x%x" % (pid, tid, ea))
|
|
return 0
|
|
|
|
def dbg_library_load(self, pid, tid, ea, name, base, size):
|
|
print "Library loaded: pid=%d tid=%d name=%s base=%x" % (pid, tid, name, base)
|
|
|
|
def dbg_bpt(self, tid, ea):
|
|
print "Break point at 0x%x pid=%d" % (ea, tid)
|
|
# return values:
|
|
# -1 - to display a breakpoint warning dialog
|
|
# if the process is suspended.
|
|
# 0 - to never display a breakpoint warning dialog.
|
|
# 1 - to always display a breakpoint warning dialog.
|
|
return 0
|
|
|
|
def dbg_suspend_process(self):
|
|
print "Process suspended"
|
|
|
|
def dbg_exception(self, pid, tid, ea, exc_code, exc_can_cont, exc_ea, exc_info):
|
|
print("Exception: pid=%d tid=%d ea=0x%x exc_code=0x%x can_continue=%d exc_ea=0x%x exc_info=%s" % (
|
|
pid, tid, ea, exc_code & idaapi.BADADDR, exc_can_cont, exc_ea, exc_info))
|
|
# return values:
|
|
# -1 - to display an exception warning dialog
|
|
# if the process is suspended.
|
|
# 0 - to never display an exception warning dialog.
|
|
# 1 - to always display an exception warning dialog.
|
|
return 0
|
|
|
|
def dbg_trace(self, tid, ea):
|
|
print("Trace tid=%d ea=0x%x" % (tid, ea))
|
|
# return values:
|
|
# 1 - do not log this trace event;
|
|
# 0 - log it
|
|
return 0
|
|
|
|
def dbg_step_into(self):
|
|
print("Step into")
|
|
self.dbg_step_over()
|
|
|
|
def dbg_run_to(self, pid, tid=0, ea=0):
|
|
print "Runto: tid=%d" % tid
|
|
idaapi.continue_process()
|
|
|
|
|
|
def dbg_step_over(self):
|
|
eip = GetRegValue("EIP")
|
|
print("0x%x %s" % (eip, GetDisasm(eip)))
|
|
|
|
self.steps += 1
|
|
if self.steps >= 5:
|
|
request_exit_process()
|
|
else:
|
|
request_step_over()
|
|
|
|
|
|
# Remove an existing debug hook
|
|
try:
|
|
if debughook:
|
|
print("Removing previous hook ...")
|
|
debughook.unhook()
|
|
except:
|
|
pass
|
|
|
|
# Install the debug hook
|
|
debughook = MyDbgHook()
|
|
debughook.hook()
|
|
debughook.steps = 0
|
|
|
|
# Stop at the entry point
|
|
ep = GetLongPrm(INF_START_IP)
|
|
request_run_to(ep)
|
|
|
|
# Step one instruction
|
|
request_step_over()
|
|
|
|
# Start debugging
|
|
run_requests()
|