mirror of
https://github.com/cemu-project/idapython.git
synced 2024-11-27 19:44:18 +01:00
IDAPython 1.5.2
- added ui_term/ui_save/ui_saved/ui_get_ea_hint UI notifications - added ph_get_operand_info() to retrieve operand information while debugging - added PteDump.py script - some code refactoring - bugfix: idaapi.netnode.getblob() was limited to MAXSPECSIZE - bugfix: idc.GetString()/idaapi.get_ascii_contents()/idautils.Strings() were limited to MAXSTR string length - bugfix: idaapi.del_menu_item() was failing to delete some menu items - bugfix: dbg_bpt was called instead of dbg_trace for a DBG_Hooks class implementation (old bug from 0.9.x) - bugfix: Form.GetControlValue() was not working with numeric controls - bugfix: SetBptCnd() was broken - bugfix: idaapi.get_func_cmt() was memory leaking
This commit is contained in:
parent
88aa875c55
commit
f5ec434bf7
@ -43,9 +43,9 @@ Make sure all the needed tools (compiler, swig) are on the PATH.
|
|||||||
idapython/ - IDAPython source code
|
idapython/ - IDAPython source code
|
||||||
|
|
||||||
2. On Mac OS X copy libida.dylib from the IDA install directory to
|
2. On Mac OS X copy libida.dylib from the IDA install directory to
|
||||||
swigsdk-versions/x.y/lib/gcc32.mac/
|
swigsdk-versions/x.y/lib/x86_mac_gcc_32/
|
||||||
and libida64.dylib to
|
and libida64.dylib to
|
||||||
swigsdk-versions/x.y/lib/gcc64.mac/
|
swigsdk-versions/x.y/lib/x86_mac_gcc_64/
|
||||||
|
|
||||||
3. Build the plugin
|
3. Build the plugin
|
||||||
|
|
||||||
|
14
CHANGES.txt
14
CHANGES.txt
@ -1,6 +1,20 @@
|
|||||||
Please see http://code.google.com/p/idapython/source/list for a detailed list of changes.
|
Please see http://code.google.com/p/idapython/source/list for a detailed list of changes.
|
||||||
|
|
||||||
|
|
||||||
|
Changes from version 1.5.1 to 1.5.2
|
||||||
|
------------------------------------
|
||||||
|
- added ui_term/ui_save/ui_saved/ui_get_ea_hint UI notifications
|
||||||
|
- added ph_get_operand_info() to retrieve operand information while debugging
|
||||||
|
- added PteDump.py script
|
||||||
|
- some code refactoring
|
||||||
|
- bugfix: idaapi.netnode.getblob() was limited to MAXSPECSIZE
|
||||||
|
- bugfix: idc.GetString()/idaapi.get_ascii_contents()/idautils.Strings() were limited to MAXSTR string length
|
||||||
|
- bugfix: idaapi.del_menu_item() was failing to delete some menu items
|
||||||
|
- bugfix: dbg_bpt was called instead of dbg_trace for a DBG_Hooks class implementation (old bug from 0.9.x)
|
||||||
|
- bugfix: Form.GetControlValue() was not working with numeric controls
|
||||||
|
- bugfix: SetBptCnd() was broken
|
||||||
|
- bugfix: idaapi.get_func_cmt() was memory leaking
|
||||||
|
|
||||||
Changes from version 1.5.0 to 1.5.1
|
Changes from version 1.5.0 to 1.5.1
|
||||||
------------------------------------
|
------------------------------------
|
||||||
- Introduced the CLI '?' pseudo-command to retrieve doc strings
|
- Introduced the CLI '?' pseudo-command to retrieve doc strings
|
||||||
|
2
build.py
2
build.py
@ -36,7 +36,7 @@ else:
|
|||||||
# IDAPython version
|
# IDAPython version
|
||||||
VERSION_MAJOR = 1
|
VERSION_MAJOR = 1
|
||||||
VERSION_MINOR = 5
|
VERSION_MINOR = 5
|
||||||
VERSION_PATCH = 1
|
VERSION_PATCH = 2
|
||||||
|
|
||||||
# Determine Python version
|
# Determine Python version
|
||||||
PYTHON_MAJOR_VERSION = int(platform.python_version()[0])
|
PYTHON_MAJOR_VERSION = int(platform.python_version()[0])
|
||||||
|
@ -22,7 +22,41 @@ class MyUiHook(idaapi.UI_Hooks):
|
|||||||
def postprocess(self):
|
def postprocess(self):
|
||||||
print("IDA finished processing command: %s" % self.cmdname)
|
print("IDA finished processing command: %s" % self.cmdname)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
def saving(self):
|
||||||
|
"""
|
||||||
|
The kernel is saving the database.
|
||||||
|
|
||||||
|
@return: Ignored
|
||||||
|
"""
|
||||||
|
print("Saving....")
|
||||||
|
|
||||||
|
def saved(self):
|
||||||
|
"""
|
||||||
|
The kernel has saved the database.
|
||||||
|
|
||||||
|
@return: Ignored
|
||||||
|
"""
|
||||||
|
print("Saved")
|
||||||
|
|
||||||
|
def term(self):
|
||||||
|
"""
|
||||||
|
IDA is terminated and the database is already closed.
|
||||||
|
The UI may close its windows in this callback.
|
||||||
|
|
||||||
|
This callback is best used with a plugin_t with flags PLUGIN_FIX
|
||||||
|
"""
|
||||||
|
print("IDA terminated")
|
||||||
|
|
||||||
|
def get_ea_hint(self, ea):
|
||||||
|
"""
|
||||||
|
The UI wants to display a simple hint for an address in the navigation band
|
||||||
|
|
||||||
|
@param ea: The address
|
||||||
|
@return: String with the hint or None
|
||||||
|
"""
|
||||||
|
print("get_ea_hint(%x)" % ea)
|
||||||
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
# Remove an existing hook on second run
|
# Remove an existing hook on second run
|
||||||
|
@ -93,6 +93,9 @@ PyObject *PyW_TryImportModule(const char *name);
|
|||||||
// Tries to get an attribute and swallows the exception if it fails and returns NULL
|
// Tries to get an attribute and swallows the exception if it fails and returns NULL
|
||||||
PyObject *PyW_TryGetAttrString(PyObject *py_var, const char *attr);
|
PyObject *PyW_TryGetAttrString(PyObject *py_var, const char *attr);
|
||||||
|
|
||||||
|
// Returns the linked object (void *) from a PyObject
|
||||||
|
void *pyobj_get_clink(PyObject *pyobj);
|
||||||
|
|
||||||
// Converts a Python number (LONGLONG or normal integer) to an IDC variable (VT_LONG or VT_INT64)
|
// Converts a Python number (LONGLONG or normal integer) to an IDC variable (VT_LONG or VT_INT64)
|
||||||
bool PyW_GetNumberAsIDC(PyObject *py_var, idc_value_t *idc_var);
|
bool PyW_GetNumberAsIDC(PyObject *py_var, idc_value_t *idc_var);
|
||||||
|
|
||||||
@ -160,6 +163,9 @@ bool PyW_PyListToIntVec(PyObject *py_list, intvec_t &intvec);
|
|||||||
// Returns a reference to a class
|
// Returns a reference to a class
|
||||||
PyObject *get_idaapi_attr(const char *attr);
|
PyObject *get_idaapi_attr(const char *attr);
|
||||||
|
|
||||||
|
// Returns a reference to a class by its ID
|
||||||
|
PyObject *get_idaapi_attr_by_id(const int class_id);
|
||||||
|
|
||||||
// notify_when()
|
// notify_when()
|
||||||
bool pywraps_nw_term();
|
bool pywraps_nw_term();
|
||||||
bool pywraps_nw_notify(int slot, ...);
|
bool pywraps_nw_notify(int slot, ...);
|
||||||
|
1073
swig/idaapi.i
1073
swig/idaapi.i
File diff suppressed because it is too large
Load Diff
62
swig/idp.i
62
swig/idp.i
@ -847,37 +847,37 @@ public:
|
|||||||
return unhook_from_notification_point(HT_IDB, IDB_Callback, this);
|
return unhook_from_notification_point(HT_IDB, IDB_Callback, this);
|
||||||
}
|
}
|
||||||
// Hook functions to override in Python
|
// Hook functions to override in Python
|
||||||
virtual int byte_patched(ea_t ea) { return 0; };
|
virtual int byte_patched(ea_t /*ea*/) { return 0; };
|
||||||
virtual int cmt_changed(ea_t, bool repeatable_cmt) { return 0; };
|
virtual int cmt_changed(ea_t, bool /*repeatable_cmt*/) { return 0; };
|
||||||
virtual int ti_changed(ea_t ea, const type_t *type, const p_list *fnames) { msg("ti_changed hook not supported yet\n"); return 0; };
|
virtual int ti_changed(ea_t /*ea*/, const type_t * /*type*/, const p_list * /*fnames*/) { msg("ti_changed hook not supported yet\n"); return 0; };
|
||||||
virtual int op_ti_changed(ea_t ea, int n, const type_t *type, const p_list *fnames) { msg("op_ti_changed hook not supported yet\n"); return 0; };
|
virtual int op_ti_changed(ea_t /*ea*/, int /*n*/, const type_t * /*type*/, const p_list * /*fnames*/) { msg("op_ti_changed hook not supported yet\n"); return 0; };
|
||||||
virtual int op_type_changed(ea_t ea, int n) { return 0; };
|
virtual int op_type_changed(ea_t /*ea*/, int /*n*/) { return 0; };
|
||||||
virtual int enum_created(enum_t id) { return 0; };
|
virtual int enum_created(enum_t /*id*/) { return 0; };
|
||||||
virtual int enum_deleted(enum_t id) { return 0; };
|
virtual int enum_deleted(enum_t /*id*/) { return 0; };
|
||||||
virtual int enum_bf_changed(enum_t id) { return 0; };
|
virtual int enum_bf_changed(enum_t /*id*/) { return 0; };
|
||||||
virtual int enum_renamed(enum_t id) { return 0; };
|
virtual int enum_renamed(enum_t /*id*/) { return 0; };
|
||||||
virtual int enum_cmt_changed(enum_t id) { return 0; };
|
virtual int enum_cmt_changed(enum_t /*id*/) { return 0; };
|
||||||
virtual int enum_member_created(enum_t id, const_t cid) { return 0; };
|
virtual int enum_member_created(enum_t /*id*/, const_t cid) { return 0; };
|
||||||
virtual int enum_member_deleted(enum_t id, const_t cid) { return 0; };
|
virtual int enum_member_deleted(enum_t /*id*/, const_t cid) { return 0; };
|
||||||
virtual int struc_created(tid_t struc_id) { return 0; };
|
virtual int struc_created(tid_t /*struc_id*/) { return 0; };
|
||||||
virtual int struc_deleted(tid_t struc_id) { return 0; };
|
virtual int struc_deleted(tid_t /*struc_id*/) { return 0; };
|
||||||
virtual int struc_renamed(struc_t *sptr) { return 0; };
|
virtual int struc_renamed(struc_t * /*sptr*/) { return 0; };
|
||||||
virtual int struc_expanded(struc_t *sptr) { return 0; };
|
virtual int struc_expanded(struc_t * /*sptr*/) { return 0; };
|
||||||
virtual int struc_cmt_changed(tid_t struc_id) { return 0; };
|
virtual int struc_cmt_changed(tid_t /*struc_id*/) { return 0; };
|
||||||
virtual int struc_member_created(struc_t *sptr, member_t *mptr) { return 0; };
|
virtual int struc_member_created(struc_t * /*sptr*/, member_t * /*mptr*/) { return 0; };
|
||||||
virtual int struc_member_deleted(struc_t *sptr, tid_t member_id) { return 0; };
|
virtual int struc_member_deleted(struc_t * /*sptr*/, tid_t /*member_id*/) { return 0; };
|
||||||
virtual int struc_member_renamed(struc_t *sptr, member_t *mptr) { return 0; };
|
virtual int struc_member_renamed(struc_t * /*sptr*/, member_t * /*mptr*/) { return 0; };
|
||||||
virtual int struc_member_changed(struc_t *sptr, member_t *mptr) { return 0; };
|
virtual int struc_member_changed(struc_t * /*sptr*/, member_t * /*mptr*/) { return 0; };
|
||||||
virtual int thunk_func_created(func_t *pfn) { return 0; };
|
virtual int thunk_func_created(func_t * /*pfn*/) { return 0; };
|
||||||
virtual int func_tail_appended(func_t *pfn, func_t *tail) { return 0; };
|
virtual int func_tail_appended(func_t * /*pfn*/, func_t * /*tail*/) { return 0; };
|
||||||
virtual int func_tail_removed(func_t *pfn, ea_t tail_ea) { return 0; };
|
virtual int func_tail_removed(func_t * /*pfn*/, ea_t /*tail_ea*/) { return 0; };
|
||||||
virtual int tail_owner_changed(func_t *tail, ea_t owner_func) { return 0; };
|
virtual int tail_owner_changed(func_t * /*tail*/, ea_t /*owner_func*/) { return 0; };
|
||||||
virtual int func_noret_changed(func_t *pfn) { return 0; };
|
virtual int func_noret_changed(func_t * /*pfn*/) { return 0; };
|
||||||
virtual int segm_added(segment_t *s) { return 0; };
|
virtual int segm_added(segment_t * /*s*/) { return 0; };
|
||||||
virtual int segm_deleted(ea_t startEA) { return 0; };
|
virtual int segm_deleted(ea_t /*startEA*/) { return 0; };
|
||||||
virtual int segm_start_changed(segment_t *s) { return 0; };
|
virtual int segm_start_changed(segment_t * /*s*/) { return 0; };
|
||||||
virtual int segm_end_changed(segment_t *s) { return 0; };
|
virtual int segm_end_changed(segment_t * /*s*/) { return 0; };
|
||||||
virtual int segm_moved(ea_t from, ea_t to, asize_t size) { return 0; };
|
virtual int segm_moved(ea_t /*from*/, ea_t /*to*/, asize_t /*size*/) { return 0; };
|
||||||
};
|
};
|
||||||
|
|
||||||
//</inline(py_idp)>
|
//</inline(py_idp)>
|
||||||
|
@ -109,6 +109,7 @@ void refresh_lists(void)
|
|||||||
|
|
||||||
%inline %{
|
%inline %{
|
||||||
//<inline(py_kernwin)>
|
//<inline(py_kernwin)>
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
static PyObject *py_choose_idasgn()
|
static PyObject *py_choose_idasgn()
|
||||||
@ -435,7 +436,39 @@ class UI_Hooks(object):
|
|||||||
|
|
||||||
@return: Ignored
|
@return: Ignored
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def saving(self):
|
||||||
|
"""
|
||||||
|
The kernel is saving the database.
|
||||||
|
|
||||||
|
@return: Ignored
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def saved(self):
|
||||||
|
"""
|
||||||
|
The kernel has saved the database.
|
||||||
|
|
||||||
|
@return: Ignored
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_ea_hint(self, ea):
|
||||||
|
"""
|
||||||
|
The UI wants to display a simple hint for an address in the navigation band
|
||||||
|
|
||||||
|
@param ea: The address
|
||||||
|
@return: String with the hint or None
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def term(self):
|
||||||
|
"""
|
||||||
|
IDA is terminated and the database is already closed.
|
||||||
|
The UI may close its windows in this callback.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
#</pydoc>
|
#</pydoc>
|
||||||
*/
|
*/
|
||||||
@ -464,6 +497,22 @@ public:
|
|||||||
virtual void postprocess()
|
virtual void postprocess()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void saving()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void saved()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void term()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual PyObject *get_ea_hint(ea_t /*ea*/)
|
||||||
|
{
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -798,6 +847,37 @@ int idaapi UI_Callback(void *ud, int notification_code, va_list va)
|
|||||||
case ui_postprocess:
|
case ui_postprocess:
|
||||||
proxy->postprocess();
|
proxy->postprocess();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ui_saving:
|
||||||
|
proxy->saving();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ui_saved:
|
||||||
|
proxy->saved();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ui_term:
|
||||||
|
proxy->term();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ui_get_ea_hint:
|
||||||
|
{
|
||||||
|
ea_t ea = va_arg(va, ea_t);
|
||||||
|
char *buf = va_arg(va, char *);
|
||||||
|
size_t sz = va_arg(va, size_t);
|
||||||
|
char *_buf;
|
||||||
|
Py_ssize_t _len;
|
||||||
|
|
||||||
|
PyObject *py_str = proxy->get_ea_hint(ea);
|
||||||
|
if ( py_str != NULL
|
||||||
|
&& PyString_Check(py_str)
|
||||||
|
&& PyString_AsStringAndSize(py_str, &_buf, &_len) != - 1 )
|
||||||
|
{
|
||||||
|
qstrncpy(buf, _buf, qmin(_len, sz));
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Swig::DirectorException &e)
|
catch (Swig::DirectorException &e)
|
||||||
|
25
swig/ua.i
25
swig/ua.i
@ -825,34 +825,13 @@ static void op_t_set_specflag4(PyObject *self, PyObject *value)
|
|||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
insn_t *insn_t_get_clink(PyObject *self)
|
insn_t *insn_t_get_clink(PyObject *self)
|
||||||
{
|
{
|
||||||
// Must have the link attribute
|
return (insn_t *)pyobj_get_clink(self);
|
||||||
if ( !PyObject_HasAttrString(self, S_CLINK_NAME) )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
insn_t *insn;
|
|
||||||
PyObject *attr = PyObject_GetAttrString(self, S_CLINK_NAME);
|
|
||||||
if ( PyCObject_Check(attr) )
|
|
||||||
insn = (insn_t *) PyCObject_AsVoidPtr(attr);
|
|
||||||
else
|
|
||||||
insn = NULL;
|
|
||||||
Py_DECREF(attr);
|
|
||||||
return insn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
op_t *op_t_get_clink(PyObject *self)
|
op_t *op_t_get_clink(PyObject *self)
|
||||||
{
|
{
|
||||||
// Must have the link attribute
|
return (op_t *)pyobj_get_clink(self);
|
||||||
if ( !PyObject_HasAttrString(self, S_CLINK_NAME) )
|
|
||||||
return NULL;
|
|
||||||
op_t *r;
|
|
||||||
PyObject *attr = PyObject_GetAttrString(self, S_CLINK_NAME);
|
|
||||||
if ( PyCObject_Check(attr) )
|
|
||||||
r = (op_t *) PyCObject_AsVoidPtr(attr);
|
|
||||||
else
|
|
||||||
r = NULL;
|
|
||||||
Py_DECREF(attr);
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//</code(py_ua)>
|
//</code(py_ua)>
|
||||||
|
Loading…
Reference in New Issue
Block a user