mirror of
https://github.com/cemu-project/idapython.git
synced 2024-11-27 19:44:18 +01:00
Initial SVN commit of version 0.9.54 sources.
This commit is contained in:
commit
9b85915a48
63
BUILDING.txt
Normal file
63
BUILDING.txt
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
----------------------------------------------------------
|
||||||
|
IDAPython - Python plugin for Interactive Disassembler Pro
|
||||||
|
----------------------------------------------------------
|
||||||
|
Building From Source
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
REQUIREMENTS
|
||||||
|
|
||||||
|
[Tested versions are in brackets]
|
||||||
|
|
||||||
|
- IDA and IDA SDK [5.1]
|
||||||
|
http://www.datarescue.com/idabase/
|
||||||
|
|
||||||
|
- Python [2.4.4, 2.5]
|
||||||
|
http://www.python.org/
|
||||||
|
|
||||||
|
- Simplified Wrapper Interface Generator (SWIG) [1.3.31]
|
||||||
|
SWIG is not needed for regular building, only if you want to tweak the wrappers.
|
||||||
|
http://www.swig.org/
|
||||||
|
|
||||||
|
- Unix utilities (GNU patch on Windows):
|
||||||
|
http://www.research.att.com/sw/tools/uwin/ or
|
||||||
|
http://unxutils.sourceforge.net/ or
|
||||||
|
http://www.cygwin.com/
|
||||||
|
|
||||||
|
- GCC on Linux and Mac OS X [4.0]
|
||||||
|
Comes with your distribution
|
||||||
|
|
||||||
|
- Microsoft Visual C on Windows [Microsoft Visual C++ 2005 Express Edition]
|
||||||
|
http://msdn.microsoft.com/vstudio/express/visualc/
|
||||||
|
|
||||||
|
|
||||||
|
BUILDING
|
||||||
|
|
||||||
|
Make sure all the needed tools (compiler, make, swig, etc) are on the
|
||||||
|
PATH.
|
||||||
|
|
||||||
|
1, Unpack the IDAPython source and IDA Pro SDK into the following
|
||||||
|
directory structure:
|
||||||
|
|
||||||
|
swigsdk-versions/5.1/ - version 5.0 of the IDA Pro SDK
|
||||||
|
idapython/ - IDAPython source code
|
||||||
|
|
||||||
|
2, Patch the SDK using GNU Patch with one of patches from patches/ directory.
|
||||||
|
You will have to use the -P option depending on which directory you
|
||||||
|
patch from.
|
||||||
|
|
||||||
|
2, Build the plugin
|
||||||
|
|
||||||
|
python build.py
|
||||||
|
|
||||||
|
It is possible to build the plugin for different Python versions by
|
||||||
|
running build.py with the corresponding Python binary.
|
||||||
|
|
||||||
|
3, Install the components as described in README.txt
|
||||||
|
|
||||||
|
See build.py for build details and tweak opportunities.
|
||||||
|
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Copyright (c) 2004-2007 Gergely Erdelyi <dyce@d-dome.net>. All rights reserved.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
72
CHANGES.txt
Normal file
72
CHANGES.txt
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
Changes from version 0.9.0 to 0.9.53
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
- Upgraded IDA Pro base version to 5.1
|
||||||
|
- Experimental Mac OS X support
|
||||||
|
- Improved IDC coverage
|
||||||
|
- Cleanups and fixes
|
||||||
|
|
||||||
|
|
||||||
|
Changes from version 0.8.0 to 0.9.0
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
- Upgraded base version to IDA Pro 5.0
|
||||||
|
- Works with IDA Pro 5.1
|
||||||
|
- Python 2.4 and 2.5 supported
|
||||||
|
- Close to complete IDC compatbility layer (in sync with 4.9)
|
||||||
|
- Significatnly improved IDA SDK API covergage (see STATUS.txt for details)
|
||||||
|
- IDA SDK patch size reduced to less than half
|
||||||
|
- Simplified installation (plugins.cfg modification not needed)
|
||||||
|
- Evaluation window content is saved over IDA restarts (in the database)
|
||||||
|
- Windows version is built with Microsoft Visual C++ Express Edition
|
||||||
|
- Build makefile replaced with a Python script
|
||||||
|
- Cleanups and small fixes
|
||||||
|
|
||||||
|
|
||||||
|
Changes from version 0.7.0 to 0.8.0
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
- Added support for IDA Pro 4.9
|
||||||
|
- Dropped support for IDA Pro 4.7
|
||||||
|
- NOTE: Windows version is linked against Python 2.4.
|
||||||
|
- New wrappers: search.hpp, dbg.hpp, loader.hpp, diskio.hpp, nalt.hpp
|
||||||
|
- idc.py synced up to IDA 4.8
|
||||||
|
- Added 38 IDC functions
|
||||||
|
- Fixed asklong(), askseg() and askaddr()
|
||||||
|
- Automatically generated cross reference documentation (epydoc)
|
||||||
|
- User-specific init file support (see README,txt)
|
||||||
|
- Deprecated some functions that have direct Python equivalents (see idc.py)
|
||||||
|
- Fixed exception in ScriptBox when invoked empty.
|
||||||
|
- Lots of cleanups and small fixes
|
||||||
|
|
||||||
|
|
||||||
|
Changes from version 0.6.0 to 0.7.0
|
||||||
|
-----------------------------------
|
||||||
|
- Batch execution support (use the option -OIDAPython:yourscript.py)
|
||||||
|
- Added ScriptBox - lists previously run scripts (Hotkey:Alt-7)
|
||||||
|
- Added support for IDA Pro 4.8 (both Linux and Windows)
|
||||||
|
- Dropped support for IDA Pro 4.6 and 4.6SP1 versions
|
||||||
|
- Wrapped the list chooser (see examples/choose.py)
|
||||||
|
- A dozen or so IDC functions added
|
||||||
|
- Lots of char * API calls wrapped
|
||||||
|
- Added Python error handling in the plugin C layer
|
||||||
|
- Bunch of misc small cleanups and fixes
|
||||||
|
- For more details see CHANGES-SWIG.txt and CHANGES-Plugin.txt
|
||||||
|
|
||||||
|
- API CHANGE: {Next|Prev}Function() return BADADDR instead of -1
|
||||||
|
|
||||||
|
|
||||||
|
Changes from version 0.5.0 to 0.6.0
|
||||||
|
-----------------------------------
|
||||||
|
- Added support for IDA Pro 4.7 (both Linux and Windows)
|
||||||
|
- Dropped support for IDA Pro 4.6SP1 beta on Linux
|
||||||
|
- Lots of IDC wrapper additions and fixes:
|
||||||
|
- Added 30+ new wrappers to idc.py
|
||||||
|
- Most Find*, Ask* and Seg* are now wrapped
|
||||||
|
- Fixed broken NextAddr(), PrevAddr(), MakeFunction() and MakeName()
|
||||||
|
- Fixes to the makefile
|
||||||
|
- Cleanups for the idaapi wrapper
|
||||||
|
- Bunch of misc small cleanups and fixes
|
||||||
|
- For more details see CHANGES-SWIG.txt and CHANGES-Plugin.txt
|
||||||
|
|
||||||
|
|
27
COPYING.txt
Normal file
27
COPYING.txt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
Copyright (c) 2004-2007 Gergely Erdelyi <dyce@d-dome.net>. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
3. The name of the author may not be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||||
|
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||||
|
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
|
OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
70
README.txt
Normal file
70
README.txt
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
----------------------------------------------------------
|
||||||
|
IDAPython - Python plugin for Interactive Disassembler Pro
|
||||||
|
----------------------------------------------------------
|
||||||
|
|
||||||
|
WHAT IS IDAPTYHON?
|
||||||
|
|
||||||
|
IDAPython is an IDA plugin which makes it possible to write scripts
|
||||||
|
for IDA in the Python programming language. IDAPython provides full
|
||||||
|
access to both the IDA API and any installed Python module.
|
||||||
|
|
||||||
|
Check the scripts in the examples directory to get an quick glimpse.
|
||||||
|
|
||||||
|
|
||||||
|
AVAILABILITY
|
||||||
|
|
||||||
|
Latest versions of IDAPython are available from
|
||||||
|
|
||||||
|
http://www.d-dome.net/idapython/
|
||||||
|
|
||||||
|
|
||||||
|
INSTALLATION FROM BINARIES
|
||||||
|
|
||||||
|
1, Install Python 2.4 or 2.5 from http://www.python.org/
|
||||||
|
2, Copy the directory python\ to the IDA install directory
|
||||||
|
3. Copy the plugin to the %IDADIR%\plugins\
|
||||||
|
|
||||||
|
|
||||||
|
USAGE
|
||||||
|
|
||||||
|
The plugin has three hotkeys:
|
||||||
|
|
||||||
|
- Run script (Alt-9)
|
||||||
|
- Execute Python statement(s) (Alt-8)
|
||||||
|
- Run previously executed script again (Alt-7)
|
||||||
|
|
||||||
|
Batch mode execution:
|
||||||
|
|
||||||
|
Start IDA with the following command line options:
|
||||||
|
|
||||||
|
-A -OIDAPython:yourscript.py file_to_work_on
|
||||||
|
|
||||||
|
If you want fully unattended execution mode, make sure your script
|
||||||
|
exits with a qexit() call.
|
||||||
|
|
||||||
|
|
||||||
|
User init file:
|
||||||
|
|
||||||
|
You can place your custom settings to a file called 'idapythonrc.py'
|
||||||
|
that should be placed to
|
||||||
|
|
||||||
|
${HOME}/.idapro/
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
C:\Documents and Settings\%USER%\Application Data\Datarescue\IDA Pro
|
||||||
|
|
||||||
|
The user init file is read and executed at the end of the init process.
|
||||||
|
|
||||||
|
|
||||||
|
THANKS
|
||||||
|
|
||||||
|
This project is sponsored by F-Secure Corporation by allowing me to
|
||||||
|
use some company time and resources for development. Please note that
|
||||||
|
F-Secure is only sponsoring the project, the company does not provide
|
||||||
|
any formal support for this software. Questions, comments, bug reports
|
||||||
|
should be directed to the author.
|
||||||
|
|
||||||
|
F-Secure Corporation's website is located at
|
||||||
|
|
||||||
|
http://www.F-Secure.com/
|
72
STATUS.txt
Normal file
72
STATUS.txt
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
Status of the IDC wrapper
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
6 function unimplemented out of 434 (98% coverage):
|
||||||
|
|
||||||
|
rotate_left
|
||||||
|
XRefType
|
||||||
|
SetMemberType
|
||||||
|
GetType
|
||||||
|
GuessType
|
||||||
|
SetType
|
||||||
|
|
||||||
|
|
||||||
|
Status of IDA API wrappers
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
COMPLETE: all possible functions wrapped, no SWIG ifdefs
|
||||||
|
INCOMPLETE: some wrapping or SWIG ifdefs still left
|
||||||
|
EXCLUDED: will not be wrapped
|
||||||
|
|
||||||
|
allins.hpp - COMPLETE
|
||||||
|
area.hpp - INCOMPLETE (SWIGdefs left)
|
||||||
|
auto.hpp - COMPLETE
|
||||||
|
bytes.hpp - INCOMPLETE (no SWIGs, some unwrapped)
|
||||||
|
compress.hpp - EXCLUDED
|
||||||
|
dbg.hpp - INCOMPLETE (SWIGs and lot of fixing to do)
|
||||||
|
demangle.hpp - EXCLUDED
|
||||||
|
diskio.hpp - INCOMPLETE (no SWIGs, some unwrapped)
|
||||||
|
entry.hpp - COMPLETE
|
||||||
|
enum.hpp - INCOMPLETE (no SWIGs, one FIXME)
|
||||||
|
err.h - EXCLUDED
|
||||||
|
exehdr.h - EXCLUDED
|
||||||
|
expr.hpp - INCOMPLETE (wrapped, needs testing)
|
||||||
|
fixup.hpp - COMPLETE
|
||||||
|
fpro.h - EXCLUDED
|
||||||
|
frame.hpp - COMPLETE
|
||||||
|
funcs.hpp - INCOMPLETE (some SWIGs, few FIXMEs)
|
||||||
|
gdl.hpp - EXCLUDED
|
||||||
|
graph.hpp - EXCLUDED
|
||||||
|
help.h - EXCLUDED
|
||||||
|
ida.hpp - INCOMPLETE (SWIGs)
|
||||||
|
idd.hpp - INCOMPLETE (SWIGs)
|
||||||
|
idp.hpp - INCOMPLETE (SWIGs)
|
||||||
|
ieee.h - EXCLUDED
|
||||||
|
intel.hpp - EXCLUDED
|
||||||
|
ints.hpp - INCOMPLETE (SWIGs)
|
||||||
|
kernwin.hpp - INCOMPLETE (SWIGs and lot of fixing to do)
|
||||||
|
lex.hpp - EXCLUDED
|
||||||
|
lines.hpp - INCOMPLETE (few FIXMEs)
|
||||||
|
llong.hpp - EXCLUDED
|
||||||
|
loader.hpp - INCOMPLETE (few FIXMEs)
|
||||||
|
md5.h - EXCLUDED
|
||||||
|
moves.hpp - COMPLETE (some needed SWIGs)
|
||||||
|
nalt.hpp - INCOMPLETE (SWIGs and lot of fixing to do)
|
||||||
|
name.hpp - INCOMPLETE (few FIXMEs)
|
||||||
|
netnode.hpp - INCOMPLETE (not wrapped at all)
|
||||||
|
offset.hpp - COMPLETE
|
||||||
|
prodir.h - EXCLUDED
|
||||||
|
pro.h - COMPLETE (some needed SWIGs)
|
||||||
|
queue.hpp - INCOMPLETE (one FIXME)
|
||||||
|
regex.h - EXCLUDED
|
||||||
|
search.hpp - INCOMPLETE (one FIXME)
|
||||||
|
segment.hpp - INCOMPLETE (no SWIGs, few FIXMEs)
|
||||||
|
sistack.hpp - EXCLUDED
|
||||||
|
srarea.hpp - INCOMPLETE (not wrapped at all)
|
||||||
|
strlist.hpp - COMPLETE
|
||||||
|
struct.hpp - COMPLETE
|
||||||
|
typeinf.hpp - INCOMPLETE (no SWIGs, lot of fixing to do)
|
||||||
|
ua.hpp - INCOMPLETE (SWIGs and lot of fixing to do)
|
||||||
|
va.hpp - EXCLUDED
|
||||||
|
vm.hpp - EXCLUDED
|
||||||
|
xref.hpp - COMPLETE
|
4
basetsd.h
Normal file
4
basetsd.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#ifndef _BASETSD_H
|
||||||
|
#define _BASETSD_H
|
||||||
|
/* Microsoft free compilers seem to lack this file and Python needs it */
|
||||||
|
#endif
|
408
build.py
Normal file
408
build.py
Normal file
@ -0,0 +1,408 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#------------------------------------------------------------
|
||||||
|
# IDAPython - Python plugin for Interactive Disassembler Pro
|
||||||
|
#
|
||||||
|
# Copyright (c) 2004-2007 Gergely Erdelyi <dyce@d-dome.net>
|
||||||
|
#
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# For detailed copyright information see the file COPYING in
|
||||||
|
# the root of the distribution archive.
|
||||||
|
#------------------------------------------------------------
|
||||||
|
# build.py - Custom build script
|
||||||
|
#------------------------------------------------------------
|
||||||
|
import os, sys, platform, types, shutil
|
||||||
|
from distutils import sysconfig
|
||||||
|
|
||||||
|
# Start of user configurable options
|
||||||
|
VERBOSE = True
|
||||||
|
IDA_MAJOR_VERSION = 5
|
||||||
|
IDA_MINOR_VERSION = 1
|
||||||
|
IDA_SDK = ".." + os.sep + "swigsdk-versions" + os.sep + "%d.%d" % (IDA_MAJOR_VERSION, IDA_MINOR_VERSION)
|
||||||
|
# End of user configurable options
|
||||||
|
|
||||||
|
# IDAPython version
|
||||||
|
VERSION_MAJOR = 0
|
||||||
|
VERSION_MINOR = 9
|
||||||
|
VERSION_PATCH = 53
|
||||||
|
|
||||||
|
# Determine Python version
|
||||||
|
PYTHON_MAJOR_VERSION = int(platform.python_version()[0])
|
||||||
|
PYTHON_MINOR_VERSION = int(platform.python_version()[2])
|
||||||
|
|
||||||
|
# Find Python headers
|
||||||
|
PYTHON_INCLUDE_DIRECTORY = sysconfig.get_config_var('INCLUDEPY')
|
||||||
|
|
||||||
|
# Swig command-line parameters
|
||||||
|
SWIG_OPTIONS = '-modern -python -c++ -shadow -D__GNUC__'
|
||||||
|
|
||||||
|
# Common macros for all compilations
|
||||||
|
COMMON_MACROS = [
|
||||||
|
("VER_MAJOR", "%d" % VERSION_MAJOR),
|
||||||
|
("VER_MINOR", "%d" % VERSION_MINOR),
|
||||||
|
("VER_PATCH", "%d" % VERSION_PATCH),
|
||||||
|
"__IDP__",
|
||||||
|
("MAXSTR", "1024"),
|
||||||
|
"USE_DANGEROUS_FUNCTIONS",
|
||||||
|
"USE_STANDARD_FILE_FUNCTIONS" ]
|
||||||
|
|
||||||
|
# Common includes for all compilations
|
||||||
|
COMMON_INCLUDES = [ ".", "swig" ]
|
||||||
|
|
||||||
|
# List files for the binary distribution
|
||||||
|
BINDIST_MANIFEST = [
|
||||||
|
"README.txt",
|
||||||
|
"COPYING.txt",
|
||||||
|
"CHANGES.txt",
|
||||||
|
"STATUS.txt",
|
||||||
|
"python/init.py",
|
||||||
|
"python/idc.py",
|
||||||
|
"python/idautils.py",
|
||||||
|
("idaapi.py", "python"),
|
||||||
|
"docs/notes.txt",
|
||||||
|
"examples/chooser.py",
|
||||||
|
"examples/ex1.idc",
|
||||||
|
"examples/ex1_idaapi.py",
|
||||||
|
"examples/ex1_idautils.py" ]
|
||||||
|
|
||||||
|
# List files for the source distribution (appended to binary list)
|
||||||
|
SRCDIST_MANIFEST = [
|
||||||
|
"BUILDING.txt",
|
||||||
|
"python.cpp",
|
||||||
|
"basetsd.h",
|
||||||
|
"build.py",
|
||||||
|
"swig/auto.i",
|
||||||
|
"swig/bytes.i",
|
||||||
|
"swig/dbg.i",
|
||||||
|
"swig/diskio.i",
|
||||||
|
"swig/entry.i",
|
||||||
|
"swig/enum.i",
|
||||||
|
"swig/expr.i",
|
||||||
|
"swig/fixup.i",
|
||||||
|
"swig/frame.i",
|
||||||
|
"swig/funcs.i",
|
||||||
|
"swig/ida.i",
|
||||||
|
"swig/idaapi.i",
|
||||||
|
"swig/idp.i",
|
||||||
|
"swig/ints.i",
|
||||||
|
"swig/kernwin.i",
|
||||||
|
"swig/lines.i",
|
||||||
|
"swig/loader.i",
|
||||||
|
"swig/moves.i",
|
||||||
|
"swig/nalt.i",
|
||||||
|
"swig/name.i",
|
||||||
|
"swig/offset.i",
|
||||||
|
"swig/pro.i",
|
||||||
|
"swig/queue.i",
|
||||||
|
"swig/search.i",
|
||||||
|
"swig/segment.i",
|
||||||
|
"swig/srarea.i",
|
||||||
|
"swig/strlist.i",
|
||||||
|
"swig/struct.i",
|
||||||
|
"swig/typeconv.i",
|
||||||
|
"swig/typeinf.i",
|
||||||
|
"swig/ua.i",
|
||||||
|
"swig/xref.i",
|
||||||
|
"patches/ida51.patch"
|
||||||
|
]
|
||||||
|
|
||||||
|
# Temporaty build files to remove
|
||||||
|
BUILD_TEMPFILES = [
|
||||||
|
"idaapi.cpp",
|
||||||
|
"idaapi.obj",
|
||||||
|
"idaapi.o",
|
||||||
|
"idaapi.py",
|
||||||
|
"idapython.sln",
|
||||||
|
"idapython.ncb",
|
||||||
|
"python.exp",
|
||||||
|
"python.lib",
|
||||||
|
"python.obj"
|
||||||
|
]
|
||||||
|
|
||||||
|
class BuilderBase:
|
||||||
|
""" Base class for builders """
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def compile(self, source, objectname=None, includes=[], macros=[]):
|
||||||
|
"""
|
||||||
|
Compile the source file
|
||||||
|
"""
|
||||||
|
allmacros = []
|
||||||
|
allmacros.extend(COMMON_MACROS)
|
||||||
|
allmacros.extend(self.basemacros)
|
||||||
|
allmacros.extend(macros)
|
||||||
|
macrostring = self._build_command_string(allmacros, self.macro_delimiter)
|
||||||
|
|
||||||
|
allincludes = []
|
||||||
|
allincludes.extend(COMMON_INCLUDES)
|
||||||
|
allincludes.extend(includes)
|
||||||
|
includestring = self._build_command_string(allincludes, self.include_delimiter)
|
||||||
|
|
||||||
|
if not objectname:
|
||||||
|
objectname = source + self.object_extension
|
||||||
|
|
||||||
|
cmdstring = "%s %s %s %s %s %s" % (self.compiler,
|
||||||
|
self.compiler_parameters,
|
||||||
|
self.compiler_out_string(objectname),
|
||||||
|
self.compiler_in_string(source + self.source_extension),
|
||||||
|
includestring,
|
||||||
|
macrostring)
|
||||||
|
|
||||||
|
if VERBOSE: print cmdstring
|
||||||
|
return os.system(cmdstring)
|
||||||
|
|
||||||
|
|
||||||
|
def link(self, objects, outfile, libpaths=[], libraries=[], extra_parameters=None):
|
||||||
|
""" Link the binary from objects and libraries """
|
||||||
|
cmdstring = "%s %s %s" % (self.linker,
|
||||||
|
self.linker_parameters,
|
||||||
|
self.linker_out_string(outfile))
|
||||||
|
|
||||||
|
for objectfile in objects:
|
||||||
|
cmdstring = "%s %s" % (cmdstring, objectfile + self.object_extension)
|
||||||
|
|
||||||
|
for libpath in libpaths:
|
||||||
|
cmdstring = "%s %s%s" % (cmdstring, self.libpath_delimiter, libpath)
|
||||||
|
|
||||||
|
for library in libraries:
|
||||||
|
cmdstring = "%s %s" % (cmdstring, library)
|
||||||
|
|
||||||
|
if extra_parameters:
|
||||||
|
cmdstring = "%s %s" % (cmdstring, extra_parameters)
|
||||||
|
|
||||||
|
if VERBOSE: print cmdstring
|
||||||
|
return os.system(cmdstring)
|
||||||
|
|
||||||
|
|
||||||
|
def _build_command_string(self, macros, argument_delimiter):
|
||||||
|
macrostring = ""
|
||||||
|
|
||||||
|
for item in macros:
|
||||||
|
if type(item) == types.TupleType:
|
||||||
|
macrostring += '%s%s="%s" ' % (argument_delimiter, item[0], item[1])
|
||||||
|
else:
|
||||||
|
macrostring += '%s%s ' % (argument_delimiter, item)
|
||||||
|
|
||||||
|
return macrostring
|
||||||
|
|
||||||
|
|
||||||
|
class GCCBuilder(BuilderBase):
|
||||||
|
""" Generic GCC compiler class """
|
||||||
|
def __init__(self):
|
||||||
|
self.include_delimiter = "-I"
|
||||||
|
self.macro_delimiter = "-D"
|
||||||
|
self.libpath_delimiter = "-L"
|
||||||
|
self.compiler_parameters = ""
|
||||||
|
self.linker_parameters = "-shared"
|
||||||
|
self.basemacros = [ ]
|
||||||
|
self.compiler = "g++"
|
||||||
|
self.linker = "g++"
|
||||||
|
self.source_extension = ".cpp"
|
||||||
|
self.object_extension = ".o"
|
||||||
|
|
||||||
|
def compiler_in_string(self, filename):
|
||||||
|
return "-c %s" % filename
|
||||||
|
|
||||||
|
def compiler_out_string(self, filename):
|
||||||
|
return "-o %s" % filename
|
||||||
|
|
||||||
|
def linker_out_string(self, filename):
|
||||||
|
return "-o %s" % filename
|
||||||
|
|
||||||
|
|
||||||
|
class MSVCBuilder(BuilderBase):
|
||||||
|
""" Generic GCC compiler class """
|
||||||
|
def __init__(self):
|
||||||
|
self.include_delimiter = "/I"
|
||||||
|
self.macro_delimiter = "/D"
|
||||||
|
self.libpath_delimiter = "/LIBPATH:"
|
||||||
|
self.compiler_parameters = "/nologo /EHsc"
|
||||||
|
self.linker_parameters = "/nologo /dll /export:PLUGIN"
|
||||||
|
self.basemacros = [ "WIN32",
|
||||||
|
"_USRDLL",
|
||||||
|
"__NT__" ]
|
||||||
|
self.compiler = "cl"
|
||||||
|
self.linker = "link"
|
||||||
|
self.source_extension = ".cpp"
|
||||||
|
self.object_extension = ".obj"
|
||||||
|
|
||||||
|
def compiler_in_string(self, filename):
|
||||||
|
return "/c %s" % filename
|
||||||
|
|
||||||
|
def compiler_out_string(self, filename):
|
||||||
|
return "/Fo%s" % filename
|
||||||
|
|
||||||
|
def linker_out_string(self, filename):
|
||||||
|
return "/out:%s" % filename
|
||||||
|
|
||||||
|
|
||||||
|
def build_distribution(manifest, distrootdir):
|
||||||
|
""" Create dist tree and copy files to it """
|
||||||
|
|
||||||
|
# Remove the previous distibution if exits
|
||||||
|
if os.path.exists(distrootdir):
|
||||||
|
shutil.rmtree(distrootdir)
|
||||||
|
|
||||||
|
# Create output directory
|
||||||
|
os.makedirs(distrootdir)
|
||||||
|
|
||||||
|
# Copy files, one by one
|
||||||
|
for f in manifest:
|
||||||
|
if type(f) == types.TupleType:
|
||||||
|
srcfilepath = f[0]
|
||||||
|
srcfilename = os.path.basename(srcfilepath)
|
||||||
|
dstdir = distrootdir + os.sep + f[1]
|
||||||
|
dstfilepath = dstdir + os.sep + srcfilename
|
||||||
|
else:
|
||||||
|
srcfilepath = f
|
||||||
|
srcfilename = os.path.basename(f)
|
||||||
|
srcdir = os.path.dirname(f)
|
||||||
|
|
||||||
|
if srcdir == "":
|
||||||
|
dstdir = distrootdir
|
||||||
|
else:
|
||||||
|
dstdir = distrootdir + os.sep + srcdir
|
||||||
|
|
||||||
|
if not os.path.exists(dstdir):
|
||||||
|
os.makedirs(dstdir)
|
||||||
|
|
||||||
|
dstfilepath = dstdir + os.sep + srcfilename
|
||||||
|
|
||||||
|
shutil.copyfile(srcfilepath, dstfilepath)
|
||||||
|
|
||||||
|
|
||||||
|
def build_plugin(system, idasdkdir):
|
||||||
|
""" Build the plugin from the SWIG wrapper and plugin main source """
|
||||||
|
|
||||||
|
# Find IDA SDK headers
|
||||||
|
ida_include_directory = idasdkdir + os.sep + "include"
|
||||||
|
|
||||||
|
# Platform-specific settings for the Linux build
|
||||||
|
if system == "Linux":
|
||||||
|
builder = GCCBuilder()
|
||||||
|
plugin_name = "python.plx"
|
||||||
|
platform_macros = [ "__LINUX__" ]
|
||||||
|
python_libpath = sysconfig.EXEC_PREFIX + os.sep + "lib"
|
||||||
|
python_library = "-lpython%d.%d" % (PYTHON_MAJOR_VERSION, PYTHON_MINOR_VERSION)
|
||||||
|
ida_libpath = idasdkdir + os.sep + "libgcc32.lnx"
|
||||||
|
ida_lib = ""
|
||||||
|
extra_link_parameters = "/usr/lib/python%s.%s/lib-dynload/*.so" % (PYTHON_MAJOR_VERSION, PYTHON_MINOR_VERSION)
|
||||||
|
|
||||||
|
# Platform-specific settings for the Windows build
|
||||||
|
if system == "Windows":
|
||||||
|
builder = MSVCBuilder()
|
||||||
|
plugin_name = "python.plw"
|
||||||
|
platform_macros = [ "__NT__" ]
|
||||||
|
python_libpath = sysconfig.EXEC_PREFIX + os.sep + "libs"
|
||||||
|
python_library = "python%d%d.lib" % (PYTHON_MAJOR_VERSION, PYTHON_MINOR_VERSION)
|
||||||
|
ida_libpath = idasdkdir + os.sep + "libvc.w32"
|
||||||
|
ida_lib = "ida.lib"
|
||||||
|
extra_link_parameters = None
|
||||||
|
|
||||||
|
# Platform-specific settings for the Linux build
|
||||||
|
if system == "Darwin":
|
||||||
|
builder = GCCBuilder()
|
||||||
|
builder.linker_parameters = "-dynamiclib"
|
||||||
|
plugin_name = "python.pmc"
|
||||||
|
platform_macros = [ "__MAC__" ]
|
||||||
|
python_libpath = "."
|
||||||
|
python_library = "-framework Python"
|
||||||
|
ida_libpath = idasdkdir + os.sep + "libgcc32.mac"
|
||||||
|
ida_lib = "-lida"
|
||||||
|
extra_link_parameters = ""
|
||||||
|
|
||||||
|
|
||||||
|
# Build the wrapper from the interface files
|
||||||
|
swigcmd = "swig %s -Iswig -o idaapi.cpp -I%s idaapi.i" % (SWIG_OPTIONS, ida_include_directory)
|
||||||
|
if VERBOSE: print swigcmd
|
||||||
|
res = os.system(swigcmd)
|
||||||
|
|
||||||
|
if res != 0: return False
|
||||||
|
|
||||||
|
# Compile the wrapper
|
||||||
|
res = builder.compile("idaapi",
|
||||||
|
includes=[ PYTHON_INCLUDE_DIRECTORY, ida_include_directory ],
|
||||||
|
macros=platform_macros)
|
||||||
|
|
||||||
|
if res != 0: return False
|
||||||
|
|
||||||
|
# Compile the main plugin source
|
||||||
|
res = builder.compile("python",
|
||||||
|
includes=[ PYTHON_INCLUDE_DIRECTORY, ida_include_directory ],
|
||||||
|
macros=platform_macros)
|
||||||
|
|
||||||
|
if res != 0: return False
|
||||||
|
|
||||||
|
# Link the final binary
|
||||||
|
res = builder.link( ["idaapi", "python"],
|
||||||
|
plugin_name,
|
||||||
|
[ python_libpath, ida_libpath ],
|
||||||
|
[ python_library, ida_lib ],
|
||||||
|
extra_link_parameters)
|
||||||
|
|
||||||
|
if res != 0: return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def clean(manifest):
|
||||||
|
""" Clean the temporary files """
|
||||||
|
|
||||||
|
for i in manifest:
|
||||||
|
try:
|
||||||
|
os.unlink(i)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Detect the platform
|
||||||
|
system = platform.system()
|
||||||
|
|
||||||
|
if system == "Windows":
|
||||||
|
platform_string = "win32"
|
||||||
|
plugin_name = "python.plw"
|
||||||
|
|
||||||
|
if system == "Linux":
|
||||||
|
platform_string = "linux"
|
||||||
|
plugin_name = "python.plx"
|
||||||
|
|
||||||
|
if system == "Darwin":
|
||||||
|
platform_string = "macosx"
|
||||||
|
plugin_name = "python.pmc"
|
||||||
|
|
||||||
|
BINDISTDIR = "idapython-%d.%d.%d_ida%d.%d_py%d.%d_%s" % ( VERSION_MAJOR,
|
||||||
|
VERSION_MINOR,
|
||||||
|
VERSION_PATCH,
|
||||||
|
IDA_MAJOR_VERSION,
|
||||||
|
IDA_MINOR_VERSION,
|
||||||
|
PYTHON_MAJOR_VERSION,
|
||||||
|
PYTHON_MINOR_VERSION,
|
||||||
|
platform_string)
|
||||||
|
SRCDISTDIR = "idapython-%d.%d.%d" % ( VERSION_MAJOR,
|
||||||
|
VERSION_MINOR,
|
||||||
|
VERSION_PATCH )
|
||||||
|
|
||||||
|
# Build the plugin
|
||||||
|
res = build_plugin(system, IDA_SDK)
|
||||||
|
if not res: sys.exit(1)
|
||||||
|
|
||||||
|
# Build the binary distribution
|
||||||
|
binmanifest = []
|
||||||
|
binmanifest.extend(BINDIST_MANIFEST)
|
||||||
|
binmanifest.append((plugin_name, "plugins"))
|
||||||
|
build_distribution(binmanifest, BINDISTDIR)
|
||||||
|
|
||||||
|
# Build the binary distribution
|
||||||
|
srcmanifest = []
|
||||||
|
srcmanifest.extend(BINDIST_MANIFEST)
|
||||||
|
srcmanifest.extend(SRCDIST_MANIFEST)
|
||||||
|
build_distribution(srcmanifest, SRCDISTDIR)
|
||||||
|
|
||||||
|
# Clean the temp files
|
||||||
|
cleanlist = []
|
||||||
|
cleanlist.extend(BUILD_TEMPFILES)
|
||||||
|
cleanlist.append(plugin_name)
|
||||||
|
clean(cleanlist)
|
||||||
|
|
53
docs/notes.txt
Normal file
53
docs/notes.txt
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
Assorted notes
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Wrapped functions and constants:
|
||||||
|
|
||||||
|
All the symbols from the idaapi module are listed in symbollist.txt.
|
||||||
|
Documentation for the plugin API functions functions is in the IDA
|
||||||
|
SDK header files. All function and symbol names directly translate
|
||||||
|
to the C++ counterparts. If you try to use a function that is not
|
||||||
|
wrapped yet you will get an exception like this:
|
||||||
|
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<string>", line 1, in ?
|
||||||
|
NameError: name 'foobar' is not defined
|
||||||
|
|
||||||
|
If this happens you can check the function in symbollist.txt. If it
|
||||||
|
is not included and it should be please report it to the author.
|
||||||
|
|
||||||
|
|
||||||
|
Data types:
|
||||||
|
|
||||||
|
All the C++ data types are mapped to corresponding Python data types.
|
||||||
|
For example ea_t maps to a Python integer. Complex data types (like
|
||||||
|
structures and classes) are mapped to Python classes that have the
|
||||||
|
same attributes as the original type.
|
||||||
|
|
||||||
|
|
||||||
|
Arguments and return values:
|
||||||
|
|
||||||
|
Generally all function arguments should be the same type as specified
|
||||||
|
by the original headers. Pointers to complex types (structures, classes)
|
||||||
|
are checked and must match the original declarations.
|
||||||
|
|
||||||
|
For example comment = get_func_comment("aa", 0) will raise an exception:
|
||||||
|
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<string>", line 1, in ?
|
||||||
|
TypeError: Type error. Got aa, expected _p_func_t
|
||||||
|
|
||||||
|
When calling functions that return a string in a buffer (usually with
|
||||||
|
maximum size) the buffer and size parameter is omitted. These functions
|
||||||
|
return either the result in a string or None if the call fails and returns
|
||||||
|
NULL. The output buffers are maximized at MAXSTR.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
C++: get_func_name(0x1234, buf, sizeof(buf));
|
||||||
|
Python: name = get_func_name(0x1234)
|
||||||
|
|
||||||
|
Any function that should return a char * is going to return either a
|
||||||
|
Python string (up to MAXSTR) or None.
|
||||||
|
|
||||||
|
|
46
examples/chooser.py
Normal file
46
examples/chooser.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#
|
||||||
|
# Demonstration of the new chooser usage
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Modal chooser
|
||||||
|
#
|
||||||
|
|
||||||
|
# Get a modal Choose instance
|
||||||
|
chooser = Choose([], "MyChooser", 1)
|
||||||
|
# List to choose from
|
||||||
|
chooser.list = [ "First", "Second", "Third" ]
|
||||||
|
# Set the width
|
||||||
|
chooser.width = 50
|
||||||
|
# Run the chooser
|
||||||
|
ch = chooser.choose()
|
||||||
|
# Print the results
|
||||||
|
if ch > 0:
|
||||||
|
print "You chose %d which is %s" % (ch, chooser.list[ch-1])
|
||||||
|
else:
|
||||||
|
print "Escape from chooser"
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Normal chooser
|
||||||
|
#
|
||||||
|
class MyChoose(Choose):
|
||||||
|
"""
|
||||||
|
You have to subclass Chooser to override the enter() method
|
||||||
|
"""
|
||||||
|
def __init__(self, list=[], name="Choose"):
|
||||||
|
Choose.__init__(self, list, name)
|
||||||
|
# Set the width
|
||||||
|
self.width = 50
|
||||||
|
|
||||||
|
def enter(self, n):
|
||||||
|
print "Enter called. Do some stuff here."
|
||||||
|
print "The chosen item is %d = %s" % (n, self.list[n-1])
|
||||||
|
print "Now press ESC to leave."
|
||||||
|
|
||||||
|
# Get a Choose instance
|
||||||
|
chooser = MyChoose([ "First", "Second", "Third" ], "MyChoose")
|
||||||
|
# Run the chooser
|
||||||
|
ch = chooser.choose()
|
||||||
|
|
35
examples/ex1.idc
Normal file
35
examples/ex1.idc
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
//
|
||||||
|
// Reference Lister
|
||||||
|
//
|
||||||
|
// List all functions and all references to them in the current section.
|
||||||
|
//
|
||||||
|
// Implemented in IDC
|
||||||
|
//
|
||||||
|
#include <idc.idc>
|
||||||
|
|
||||||
|
static main()
|
||||||
|
{
|
||||||
|
auto ea, func, ref;
|
||||||
|
|
||||||
|
// Get current ea
|
||||||
|
ea = ScreenEA();
|
||||||
|
|
||||||
|
// Loop from start to end in the current segment
|
||||||
|
for (func=SegStart(ea);
|
||||||
|
func != BADADDR && func < SegEnd(ea);
|
||||||
|
func=NextFunction(func))
|
||||||
|
{
|
||||||
|
// If the current address is function process it
|
||||||
|
if (GetFunctionFlags(func) != -1)
|
||||||
|
{
|
||||||
|
Message("Function %s at 0x%x\n", GetFunctionName(func), func);
|
||||||
|
|
||||||
|
// Find all code references to func
|
||||||
|
for (ref=RfirstB(func); ref != BADADDR; ref=RnextB(func, ref))
|
||||||
|
{
|
||||||
|
Message(" called from %s(0x%x)\n", GetFunctionName(ref), ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
examples/ex1_idaapi.py
Normal file
29
examples/ex1_idaapi.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#
|
||||||
|
# Reference Lister
|
||||||
|
#
|
||||||
|
# List all functions and all references to them in the current section.
|
||||||
|
#
|
||||||
|
# Implemented using direct IDA Plugin API calls
|
||||||
|
#
|
||||||
|
from idaapi import *
|
||||||
|
|
||||||
|
# Get current ea
|
||||||
|
ea = get_screen_ea()
|
||||||
|
|
||||||
|
# Get segment class
|
||||||
|
seg = getseg(ea)
|
||||||
|
|
||||||
|
# Loop from segment start to end
|
||||||
|
func = get_func(seg.startEA)
|
||||||
|
|
||||||
|
while func != None and func.startEA < seg.endEA:
|
||||||
|
funcea = func.startEA
|
||||||
|
print "Function %s at 0x%x" % (GetFunctionName(funcea), funcea)
|
||||||
|
|
||||||
|
ref = get_first_cref_to(funcea)
|
||||||
|
|
||||||
|
while ref != BADADDR:
|
||||||
|
print " called from %s(0x%x)" % (get_func_name(ref), ref)
|
||||||
|
ref = get_next_cref_to(funcea, ref)
|
||||||
|
|
||||||
|
func = get_next_func(funcea)
|
20
examples/ex1_idautils.py
Normal file
20
examples/ex1_idautils.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#
|
||||||
|
# Reference Lister
|
||||||
|
#
|
||||||
|
# List all functions and all references to them in the current section.
|
||||||
|
#
|
||||||
|
# Implemented with the idautils module
|
||||||
|
#
|
||||||
|
from idautils import *
|
||||||
|
|
||||||
|
# Get current ea
|
||||||
|
ea = ScreenEA()
|
||||||
|
|
||||||
|
# Loop from start to end in the current segment
|
||||||
|
for funcea in Functions(SegStart(ea), SegEnd(ea)):
|
||||||
|
print "Function %s at 0x%x" % (GetFunctionName(funcea), funcea)
|
||||||
|
|
||||||
|
# Find all code references to funcea
|
||||||
|
for ref in CodeRefsTo(funcea, 1):
|
||||||
|
print " called from %s(0x%x)" % (GetFunctionName(ref), ref)
|
||||||
|
|
826
patches/ida51.patch
Normal file
826
patches/ida51.patch
Normal file
@ -0,0 +1,826 @@
|
|||||||
|
diff -ur idasdk-versions/5.1/include/area.hpp swigsdk-versions/5.1/include/area.hpp
|
||||||
|
--- idasdk-versions/5.1/include/area.hpp 2006-09-20 17:37:08.000000000 +0300
|
||||||
|
+++ swigsdk-versions/5.1/include/area.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -57,6 +57,7 @@
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Internal classes
|
||||||
|
|
||||||
|
class sarray; // sorted array - keeps information in Btree.
|
||||||
|
@@ -603,6 +604,7 @@
|
||||||
|
{ return areacb_t_for_all_areas(this, ea1, ea2, av, ud); }
|
||||||
|
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
// Last request information -- for internal use
|
||||||
|
diff -ur idasdk-versions/5.1/include/bytes.hpp swigsdk-versions/5.1/include/bytes.hpp
|
||||||
|
--- idasdk-versions/5.1/include/bytes.hpp 2007-01-22 04:07:12.000000000 +0200
|
||||||
|
+++ swigsdk-versions/5.1/include/bytes.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -1644,9 +1644,9 @@
|
||||||
|
const uchar *mask, // comparision mask
|
||||||
|
size_t len, // length of string to search
|
||||||
|
int step, // direction:
|
||||||
|
+ int flags);
|
||||||
|
#define BIN_SEARCH_FORWARD 1
|
||||||
|
#define BIN_SEARCH_BACKWARD (-1)
|
||||||
|
- int flags);
|
||||||
|
#define BIN_SEARCH_CASE 0x01
|
||||||
|
#define BIN_SEARCH_NOCASE 0x00
|
||||||
|
#define BIN_SEARCH_NOBREAK 0x02
|
||||||
|
diff -ur idasdk-versions/5.1/include/dbg.hpp swigsdk-versions/5.1/include/dbg.hpp
|
||||||
|
--- idasdk-versions/5.1/include/dbg.hpp 2006-11-20 13:18:02.000000000 +0200
|
||||||
|
+++ swigsdk-versions/5.1/include/dbg.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -31,6 +31,7 @@
|
||||||
|
|
||||||
|
idaman debugger_t ida_export_data *dbg; // Current debugger - NULL if no debugger
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
// D E B U G G E R C A L L B A C K S
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
@@ -519,6 +520,7 @@
|
||||||
|
// Notification: none (synchronous function)
|
||||||
|
|
||||||
|
bool idaapi is_reg_integer(const char *regname);
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
// B R E A K P O I N T S
|
||||||
|
@@ -543,6 +545,7 @@
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Get number of breakpoints.
|
||||||
|
// Type: Synchronous function
|
||||||
|
// Notification: none (synchronous function)
|
||||||
|
@@ -779,6 +782,7 @@
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
// T R A C I N G E V E N T S
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
// Trace event types:
|
||||||
|
enum tev_type_t
|
||||||
|
@@ -799,6 +803,7 @@
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Get number of trace events available in trace buffer.
|
||||||
|
// Type: Synchronous function
|
||||||
|
// Notification: none (synchronous function)
|
||||||
|
@@ -877,6 +882,7 @@
|
||||||
|
// corresponds to a valid breakpoint.
|
||||||
|
|
||||||
|
ea_t idaapi get_bpt_tev_ea(int n);
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
// Utility functions
|
||||||
|
diff -ur idasdk-versions/5.1/include/expr.hpp swigsdk-versions/5.1/include/expr.hpp
|
||||||
|
--- idasdk-versions/5.1/include/expr.hpp 2006-04-12 16:29:34.000000000 +0300
|
||||||
|
+++ swigsdk-versions/5.1/include/expr.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -37,12 +37,16 @@
|
||||||
|
number of arguments. The actual number of
|
||||||
|
arguments will be passed in res->num */
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
union
|
||||||
|
{
|
||||||
|
+#endif // SWIG
|
||||||
|
char *str; /* T_str */
|
||||||
|
sval_t num; /* T_long */
|
||||||
|
ushort e[6]; /* T_flt */
|
||||||
|
+#ifndef SWIG
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
diff -ur idasdk-versions/5.1/include/funcs.hpp swigsdk-versions/5.1/include/funcs.hpp
|
||||||
|
--- idasdk-versions/5.1/include/funcs.hpp 2007-02-17 21:04:02.000000000 +0200
|
||||||
|
+++ swigsdk-versions/5.1/include/funcs.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -88,10 +88,12 @@
|
||||||
|
bool is_far(void) const { return (flags & FUNC_FAR) != 0; }
|
||||||
|
bool does_return(void) const { return (flags & FUNC_NORET) == 0; }
|
||||||
|
bool analyzed_sp(void) const { return (flags & FUNC_SP_READY) != 0; }
|
||||||
|
+#ifndef SWIG
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct // attributes of a function entry chunk
|
||||||
|
{
|
||||||
|
+#endif // SWIG
|
||||||
|
//
|
||||||
|
// Stack frame of the function. It is represented as a structure:
|
||||||
|
//
|
||||||
|
@@ -147,15 +149,19 @@
|
||||||
|
int tailqty; // number of function tails
|
||||||
|
area_t *tails; // array of tails, sorted by ea
|
||||||
|
// use func_tail_iterator_t to access function tails
|
||||||
|
+#ifndef SWIG
|
||||||
|
};
|
||||||
|
struct // attributes of a function tail chunk
|
||||||
|
{
|
||||||
|
+#endif // SWIG
|
||||||
|
ea_t owner; // the address of the main function possessing this tail
|
||||||
|
int refqty; // number of referers
|
||||||
|
ea_t *referers; // array of referers (function start addresses)
|
||||||
|
// use func_parent_iterator_t to access the referers
|
||||||
|
+#ifndef SWIG
|
||||||
|
};
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool is_func_entry(const func_t *pfn) { return pfn != NULL && (pfn->flags & FUNC_TAIL) == 0; }
|
||||||
|
diff -ur idasdk-versions/5.1/include/ida.hpp swigsdk-versions/5.1/include/ida.hpp
|
||||||
|
--- idasdk-versions/5.1/include/ida.hpp 2007-01-31 16:35:16.000000000 +0200
|
||||||
|
+++ swigsdk-versions/5.1/include/ida.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -369,6 +369,7 @@
|
||||||
|
inline bool idaapi should_create_stkvars(void) { return (inf.af & AF_LVAR) != 0; }
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// set a 'bit' in 'where' if 'value' if not zero
|
||||||
|
|
||||||
|
inline void idaapi setflag(uchar &where,uchar bit,int value)
|
||||||
|
@@ -390,10 +391,13 @@
|
||||||
|
else where &= ~bit;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#endif // SWIG
|
||||||
|
//------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
#define BADADDR ea_t(-1) // this value is used for 'bad address'
|
||||||
|
#define BADSEL sel_t(-1) // 'bad selector' value
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
// Maximum address allowed to use in the program being disassebled.
|
||||||
|
// This is obsolete, don't use it!
|
||||||
|
diff -ur idasdk-versions/5.1/include/idd.hpp swigsdk-versions/5.1/include/idd.hpp
|
||||||
|
--- idasdk-versions/5.1/include/idd.hpp 2006-12-08 16:52:40.000000000 +0200
|
||||||
|
+++ swigsdk-versions/5.1/include/idd.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -53,6 +53,7 @@
|
||||||
|
char name[MAXSTR];
|
||||||
|
};
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
//====================================================================
|
||||||
|
//
|
||||||
|
// Registers
|
||||||
|
@@ -173,6 +174,7 @@
|
||||||
|
e_exception_t exc; // EXCEPTION
|
||||||
|
};
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
// Hardware breakpoint types
|
||||||
|
typedef int bpttype_t;
|
||||||
|
@@ -183,6 +185,7 @@
|
||||||
|
BPT_SOFT = 4; // Software breakpoint
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Exception information
|
||||||
|
struct exception_info_t
|
||||||
|
{
|
||||||
|
@@ -441,6 +444,7 @@
|
||||||
|
#error "Size of debugger_t is incorrect"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
#endif // _IDD_HPP
|
||||||
|
diff -ur idasdk-versions/5.1/include/idp.hpp swigsdk-versions/5.1/include/idp.hpp
|
||||||
|
--- idasdk-versions/5.1/include/idp.hpp 2007-02-09 12:54:06.000000000 +0200
|
||||||
|
+++ swigsdk-versions/5.1/include/idp.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -31,6 +31,7 @@
|
||||||
|
|
||||||
|
#define IDP_INTERFACE_VERSION 76
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// AbstractRegister and WorkReg are deprecated!
|
||||||
|
class WorkReg;
|
||||||
|
@@ -110,6 +111,7 @@
|
||||||
|
#define CF_HLL 0x10000 // Instruction may be present in a high level
|
||||||
|
// language function.
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
idaman bool ida_export InstrIsSet(int icode,int bit); // does the specified instruction
|
||||||
|
// have the specified feature?
|
||||||
|
@@ -119,6 +121,7 @@
|
||||||
|
idaman bool ida_export is_indirect_jump_insn(ea_t ea);
|
||||||
|
idaman bool ida_export is_basic_block_end(bool call_insn_stops_block); // in:cmd
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// Structures related to checkarg_dispatch()
|
||||||
|
|
||||||
|
@@ -1384,6 +1387,7 @@
|
||||||
|
int high_fixup_bits;
|
||||||
|
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#if sizeof(processor_t) % 4
|
||||||
|
@@ -1394,8 +1398,10 @@
|
||||||
|
// The following two structures contain information about the current
|
||||||
|
// processor and assembler.
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
idaman processor_t ida_export_data ph; // Current processor
|
||||||
|
idaman asm_t ida_export_data ash; // Current assembler
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
idaman int ida_export str2regf(const char *p); // -1 - error. Returns word reg number
|
||||||
|
idaman int ida_export str2reg(const char *p); // -1 - error. Returns any reg number
|
||||||
|
@@ -1500,10 +1506,12 @@
|
||||||
|
idaman char *ida_export get_idp_name(char *buf, size_t bufsize);
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Unload the processor module.
|
||||||
|
// This function is for the kernel only.
|
||||||
|
|
||||||
|
void free_processor_module(void);
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
// Set target assembler
|
||||||
|
@@ -1512,11 +1520,13 @@
|
||||||
|
idaman void ida_export set_target_assembler(int asmnum);
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Read IDA.CFG file and configure IDA for the current processor
|
||||||
|
// This is an internal kernel function.
|
||||||
|
// It should not be used in modules.
|
||||||
|
|
||||||
|
void read_config_file(int npass);
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
// get number of bits in a byte at the given address
|
||||||
|
diff -ur idasdk-versions/5.1/include/kernwin.hpp swigsdk-versions/5.1/include/kernwin.hpp
|
||||||
|
--- idasdk-versions/5.1/include/kernwin.hpp 2007-01-29 05:44:54.000000000 +0200
|
||||||
|
+++ swigsdk-versions/5.1/include/kernwin.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -28,8 +28,10 @@
|
||||||
|
#include <help.h>
|
||||||
|
#include <llong.hpp>
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
typedef int atype_t; // autoanalysis types
|
||||||
|
typedef int idastate_t; // ida state indicator (ready, thinking, waiting)
|
||||||
|
+#endif // SWIG
|
||||||
|
typedef uchar color_t; // see <lines.hpp>
|
||||||
|
typedef uval_t bmask_t; // see <enum.hpp>
|
||||||
|
typedef tid_t enum_t; // see <enum.hpp>
|
||||||
|
@@ -95,6 +97,7 @@
|
||||||
|
class value_t;
|
||||||
|
class linput_t;
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
union callui_t // Return codes (size of this type should be 4 bytes at most)
|
||||||
|
{ // (otherwise different compilers return it differently)
|
||||||
|
bool cnd;
|
||||||
|
@@ -877,6 +880,8 @@
|
||||||
|
idaman void ida_export vshow_hex_file(linput_t *li, long pos, size_t count, const char *format, va_list va);
|
||||||
|
|
||||||
|
|
||||||
|
+#endif // SWIG
|
||||||
|
+#ifndef SWIG
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// K E R N E L S E R V I C E S F O R U I
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
@@ -1218,8 +1223,10 @@
|
||||||
|
{ return linearray_t_up(this); }
|
||||||
|
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// D E B U G G I N G F U N C T I O N S
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
@@ -1303,11 +1310,13 @@
|
||||||
|
vshow_hex_file(li, pos, count, fmt, va);
|
||||||
|
va_end(va);
|
||||||
|
}
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
// U I S E R V I C E F U N C T I O N S
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Common function prototypes
|
||||||
|
// These functions are inlined for the kernel
|
||||||
|
// They are not inlined for the user-interfaces
|
||||||
|
@@ -1466,6 +1475,7 @@
|
||||||
|
sizer, getl, title, icon, deflt, del,
|
||||||
|
ins, update, edit, enter, destroy, popup_names, get_icon);
|
||||||
|
}
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
// Navigation band colorizer function
|
||||||
|
// ea - address to calculate the color of
|
||||||
|
@@ -1570,6 +1580,7 @@
|
||||||
|
|
||||||
|
// Get VCL global variables
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
#if defined(__BORLANDC__)
|
||||||
|
namespace Forms
|
||||||
|
{
|
||||||
|
@@ -1590,6 +1601,7 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __BORLANDC__
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
#ifdef _WINDOWS_
|
||||||
|
namespace Forms
|
||||||
|
@@ -1807,6 +1819,7 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Pointer to idaview marker function.
|
||||||
|
// This pointer is initialized by callui(ui_get_marker)
|
||||||
|
|
||||||
|
@@ -1839,6 +1852,7 @@
|
||||||
|
if ( idaview_marker != NULL )
|
||||||
|
idaview_marker(get_screen_ea());
|
||||||
|
}
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
inline char *choose_idasgn(void)
|
||||||
|
@@ -1914,6 +1928,7 @@
|
||||||
|
return callui(ui_choose, chtype_struc, title).strptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
inline int choose_struc_path(const char *title, tid_t strid,
|
||||||
|
uval_t offset, adiff_t delta, bool appzero, tid_t *path)
|
||||||
|
{
|
||||||
|
@@ -1978,6 +1993,7 @@
|
||||||
|
widths, sizer, getl, title, icon, deflt, del, ins,
|
||||||
|
update, edit, enter, destroy, popup_names, get_icon).i32;
|
||||||
|
}
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
// Display a dialog box with "Please wait..."
|
||||||
|
@@ -2309,6 +2325,7 @@
|
||||||
|
return nbytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
inline int Message(help_t format,...)
|
||||||
|
{
|
||||||
|
va_list va;
|
||||||
|
@@ -2317,8 +2334,10 @@
|
||||||
|
va_end(va);
|
||||||
|
return nbytes;
|
||||||
|
}
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
// F O R M S - C O M P L E X D I A L O G B O X E S
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
@@ -2534,6 +2553,7 @@
|
||||||
|
<Names pre~f~ix :A:15:15::>
|
||||||
|
|
||||||
|
*/
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// Y E S / N O D I A L O G B O X
|
||||||
|
@@ -2695,6 +2715,7 @@
|
||||||
|
#define HIST_TYPE 8 // type declarations
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Display a dialog box and wait for the user to input multiline text
|
||||||
|
// size - maximum size of text in bytes
|
||||||
|
// answer - output buffer. if you specify NULL then the answer
|
||||||
|
@@ -2719,6 +2740,7 @@
|
||||||
|
va_end(va);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
@@ -2794,6 +2816,7 @@
|
||||||
|
idaman const char *ida_export strarray(const strarray_t *array, size_t array_size, int code);
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Convert whitespace to tabulations
|
||||||
|
// This functin will stop the conversion as soon as a string or character constant
|
||||||
|
// is encountered
|
||||||
|
@@ -2986,6 +3009,7 @@
|
||||||
|
// match a string with a regular expression
|
||||||
|
// returns: 0-no match, 1-match, -1-error
|
||||||
|
idaman int ida_export regex_match(const char *str, const char *pattern, bool sense_case);
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
diff -ur idasdk-versions/5.1/include/lines.hpp swigsdk-versions/5.1/include/lines.hpp
|
||||||
|
--- idasdk-versions/5.1/include/lines.hpp 2006-03-17 17:41:22.000000000 +0200
|
||||||
|
+++ swigsdk-versions/5.1/include/lines.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -614,12 +614,11 @@
|
||||||
|
ml_getnam_t *getnam,
|
||||||
|
ml_genxrf_t *genxrf,
|
||||||
|
ml_saver_t *saver,
|
||||||
|
- int flags
|
||||||
|
+ int flags);
|
||||||
|
#define MAKELINE_NONE 0x00
|
||||||
|
#define MAKELINE_BINPREF 0x01
|
||||||
|
#define MAKELINE_VOID 0x02
|
||||||
|
#define MAKELINE_STACK 0x04
|
||||||
|
- );
|
||||||
|
|
||||||
|
idaman bool ida_export save_line_in_array(const char *line); // a standard line saver()
|
||||||
|
idaman void ida_export init_lines_array(char *lnar[],int maxsize);// initialization function for it
|
||||||
|
diff -ur idasdk-versions/5.1/include/moves.hpp swigsdk-versions/5.1/include/moves.hpp
|
||||||
|
--- idasdk-versions/5.1/include/moves.hpp 2006-03-17 17:41:22.000000000 +0200
|
||||||
|
+++ swigsdk-versions/5.1/include/moves.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -26,6 +26,8 @@
|
||||||
|
{ return !(*this == r); }
|
||||||
|
};
|
||||||
|
|
||||||
|
+
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Helper functions. Should not be called directly!
|
||||||
|
class curloc;
|
||||||
|
class location_t;
|
||||||
|
@@ -49,13 +51,16 @@
|
||||||
|
|
||||||
|
DEFINE_CURLOC_HELPERS(idaman)
|
||||||
|
DEFINE_LOCATION_HELPERS(idaman)
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
#define CURLOC_SISTACK_ITEMS 4
|
||||||
|
|
||||||
|
class curloc : public sistack_t
|
||||||
|
{
|
||||||
|
void push(void);
|
||||||
|
+#ifndef SWIG
|
||||||
|
DEFINE_CURLOC_HELPERS(friend)
|
||||||
|
+#endif // SWIG
|
||||||
|
void unhide_if_necessary(ea_t ea);
|
||||||
|
void hide_if_necessary(void);
|
||||||
|
protected:
|
||||||
|
@@ -120,7 +125,9 @@
|
||||||
|
class location_t : public curloc
|
||||||
|
{
|
||||||
|
typedef curloc inherited;
|
||||||
|
+#ifndef SWIG
|
||||||
|
DEFINE_LOCATION_HELPERS(friend)
|
||||||
|
+#endif // SWIG
|
||||||
|
public:
|
||||||
|
graph_location_info_t gli;
|
||||||
|
location_t(void) {}
|
||||||
|
diff -ur idasdk-versions/5.1/include/nalt.hpp swigsdk-versions/5.1/include/nalt.hpp
|
||||||
|
--- idasdk-versions/5.1/include/nalt.hpp 2007-01-29 22:06:46.000000000 +0200
|
||||||
|
+++ swigsdk-versions/5.1/include/nalt.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
// in them. Look at netnode.hpp for the definition of netnodes.
|
||||||
|
//
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
#include <netnode.hpp>
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
@@ -324,6 +325,7 @@
|
||||||
|
IMPL__IS_AFLAG_FUNCS(AFL_FIXEDSPD, fixed_spd)
|
||||||
|
IMPL__IS_AFLAG_FUNCS(AFL_ALIGNFLOW,align_flow)
|
||||||
|
IMPL__IS_AFLAG_FUNCS(AFL_USERTI, userti)
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
inline void set_visible_item(ea_t ea, bool visible)
|
||||||
|
{
|
||||||
|
@@ -341,11 +343,14 @@
|
||||||
|
|
||||||
|
// source line numbers (they are sometimes present in object files)
|
||||||
|
// Thes functions may be used if necessary.
|
||||||
|
+#ifndef SWIG
|
||||||
|
NALT_EA(get_linnum0,set_linnum0, del_linnum0, NALT_LINNUM)
|
||||||
|
+#endif // SWIG
|
||||||
|
idaman void ida_export set_source_linnum(ea_t ea, uval_t lnnum);
|
||||||
|
idaman uval_t ida_export get_source_linnum(ea_t ea); // returns BADADDR if no lnnum
|
||||||
|
idaman void ida_export del_source_linnum(ea_t ea);
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// absolute segment base address
|
||||||
|
// These functions may be used if necessary.
|
||||||
|
NALT_EA(get_absbase,set_absbase, del_absbase, NALT_ABSBASE)
|
||||||
|
@@ -366,6 +371,7 @@
|
||||||
|
// type of string
|
||||||
|
// Don't use, see: get_typeinfo()
|
||||||
|
NALT_ULONG(get_str_type,set_str_type,del_str_type,NALT_STRTYPE)
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
inline char idaapi get_str_type_code(uval_t strtype) { return char(strtype); }
|
||||||
|
|
||||||
|
@@ -402,16 +408,19 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// alignment value (should be power of 2)
|
||||||
|
// These functions may be used if necessary.
|
||||||
|
NALT_ULONG(get_alignment,set_alignment,del_alignment,NALT_ALIGN)
|
||||||
|
|
||||||
|
// instruction/data background color
|
||||||
|
NALT_ULONG(_get_item_color,_set_item_color,_del_item_color,NALT_COLOR)
|
||||||
|
+#endif // SWIG
|
||||||
|
idaman void ida_export set_item_color(ea_t ea, bgcolor_t color);
|
||||||
|
idaman bgcolor_t ida_export get_item_color(ea_t ea); // returns DEFCOLOR if no color
|
||||||
|
idaman void ida_export del_item_color(ea_t ea);
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
NSUP_STRING(nalt_cmt,NSUP_CMT) // regular comment (low level, don't use)
|
||||||
|
NSUP_STRING(nalt_rptcmt,NSUP_REPCMT) // repeatable comment (low level, don't use)
|
||||||
|
@@ -559,6 +568,7 @@
|
||||||
|
|
||||||
|
// Address which holds the switch info. Used at the jump targets.
|
||||||
|
NALT_EA(get_switch_parent,set_switch_parent,del_switch_parent, NALT_SWITCH)
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
@@ -671,6 +681,7 @@
|
||||||
|
idaman void ida_export write_struc_path(netnode node, int idx, const tid_t *path, int plen, adiff_t delta);
|
||||||
|
idaman int ida_export read_struc_path(netnode node, int idx, tid_t *path, adiff_t *delta); // returns plen
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
#define DEFINE_PATH_FUNCS(name, code) \
|
||||||
|
inline int N_PASTE(get_,name)(ea_t ea, tid_t *path, adiff_t *delta) \
|
||||||
|
{ return read_struc_path(netnode(ea), code, path, delta); } \
|
||||||
|
@@ -738,6 +749,7 @@
|
||||||
|
#define RIDX_ALT_CRC32 uval_t(-5) // input file crc32
|
||||||
|
#define RIDX_ALT_IMAGEBASE uval_t(-6) // image base
|
||||||
|
#define RIDX_ALT_IDSNODE uval_t(-7) // ids modnode id (for import_module)
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Get full path of the input file
|
||||||
|
@@ -784,11 +796,13 @@
|
||||||
|
return get_input_file_path(buf, bufsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
#ifndef NO_OBSOLETE_FUNCS
|
||||||
|
#define SWI_SHIFT1 0x80 // use formula (element*2 + elbase)
|
||||||
|
// to find jump targets (obsolete)
|
||||||
|
NSUP_STRUCT(switch_info,NSUP_SWITCH)
|
||||||
|
#endif
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
#ifndef BYTES_SOURCE // undefined bit masks so no one can use them directly
|
||||||
|
#undef AFL_LINNUM
|
||||||
|
diff -ur idasdk-versions/5.1/include/pro.h swigsdk-versions/5.1/include/pro.h
|
||||||
|
--- idasdk-versions/5.1/include/pro.h 2007-02-17 21:04:34.000000000 +0200
|
||||||
|
+++ swigsdk-versions/5.1/include/pro.h 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -63,6 +63,7 @@
|
||||||
|
#define __EA64__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
#ifdef __VC__
|
||||||
|
#define ENUM_SIZE(t) : t
|
||||||
|
#else
|
||||||
|
@@ -138,6 +139,7 @@
|
||||||
|
#define __KYLIX__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#endif // SWIG
|
||||||
|
/*==================================================*/
|
||||||
|
#ifndef MAXSTR
|
||||||
|
#define MAXSTR 1024
|
||||||
|
@@ -178,7 +180,12 @@
|
||||||
|
|
||||||
|
/*==================================================*/
|
||||||
|
|
||||||
|
-#if defined(__IDP__) && defined(__NT__) // for modules
|
||||||
|
+#if defined(SWIG) // for SWIG
|
||||||
|
+#define idaapi
|
||||||
|
+#define idaman
|
||||||
|
+#define ida_export
|
||||||
|
+#define ida_export_data
|
||||||
|
+#elif defined(__IDP__) && defined(__NT__) // for modules
|
||||||
|
#define idaapi __stdcall
|
||||||
|
#define idaman EXTERNC
|
||||||
|
#define ida_export idaapi
|
||||||
|
@@ -237,7 +244,9 @@
|
||||||
|
typedef unsigned long ulong;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
#include <llong.hpp>
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
typedef char int8;
|
||||||
|
typedef signed char sint8;
|
||||||
|
@@ -295,6 +304,7 @@
|
||||||
|
typedef adiff_t sval_t; // signed value used by the processor
|
||||||
|
// for 32-bit ea_t, long
|
||||||
|
// for 64-bit ea_t, longlong
|
||||||
|
+#ifndef SWIG
|
||||||
|
#define BADADDR ea_t(-1) // this value is used for 'bad address'
|
||||||
|
|
||||||
|
// Windows64 declarations
|
||||||
|
@@ -618,7 +628,9 @@
|
||||||
|
idaman bool ida_export qisdir(const char *file);
|
||||||
|
|
||||||
|
/*==================================================*/
|
||||||
|
+#endif // SWIG
|
||||||
|
idaman void ida_export qexit(int code);
|
||||||
|
+#ifndef SWIG
|
||||||
|
idaman void ida_export qatexit(void (idaapi *func)(void));
|
||||||
|
|
||||||
|
/*==================================================*/
|
||||||
|
@@ -1286,6 +1298,7 @@
|
||||||
|
#define cwstr(dst, src, dstsize) qstrncpy(dst, src, dstsize)
|
||||||
|
#define wcstr(dst, src, dstsize) qstrncpy(dst, src, dstsize)
|
||||||
|
#endif
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
// Old Visual C++ compilers were not defining the following:
|
||||||
|
#ifdef __NT__
|
||||||
|
diff -ur idasdk-versions/5.1/include/ua.hpp swigsdk-versions/5.1/include/ua.hpp
|
||||||
|
--- idasdk-versions/5.1/include/ua.hpp 2006-10-24 23:19:54.000000000 +0300
|
||||||
|
+++ swigsdk-versions/5.1/include/ua.hpp 2007-09-30 06:56:51.000000000 +0300
|
||||||
|
@@ -42,10 +42,12 @@
|
||||||
|
// in 'cmd' structure. They should not access to bytes of instruction
|
||||||
|
// and decode it again - this should be done in the analysis step.
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
#include <kernwin.hpp> // for btoa()
|
||||||
|
#include <lines.hpp> // for color_t
|
||||||
|
#include <xref.hpp> // add_cref()
|
||||||
|
#include <llong.hpp> // longlong
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// T Y P E O F O P E R A N D
|
||||||
|
@@ -223,13 +225,17 @@
|
||||||
|
|
||||||
|
// The following unions keep other information about the operand
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
union
|
||||||
|
{
|
||||||
|
+#endif // SWIG
|
||||||
|
ushort reg; // number of register (o_reg)
|
||||||
|
ushort phrase; // number of register phrase (o_phrase,o_displ)
|
||||||
|
// you yourself define numbers of phrases
|
||||||
|
// as you like
|
||||||
|
+#ifndef SWIG
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
bool is_reg(int r) const { return type == o_reg && reg == r; }
|
||||||
|
|
||||||
|
@@ -238,7 +244,9 @@
|
||||||
|
|
||||||
|
// VALUE
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
union {
|
||||||
|
+#endif // SWIG
|
||||||
|
uval_t value; // value of operand (o_imm)
|
||||||
|
// outer displacement (o_displ+OF_OUTER_DISP)
|
||||||
|
|
||||||
|
@@ -246,14 +254,18 @@
|
||||||
|
ushort low; // your convenience only
|
||||||
|
ushort high;
|
||||||
|
} value_shorts;
|
||||||
|
+#ifndef SWIG
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
bool is_imm(uval_t v) const { return type == o_imm && value == v; }
|
||||||
|
|
||||||
|
|
||||||
|
// VIRTUAL ADDRESS (OFFSET WITHIN THE SEGMENT)
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
union {
|
||||||
|
+#endif // SWIG
|
||||||
|
ea_t addr; // virtual address pointed or used by the operand
|
||||||
|
// (o_mem,o_displ,o_far,o_near)
|
||||||
|
|
||||||
|
@@ -261,18 +273,25 @@
|
||||||
|
ushort low; // your convenience only
|
||||||
|
ushort high;
|
||||||
|
} addr_shorts;
|
||||||
|
+
|
||||||
|
+#ifndef SWIG
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
// IDP SPECIFIC INFORMATION
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
union {
|
||||||
|
+#endif // SWIG
|
||||||
|
ea_t specval; // This field may be used as you want.
|
||||||
|
struct { // this structure is defined for your convenience only
|
||||||
|
ushort low; // IBM PC: segment register number (o_mem,o_far,o_near)
|
||||||
|
ushort high; // IBM PC: segment selector value (o_mem,o_far,o_near)
|
||||||
|
} specval_shorts;
|
||||||
|
+#ifndef SWIG
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
// The following fields are used only in idp modules
|
||||||
|
// You may use them as you want to store additional information about
|
||||||
|
@@ -336,15 +355,19 @@
|
||||||
|
// Additinal information about the instruction.
|
||||||
|
// You may use these field as you want.
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
union
|
||||||
|
{
|
||||||
|
+#endif // SWIG
|
||||||
|
ushort auxpref; // processor dependent field
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uchar low;
|
||||||
|
uchar high;
|
||||||
|
} auxpref_chars;
|
||||||
|
+#ifndef SWIG
|
||||||
|
};
|
||||||
|
+#endif // SWIG
|
||||||
|
char segpref; // processor dependent field
|
||||||
|
char insnpref; // processor dependent field
|
||||||
|
|
||||||
|
@@ -374,6 +397,7 @@
|
||||||
|
|
||||||
|
// This structure is used to pass values of bytes to helper functions.
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
union value_u
|
||||||
|
{
|
||||||
|
uchar v_char;
|
||||||
|
@@ -393,6 +417,7 @@
|
||||||
|
// returns: number of immediate values (0..2*UA_MAXOP)
|
||||||
|
|
||||||
|
idaman size_t ida_export get_operand_immvals(ea_t ea, int n, uval_t *v);
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
@@ -405,6 +430,7 @@
|
||||||
|
idaman insn_t ida_export_data cmd; // current instruction
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
// Undocumented variable. It is not used by the kernel.
|
||||||
|
// Its value may be specified in IDA.CFG:
|
||||||
|
// LOOKBACK = <number>
|
||||||
|
@@ -810,6 +836,7 @@
|
||||||
|
// Returns: the reference target address (the same as calc_reference_target)
|
||||||
|
|
||||||
|
idaman ea_t ida_export ua_add_off_drefs(const op_t &x, dref_t type);
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
|
||||||
|
// Get size and flags for op_t.dtyp field.
|
||||||
|
@@ -871,6 +898,7 @@
|
||||||
|
idaman const char *ida_export ua_mnem(ea_t ea, char *buf, size_t bufsize);
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef SWIG
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Helper functions for the processor emulator/analyzer
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
@@ -942,6 +970,7 @@
|
||||||
|
// Also converts to code, uses fixups, increases segments etc
|
||||||
|
// This function is only for the kernel
|
||||||
|
// Use ua_code() instead
|
||||||
|
+#endif // SWIG
|
||||||
|
|
||||||
|
#ifndef NO_OBSOLETE_FUNCS
|
||||||
|
idaman void ida_export ua_dodata(ea_t ea, int dtype);
|
461
python.cpp
Normal file
461
python.cpp
Normal file
@ -0,0 +1,461 @@
|
|||||||
|
//------------------------------------------------------------
|
||||||
|
// IDAPython - Python plugin for Interactive Disassembler Pro
|
||||||
|
//
|
||||||
|
// Copyright (c) 2004-2007 Gergely Erdelyi <dyce@d-dome.net>
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// For detailed copyright information see the file COPYING in
|
||||||
|
// the root of the distribution archive.
|
||||||
|
//------------------------------------------------------------
|
||||||
|
// python.cpp - Main plugin code
|
||||||
|
//------------------------------------------------------------
|
||||||
|
#include <Python.h>
|
||||||
|
|
||||||
|
/* This define fixes the redefinition of ssize_t */
|
||||||
|
#ifdef HAVE_SSIZE_T
|
||||||
|
#define _SSIZE_T_DEFINED 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ida.hpp>
|
||||||
|
#include <idp.hpp>
|
||||||
|
#include <bytes.hpp>
|
||||||
|
#include <diskio.hpp>
|
||||||
|
#include <loader.hpp>
|
||||||
|
#include <kernwin.hpp>
|
||||||
|
#include <netnode.hpp>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Python-style version tuple comes from the makefile */
|
||||||
|
/* Only the serial and status is set here */
|
||||||
|
#define VER_SERIAL 0
|
||||||
|
#define VER_STATUS "final"
|
||||||
|
|
||||||
|
#define IDAPYTHON_RUNFILE 0
|
||||||
|
#define IDAPYTHON_RUNSTATEMENT 1
|
||||||
|
#define IDAPYTHON_SCRIPTBOX 2
|
||||||
|
|
||||||
|
#define IDAPYTHON_DATA_STATEMENT 0
|
||||||
|
|
||||||
|
|
||||||
|
void init_idaapi(void);
|
||||||
|
void idaapi run(int arg);
|
||||||
|
|
||||||
|
static int initialized = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/* This is a simple tracing code for debugging purposes. */
|
||||||
|
/* It might evolve into a tracing facility for user scripts. */
|
||||||
|
/* #define ENABLE_PYTHON_PROFILING */
|
||||||
|
|
||||||
|
#ifdef ENABLE_PYTHON_PROFILING
|
||||||
|
#include "compile.h"
|
||||||
|
#include "frameobject.h"
|
||||||
|
|
||||||
|
int tracefunc(PyObject *obj, _frame *frame, int what, PyObject *arg)
|
||||||
|
{
|
||||||
|
PyObject *str;
|
||||||
|
|
||||||
|
/* Catch line change events. */
|
||||||
|
/* Print the filename and line number */
|
||||||
|
if (what == PyTrace_LINE)
|
||||||
|
{
|
||||||
|
str = PyObject_Str(frame->f_code->co_filename);
|
||||||
|
if (str)
|
||||||
|
{
|
||||||
|
msg("PROFILING: %s:%d\n", PyString_AsString(str), frame->f_lineno);
|
||||||
|
Py_DECREF(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* QuickFix for the FILE* incompatibility problem */
|
||||||
|
int ExecFile(char *FileName)
|
||||||
|
{
|
||||||
|
PyObject* PyFileObject = PyFile_FromString(FileName, "r");
|
||||||
|
|
||||||
|
if (!PyFileObject)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PyRun_SimpleFile(PyFile_AsFile(PyFileObject), FileName) == 0)
|
||||||
|
{
|
||||||
|
Py_DECREF(PyFileObject);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Py_DECREF(PyFileObject);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for the presence of a file in IDADIR/python */
|
||||||
|
bool CheckFile(char *filename)
|
||||||
|
{
|
||||||
|
char filepath[MAXSTR+1];
|
||||||
|
|
||||||
|
#if IDP_INTERFACE_VERSION >= 75
|
||||||
|
qmakepath(filepath, MAXSTR, idadir(NULL), "python", filename, NULL);
|
||||||
|
#elif IDP_INTERFACE_VERSION >= 69
|
||||||
|
qmakepath(filepath, idadir(NULL), "python", filename, NULL);
|
||||||
|
#else
|
||||||
|
qmakepath(filepath, idadir(), "python", filename, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!qfileexist(filepath))
|
||||||
|
{
|
||||||
|
warning("IDAPython: Missing required file %s", filename);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Execute the Python script from the plugin */
|
||||||
|
/* Default hotkey: Alt-9 */
|
||||||
|
void IDAPython_RunScript(char *script)
|
||||||
|
{
|
||||||
|
char statement[MAXSTR+32];
|
||||||
|
char slashpath[MAXSTR+1];
|
||||||
|
char *scriptpath;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (script)
|
||||||
|
{
|
||||||
|
scriptpath = script;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scriptpath = askfile_c(0, "*.py", "Python file to run");
|
||||||
|
|
||||||
|
if (!scriptpath)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make a copy of the path with '\\' => '/' */
|
||||||
|
for (i=0; scriptpath[i]; i++)
|
||||||
|
{
|
||||||
|
if (scriptpath[i] == '\\')
|
||||||
|
{
|
||||||
|
slashpath[i] = '/';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
slashpath[i] = scriptpath[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
slashpath[i] = '\0';
|
||||||
|
|
||||||
|
/* Add the script't path to sys.path */
|
||||||
|
snprintf(statement, sizeof(statement), "runscript(\"%s\")", slashpath);
|
||||||
|
PyRun_SimpleString(statement);
|
||||||
|
|
||||||
|
/* Error handling */
|
||||||
|
if (PyErr_Occurred())
|
||||||
|
{
|
||||||
|
PyErr_Print();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Execute Python statement(s) from an editor window */
|
||||||
|
/* Default hotkey: Alt-8 */
|
||||||
|
void IDAPython_RunStatement(void)
|
||||||
|
{
|
||||||
|
char statement[4096];
|
||||||
|
netnode history;
|
||||||
|
|
||||||
|
/* Get the existing or create a new netnode in the database */
|
||||||
|
history.create("IDAPython_Data");
|
||||||
|
|
||||||
|
/* Fetch the previous statement */
|
||||||
|
if (history.supval(IDAPYTHON_DATA_STATEMENT, statement, sizeof(statement)) == -1)
|
||||||
|
{
|
||||||
|
statement[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asktext(sizeof(statement), statement, statement, "Enter Python expressions"))
|
||||||
|
{
|
||||||
|
PyRun_SimpleString(statement);
|
||||||
|
/* Store the statement to the database */
|
||||||
|
history.supset(IDAPYTHON_DATA_STATEMENT, statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* History of previously executed scripts */
|
||||||
|
/* Default hotkey: Alt-7 */
|
||||||
|
void IDAPython_ScriptBox(void)
|
||||||
|
{
|
||||||
|
PyObject *module;
|
||||||
|
PyObject *dict;
|
||||||
|
PyObject *scriptbox;
|
||||||
|
PyObject *pystr;
|
||||||
|
|
||||||
|
/* Get globals() */
|
||||||
|
/* These two should never fail */
|
||||||
|
module = PyImport_AddModule("__main__");
|
||||||
|
dict = PyModule_GetDict(module);
|
||||||
|
|
||||||
|
scriptbox = PyDict_GetItemString(dict, "ScriptBox_instance");
|
||||||
|
|
||||||
|
if (!scriptbox)
|
||||||
|
{
|
||||||
|
warning("INTERNAL ERROR: ScriptBox_instance missing! Broken init.py?");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pystr = PyObject_CallMethod(scriptbox, "run", "");
|
||||||
|
|
||||||
|
if (pystr)
|
||||||
|
{
|
||||||
|
/* If the return value is string use it as path */
|
||||||
|
if (PyObject_TypeCheck(pystr, &PyString_Type))
|
||||||
|
{
|
||||||
|
ExecFile(PyString_AsString(pystr));
|
||||||
|
}
|
||||||
|
Py_DECREF(pystr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Print the exception info */
|
||||||
|
if (PyErr_Occurred())
|
||||||
|
{
|
||||||
|
PyErr_Print();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool idaapi IDAPython_Menu_Callback(void *ud)
|
||||||
|
{
|
||||||
|
run((int)ud);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialize the Python environment */
|
||||||
|
bool IDAPython_Init(void)
|
||||||
|
{
|
||||||
|
char *options;
|
||||||
|
char tmp[MAXSTR+64];
|
||||||
|
char *initpath;
|
||||||
|
bool result = 1;
|
||||||
|
|
||||||
|
/* Already initialized? */
|
||||||
|
if (initialized == 1)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for the presence of essential files */
|
||||||
|
initialized = 0;
|
||||||
|
|
||||||
|
result &= CheckFile("idc.py");
|
||||||
|
result &= CheckFile("init.py");
|
||||||
|
result &= CheckFile("idaapi.py");
|
||||||
|
result &= CheckFile("idautils.py");
|
||||||
|
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Start the interpreter */
|
||||||
|
Py_Initialize();
|
||||||
|
|
||||||
|
if (!Py_IsInitialized())
|
||||||
|
{
|
||||||
|
warning("IDAPython: Py_Initialize() failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Init the SWIG wrapper */
|
||||||
|
init_idaapi();
|
||||||
|
|
||||||
|
sprintf(tmp, "IDAPYTHON_VERSION=(%d, %d, %d, '%s', %d)", \
|
||||||
|
VER_MAJOR,
|
||||||
|
VER_MINOR,
|
||||||
|
VER_PATCH,
|
||||||
|
VER_STATUS,
|
||||||
|
VER_SERIAL);
|
||||||
|
|
||||||
|
PyRun_SimpleString(tmp);
|
||||||
|
|
||||||
|
#if IDP_INTERFACE_VERSION >= 75
|
||||||
|
qmakepath(tmp, MAXSTR, idadir("python"), "init.py", NULL);
|
||||||
|
#elif IDP_INTERFACE_VERSION >= 69
|
||||||
|
qmakepath(tmp, idadir("python"), "init.py", NULL);
|
||||||
|
#else
|
||||||
|
qmakepath(tmp, idadir(), "python", "init.py", NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Pull in the Python side of init */
|
||||||
|
if (!ExecFile(tmp))
|
||||||
|
{
|
||||||
|
warning("IDAPython: error executing init.py");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ENABLE_PYTHON_PROFILING
|
||||||
|
PyEval_SetTrace(tracefunc, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Batch-mode operation: */
|
||||||
|
/* A script specified on the command line is run */
|
||||||
|
options = (char *)get_plugin_options("IDAPython");
|
||||||
|
|
||||||
|
if (options)
|
||||||
|
{
|
||||||
|
IDAPython_RunScript(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add menu items for all the functions */
|
||||||
|
/* Different paths are used for the GUI version */
|
||||||
|
result = add_menu_item("File/IDC command...", "P~y~thon command...",
|
||||||
|
"Alt-8", SETMENU_APP,
|
||||||
|
(menu_item_callback_t *)IDAPython_Menu_Callback,
|
||||||
|
(void *)IDAPYTHON_RUNSTATEMENT);
|
||||||
|
|
||||||
|
result = add_menu_item("File/Load file/IDC file...", "P~y~thon file...",
|
||||||
|
"Alt-9", SETMENU_APP,
|
||||||
|
(menu_item_callback_t *)IDAPython_Menu_Callback,
|
||||||
|
(void *)IDAPYTHON_RUNFILE);
|
||||||
|
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
add_menu_item("File/IDC command...", "P~y~thon file...",
|
||||||
|
"Alt-9", SETMENU_APP,
|
||||||
|
(menu_item_callback_t *)IDAPython_Menu_Callback,
|
||||||
|
(void *)IDAPYTHON_RUNFILE);
|
||||||
|
}
|
||||||
|
|
||||||
|
result = add_menu_item("View/Open subviews/Show strings", "Python S~c~ripts",
|
||||||
|
"Alt-7", SETMENU_APP,
|
||||||
|
(menu_item_callback_t *)IDAPython_Menu_Callback,
|
||||||
|
(void *)IDAPYTHON_SCRIPTBOX);
|
||||||
|
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
add_menu_item("View/Open subviews/Problems", "Python S~c~ripts",
|
||||||
|
"Alt-7", SETMENU_APP,
|
||||||
|
(menu_item_callback_t *)IDAPython_Menu_Callback,
|
||||||
|
(void *)IDAPYTHON_SCRIPTBOX);
|
||||||
|
}
|
||||||
|
|
||||||
|
initialized = 1;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cleaning up Python */
|
||||||
|
void IDAPython_Term(void)
|
||||||
|
{
|
||||||
|
/* Remove the menu items before termination */
|
||||||
|
#if 0
|
||||||
|
// FIXME: This segfaults the Linux version. The non-existent items might cause this?
|
||||||
|
del_menu_item("File/Load file/Python file...");
|
||||||
|
del_menu_item("File/Python file...");
|
||||||
|
del_menu_item("File/Python command...");
|
||||||
|
del_menu_item("View/Open subviews/Python Scripts");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Shut the interpreter down */
|
||||||
|
Py_Finalize();
|
||||||
|
|
||||||
|
initialized = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Plugin init routine */
|
||||||
|
int idaapi init(void)
|
||||||
|
{
|
||||||
|
if (IDAPython_Init())
|
||||||
|
{
|
||||||
|
return PLUGIN_KEEP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return PLUGIN_SKIP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Plugin term routine */
|
||||||
|
void idaapi term(void)
|
||||||
|
{
|
||||||
|
IDAPython_Term();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Plugin hotkey entry point */
|
||||||
|
void idaapi run(int arg)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
switch (arg)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
IDAPython_RunScript(NULL);
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
case 1:
|
||||||
|
IDAPython_RunStatement();
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
case 2:
|
||||||
|
IDAPython_ScriptBox();
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
default:
|
||||||
|
warning("IDAPython: unknown plugin argument %d", arg);
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
warning("Exception in Python interpreter. Reloading...");
|
||||||
|
IDAPython_Term();
|
||||||
|
IDAPython_Init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// PLUGIN DESCRIPTION BLOCK
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
char comment[] = "IDAPython";
|
||||||
|
char help[] = "IDA Python Plugin\n";
|
||||||
|
char wanted_name[] = "IDAPython";
|
||||||
|
char wanted_hotkey[] = "Alt-9";
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
plugin_t PLUGIN = {
|
||||||
|
IDP_INTERFACE_VERSION,
|
||||||
|
0, // plugin flags
|
||||||
|
init, // initialize
|
||||||
|
|
||||||
|
term, // terminate. this pointer may be NULL.
|
||||||
|
|
||||||
|
run, // invoke plugin
|
||||||
|
|
||||||
|
comment, // long comment about the plugin
|
||||||
|
// it could appear in the status line
|
||||||
|
// or as a hint
|
||||||
|
|
||||||
|
help, // multiline help about the plugin
|
||||||
|
|
||||||
|
wanted_name, // the preferred short name of the plugin
|
||||||
|
wanted_hotkey // the preferred hotkey to run the plugin
|
||||||
|
};
|
||||||
|
}
|
268
python/idautils.py
Normal file
268
python/idautils.py
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
#------------------------------------------------------------
|
||||||
|
# IDAPython - Python plugin for Interactive Disassembler Pro
|
||||||
|
#
|
||||||
|
# Copyright (c) 2004-2007 Gergely Erdelyi <dyce@d-dome.net>
|
||||||
|
#
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# For detailed copyright information see the file COPYING in
|
||||||
|
# the root of the distribution archive.
|
||||||
|
#------------------------------------------------------------
|
||||||
|
"""
|
||||||
|
idautils.py - High level utility functions for IDA
|
||||||
|
"""
|
||||||
|
from idaapi import *
|
||||||
|
|
||||||
|
def refs(ea, funcfirst, funcnext):
|
||||||
|
"""
|
||||||
|
Generic reference collector - INTERNAL USE ONLY.
|
||||||
|
"""
|
||||||
|
reflist = []
|
||||||
|
|
||||||
|
ref = funcfirst(ea)
|
||||||
|
|
||||||
|
if ref != BADADDR:
|
||||||
|
reflist.append(ref)
|
||||||
|
|
||||||
|
while 1:
|
||||||
|
ref = funcnext(ea, ref)
|
||||||
|
|
||||||
|
if ref == BADADDR:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
reflist.append(ref)
|
||||||
|
|
||||||
|
return reflist
|
||||||
|
|
||||||
|
|
||||||
|
def CodeRefsTo(ea, flow):
|
||||||
|
"""
|
||||||
|
Get a list of code references to 'ea'
|
||||||
|
|
||||||
|
@param ea: Target address
|
||||||
|
@param flow: Follow normal code flow or not
|
||||||
|
@type flow: Boolean (0/1, False/True)
|
||||||
|
|
||||||
|
@return: list of references (may be empty list)
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
for ref in CodeRefsTo(ScreenEA(), 1):
|
||||||
|
print ref
|
||||||
|
"""
|
||||||
|
if flow == 1:
|
||||||
|
return refs(ea, get_first_cref_to, get_next_cref_to)
|
||||||
|
else:
|
||||||
|
return refs(ea, get_first_fcref_to, get_next_fcref_to)
|
||||||
|
|
||||||
|
|
||||||
|
def CodeRefsFrom(ea, flow):
|
||||||
|
"""
|
||||||
|
Get a list of code references from 'ea'
|
||||||
|
|
||||||
|
@param ea: Target address
|
||||||
|
@param flow: Follow normal code flow or not
|
||||||
|
@type flow: Boolean (0/1, False/True)
|
||||||
|
|
||||||
|
@return: list of references (may be empty list)
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
for ref in CodeRefsFrom(ScreenEA(), 1):
|
||||||
|
print ref
|
||||||
|
"""
|
||||||
|
if flow == 1:
|
||||||
|
return refs(ea, get_first_cref_from, get_next_cref_from)
|
||||||
|
else:
|
||||||
|
return refs(ea, get_first_fcref_from, get_next_fcref_from)
|
||||||
|
|
||||||
|
|
||||||
|
def DataRefsTo(ea):
|
||||||
|
"""
|
||||||
|
Get a list of data references to 'ea'
|
||||||
|
|
||||||
|
@param ea: Target address
|
||||||
|
|
||||||
|
@return: list of references (may be empty list)
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
for ref in DataRefsTo(ScreenEA(), 1):
|
||||||
|
print ref
|
||||||
|
"""
|
||||||
|
return refs(ea, get_first_dref_to, get_next_dref_to)
|
||||||
|
|
||||||
|
|
||||||
|
def DataRefsFrom(ea):
|
||||||
|
"""
|
||||||
|
Get a list of data references from 'ea'
|
||||||
|
|
||||||
|
@param ea: Target address
|
||||||
|
|
||||||
|
@return: list of references (may be empty list)
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
for ref in DataRefsFrom(ScreenEA(), 1):
|
||||||
|
print ref
|
||||||
|
"""
|
||||||
|
return refs(ea, get_first_dref_from, get_next_dref_from)
|
||||||
|
|
||||||
|
|
||||||
|
def Heads(start, end):
|
||||||
|
"""
|
||||||
|
Get a list of heads (instructions or data)
|
||||||
|
|
||||||
|
@param start: start address (this one is always included)
|
||||||
|
@param end: end address
|
||||||
|
|
||||||
|
@return: list of heads between start and end
|
||||||
|
"""
|
||||||
|
headlist = []
|
||||||
|
headlist.append(start)
|
||||||
|
|
||||||
|
ea = start
|
||||||
|
|
||||||
|
while 1:
|
||||||
|
ea = next_head(ea, end)
|
||||||
|
|
||||||
|
if ea == BADADDR:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
headlist.append(ea)
|
||||||
|
|
||||||
|
return headlist
|
||||||
|
|
||||||
|
|
||||||
|
def Functions(start, end):
|
||||||
|
"""
|
||||||
|
Get a list of functions
|
||||||
|
|
||||||
|
@param start: start address
|
||||||
|
@param end: end address
|
||||||
|
|
||||||
|
@return: list of heads between start and end
|
||||||
|
|
||||||
|
@note: The last function that starts before 'end' is included even
|
||||||
|
if it extends beyond 'end'.
|
||||||
|
"""
|
||||||
|
startaddr = start
|
||||||
|
endaddr = end
|
||||||
|
|
||||||
|
funclist = []
|
||||||
|
|
||||||
|
func = get_func(start)
|
||||||
|
|
||||||
|
if func:
|
||||||
|
funclist.append(func.startEA)
|
||||||
|
|
||||||
|
ea = start
|
||||||
|
|
||||||
|
while 1:
|
||||||
|
func = get_next_func(ea)
|
||||||
|
|
||||||
|
if not func: break
|
||||||
|
|
||||||
|
if func.startEA < end:
|
||||||
|
funclist.append(func.startEA)
|
||||||
|
ea = func.startEA
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
return funclist
|
||||||
|
|
||||||
|
|
||||||
|
def Segments():
|
||||||
|
"""
|
||||||
|
Get list of segments (sections) in the binary image
|
||||||
|
|
||||||
|
@return: List of segment start addresses.
|
||||||
|
"""
|
||||||
|
seglist = []
|
||||||
|
|
||||||
|
for n in range(get_segm_qty()):
|
||||||
|
seg = getnseg(n)
|
||||||
|
|
||||||
|
if not seg:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
seglist.append(seg.startEA)
|
||||||
|
|
||||||
|
return seglist
|
||||||
|
|
||||||
|
|
||||||
|
def GetDataList(ea, count, itemsize=1):
|
||||||
|
"""
|
||||||
|
Get data list - INTERNAL USE ONLY
|
||||||
|
"""
|
||||||
|
getdata = None
|
||||||
|
|
||||||
|
if itemsize == 1:
|
||||||
|
getdata = get_byte
|
||||||
|
if itemsize == 2:
|
||||||
|
getdata = get_word
|
||||||
|
if itemsize == 4:
|
||||||
|
getdata = get_dword
|
||||||
|
|
||||||
|
if getdata == None:
|
||||||
|
raise ValueError, "Invalid data size! Must be 1, 2 or 4"
|
||||||
|
|
||||||
|
list = []
|
||||||
|
|
||||||
|
for offs in range(count):
|
||||||
|
list.append(getdata(ea))
|
||||||
|
ea = ea + itemsize
|
||||||
|
|
||||||
|
return list
|
||||||
|
|
||||||
|
|
||||||
|
def PutDataList(ea, list, itemsize=1):
|
||||||
|
"""
|
||||||
|
Put data list - INTERNAL USE ONLY
|
||||||
|
"""
|
||||||
|
putdata = None
|
||||||
|
|
||||||
|
if itemsize == 1:
|
||||||
|
putdata = patch_byte
|
||||||
|
if itemsize == 2:
|
||||||
|
putdata = patch_word
|
||||||
|
if itemsize == 4:
|
||||||
|
putdata = patch_dword
|
||||||
|
|
||||||
|
if putdata == None:
|
||||||
|
raise ValueError, "Invalid data size! Must be 1, 2 or 4"
|
||||||
|
|
||||||
|
for val in list:
|
||||||
|
putdata(ea, val)
|
||||||
|
ea = ea + itemsize
|
||||||
|
|
||||||
|
|
||||||
|
def MapDataList(ea, length, func, wordsize=1):
|
||||||
|
"""
|
||||||
|
Map through a list of data words in the database
|
||||||
|
|
||||||
|
@param ea: start address
|
||||||
|
@param length: number of words to map
|
||||||
|
@param func: mapping function
|
||||||
|
@param wordsize: size of words to map [default: 1 byte]
|
||||||
|
|
||||||
|
@return: None
|
||||||
|
"""
|
||||||
|
PutDataList(ea, map(func, GetDataList(ea, length, wordsize)), wordsize)
|
||||||
|
|
||||||
|
|
||||||
|
def GetInputFileMD5():
|
||||||
|
"""
|
||||||
|
Return the MD5 hash of the input binary file
|
||||||
|
|
||||||
|
@return: MD5 string or None on error
|
||||||
|
"""
|
||||||
|
ua=ucharArray(16)
|
||||||
|
if retrieve_input_file_md5(ua.cast()):
|
||||||
|
md5str=""
|
||||||
|
for i in range(16):
|
||||||
|
md5str += "%02x" % ua[i]
|
||||||
|
return md5str
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
6123
python/idc.py
Normal file
6123
python/idc.py
Normal file
File diff suppressed because it is too large
Load Diff
135
python/init.py
Normal file
135
python/init.py
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
#------------------------------------------------------------
|
||||||
|
# IDAPython - Python plugin for Interactive Disassembler Pro
|
||||||
|
#
|
||||||
|
# Copyright (c) 2004-2007 Gergely Erdelyi <dyce@d-dome.net>
|
||||||
|
#
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# For detailed copyright information see the file COPYING in
|
||||||
|
# the root of the distribution archive.
|
||||||
|
#------------------------------------------------------------
|
||||||
|
# init.py - Essential init routines
|
||||||
|
#------------------------------------------------------------
|
||||||
|
import sys, os, os.path, traceback, warnings
|
||||||
|
import _idaapi
|
||||||
|
|
||||||
|
# FIXME: Should fix the offending constant instead
|
||||||
|
warnings.filterwarnings('ignore', category=FutureWarning)
|
||||||
|
|
||||||
|
|
||||||
|
def addscriptpath(script):
|
||||||
|
"""
|
||||||
|
Add the path part of the scriptfile to the system path to
|
||||||
|
allow modules to be loaded from the same place.
|
||||||
|
|
||||||
|
Each path is added only once.
|
||||||
|
"""
|
||||||
|
pathfound = 0
|
||||||
|
|
||||||
|
scriptpath = os.path.dirname(script)
|
||||||
|
|
||||||
|
for pathitem in sys.path:
|
||||||
|
if pathitem == scriptpath:
|
||||||
|
pathfound = 1
|
||||||
|
break
|
||||||
|
|
||||||
|
if pathfound == 0:
|
||||||
|
sys.path.append(scriptpath)
|
||||||
|
|
||||||
|
# Add the script to ScriptBox if it's not there yet
|
||||||
|
if not script in ScriptBox_instance.list:
|
||||||
|
ScriptBox_instance.list.insert(0, script)
|
||||||
|
|
||||||
|
|
||||||
|
def runscript(script):
|
||||||
|
"""
|
||||||
|
Run the specified script after adding its directory path to
|
||||||
|
system path.
|
||||||
|
|
||||||
|
This function is used by the low-level plugin code.
|
||||||
|
"""
|
||||||
|
addscriptpath(script)
|
||||||
|
argv = sys.argv
|
||||||
|
sys.argv = [ script ]
|
||||||
|
execfile(script, globals())
|
||||||
|
sys.argv = argv
|
||||||
|
|
||||||
|
def print_banner():
|
||||||
|
version1 = "IDAPython version %d.%d.%d %s (serial %d) initialized" % IDAPYTHON_VERSION
|
||||||
|
version2 = "Python interpreter version %d.%d.%d %s (serial %d)" % sys.version_info
|
||||||
|
linelen = max(len(version1), len(version2))
|
||||||
|
|
||||||
|
print '-' * linelen
|
||||||
|
print version1
|
||||||
|
print version2
|
||||||
|
print '-' * linelen
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Take over the standard text outputs
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
class MyStdOut:
|
||||||
|
"""
|
||||||
|
Dummy file-like class that receives stout and stderr
|
||||||
|
"""
|
||||||
|
def write(self, text):
|
||||||
|
_idaapi.msg(text.replace("%", "%%"))
|
||||||
|
|
||||||
|
def flush(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Redirect stderr and stdout to the IDA message window
|
||||||
|
sys.stdout = sys.stderr = MyStdOut()
|
||||||
|
|
||||||
|
# Assign a default sys.argv
|
||||||
|
sys.argv = [ "" ]
|
||||||
|
|
||||||
|
# Have to make sure Python finds our modules
|
||||||
|
sys.path.append(_idaapi.idadir("python"))
|
||||||
|
|
||||||
|
print_banner()
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Import all the required modules
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
from idc import *
|
||||||
|
from idautils import *
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Build up the ScriptBox tool
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
class ScriptBox(Choose):
|
||||||
|
def __init__(self, list=[]):
|
||||||
|
Choose.__init__(self, list, "ScriptBox", 1)
|
||||||
|
self.width = 50
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
if len(self.list) == 0:
|
||||||
|
Warning("ScriptBox history is empty.\nRun some script with Alt-9 and try again.")
|
||||||
|
return None
|
||||||
|
|
||||||
|
n = self.choose()
|
||||||
|
|
||||||
|
if n > 0:
|
||||||
|
return self.list[n-1]
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def addscript(self, scriptpath):
|
||||||
|
self.list.append(scriptpath)
|
||||||
|
|
||||||
|
ScriptBox_instance = ScriptBox([])
|
||||||
|
|
||||||
|
# Load the users personal init file
|
||||||
|
userrc = get_user_idadir() + os.sep + "idapythonrc.py"
|
||||||
|
|
||||||
|
if os.path.exists(userrc):
|
||||||
|
runscript(userrc)
|
||||||
|
# Remove the user script from the history
|
||||||
|
del ScriptBox_instance.list[0]
|
||||||
|
|
||||||
|
|
||||||
|
# All done, ready to rock.
|
13
swig/auto.i
Normal file
13
swig/auto.i
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
%ignore auto_process_all;
|
||||||
|
%ignore autoPlanned;
|
||||||
|
%ignore nextPlanned;
|
||||||
|
%ignore autoDelCode;
|
||||||
|
%ignore autoPeek;
|
||||||
|
%ignore autoProcess;
|
||||||
|
%ignore auto_init;
|
||||||
|
%ignore auto_save;
|
||||||
|
%ignore auto_term;
|
||||||
|
%ignore ea_without_xrefs;
|
||||||
|
|
||||||
|
%include "auto.hpp"
|
||||||
|
|
72
swig/bytes.i
Normal file
72
swig/bytes.i
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
// This makes put_many_bytes and patch_many_bytes work nicely
|
||||||
|
%apply (char *STRING, int LENGTH) { (const void *buf, size_t size) };
|
||||||
|
|
||||||
|
// Make get_any_cmt() work
|
||||||
|
%apply unsigned char *OUTPUT { color_t *cmttype };
|
||||||
|
|
||||||
|
// For get_enum_id()
|
||||||
|
%apply unsigned char *OUTPUT { uchar *serial };
|
||||||
|
|
||||||
|
// Unexported and kernel-only declarations
|
||||||
|
%ignore FlagsEnable;
|
||||||
|
%ignore FlagsDisable;
|
||||||
|
%ignore testf_t;
|
||||||
|
%ignore nextthat;
|
||||||
|
%ignore prevthat;
|
||||||
|
%ignore adjust_visea;
|
||||||
|
%ignore prev_visea;
|
||||||
|
%ignore next_visea;
|
||||||
|
%ignore is_first_visea;
|
||||||
|
%ignore is_last_visea;
|
||||||
|
%ignore is_visible_finally;
|
||||||
|
%ignore invalidate_visea_cache;
|
||||||
|
%ignore fluFlags;
|
||||||
|
%ignore setFlbits;
|
||||||
|
%ignore clrFlbits;
|
||||||
|
%ignore get_8bit;
|
||||||
|
%ignore get_ascii_char;
|
||||||
|
%ignore del_typeinfo;
|
||||||
|
%ignore del_operand_typeinfo;
|
||||||
|
%ignore doCode;
|
||||||
|
%ignore get_repeatable_cmt;
|
||||||
|
%ignore get_any_indented_cmt;
|
||||||
|
%ignore del_code_comments;
|
||||||
|
%ignore doFlow;
|
||||||
|
%ignore noFlow;
|
||||||
|
%ignore doRef;
|
||||||
|
%ignore noRef;
|
||||||
|
%ignore doExtra;
|
||||||
|
%ignore noExtra;
|
||||||
|
%ignore coagulate;
|
||||||
|
%ignore coagulate_dref;
|
||||||
|
%ignore get_item_head;
|
||||||
|
%ignore init_hidden_areas;
|
||||||
|
%ignore save_hidden_areas;
|
||||||
|
%ignore term_hidden_areas;
|
||||||
|
%ignore check_move_args;
|
||||||
|
%ignore movechunk;
|
||||||
|
%ignore lock_dbgmem_config;
|
||||||
|
%ignore unlock_dbgmem_config;
|
||||||
|
%ignore set_op_type_no_event;
|
||||||
|
%ignore ida_vpagesize;
|
||||||
|
%ignore ida_vpages;
|
||||||
|
%ignore ida_npagesize;
|
||||||
|
%ignore ida_npages;
|
||||||
|
%ignore FlagsInit;
|
||||||
|
%ignore FlagsTerm;
|
||||||
|
%ignore FlagsReset;
|
||||||
|
|
||||||
|
// TODO: These could be fixed if someone needs them.
|
||||||
|
%ignore get_many_bytes;
|
||||||
|
%ignore put_many_bytes;
|
||||||
|
%ignore patch_many_bytes;
|
||||||
|
%ignore set_dbgmem_source;
|
||||||
|
%ignore invalidate_dbgmem_config;
|
||||||
|
%ignore invalidate_dbgmem_contents;
|
||||||
|
%ignore is_debugger_on;
|
||||||
|
|
||||||
|
%include "bytes.hpp"
|
||||||
|
|
||||||
|
%clear(const void *buf, size_t size);
|
||||||
|
%clear(void *buf, ssize_t size);
|
||||||
|
%clear(typeinfo_t *);
|
10
swig/dbg.i
Normal file
10
swig/dbg.i
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// SWIG chokes on the original declaration so it is replicated here
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ulonglong ival; // 8: integer value
|
||||||
|
ushort fval[6]; // 12: floating point value in the internal representation (see ieee.h)
|
||||||
|
} regval_t;
|
||||||
|
|
||||||
|
%immutable dbg;
|
||||||
|
%include "dbg.hpp"
|
||||||
|
|
43
swig/diskio.i
Normal file
43
swig/diskio.i
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// TODO: These could be wrapped
|
||||||
|
%ignore enumerate_files;
|
||||||
|
%ignore enumerate_system_files;
|
||||||
|
%ignore ioport_bit_t;
|
||||||
|
%ignore ioport_bits_t;
|
||||||
|
%ignore ioport_t;
|
||||||
|
%ignore read_ioports;
|
||||||
|
%ignore choose_ioport_device;
|
||||||
|
%ignore find_ioport;
|
||||||
|
%ignore find_ioport_bit;
|
||||||
|
%ignore free_ioports;
|
||||||
|
%ignore lread;
|
||||||
|
%ignore qlread;
|
||||||
|
%ignore qlgets;
|
||||||
|
%ignore qlgetc;
|
||||||
|
%ignore lreadbytes;
|
||||||
|
%ignore lread2bytes;
|
||||||
|
%ignore lread2bytes;
|
||||||
|
%ignore lread4bytes;
|
||||||
|
%ignore lread4bytes;
|
||||||
|
%ignore lread8bytes;
|
||||||
|
%ignore lread8bytes;
|
||||||
|
%ignore qlsize;
|
||||||
|
%ignore qlseek;
|
||||||
|
%ignore qltell;
|
||||||
|
%ignore qlfile;
|
||||||
|
%ignore make_linput;
|
||||||
|
%ignore unmake_linput;
|
||||||
|
|
||||||
|
// FIXME: These should be wrapped for completeness
|
||||||
|
%ignore eread;
|
||||||
|
%ignore ewrite;
|
||||||
|
|
||||||
|
// Ignore kernel-only & unexported symbols
|
||||||
|
%ignore get_thread_priority;
|
||||||
|
%ignore set_thread_priority;
|
||||||
|
%ignore checkdspace;
|
||||||
|
%ignore lowdiskgo;
|
||||||
|
%ignore ida_argv;
|
||||||
|
%ignore exename;
|
||||||
|
|
||||||
|
%include "diskio.hpp"
|
||||||
|
|
7
swig/entry.i
Normal file
7
swig/entry.i
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
%ignore init_entries;
|
||||||
|
%ignore term_entries;
|
||||||
|
%ignore move_entries;
|
||||||
|
%ignore set_entry_name;
|
||||||
|
|
||||||
|
%include "entry.hpp"
|
||||||
|
|
28
swig/enum.i
Normal file
28
swig/enum.i
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// Kernel only & unexported symbols
|
||||||
|
%ignore enums;
|
||||||
|
%ignore init_enums;
|
||||||
|
%ignore save_enums;
|
||||||
|
%ignore term_enums;
|
||||||
|
%ignore get_selected_enum;
|
||||||
|
%ignore add_selected_enum;
|
||||||
|
%ignore unmark_selected_enums;
|
||||||
|
%ignore is_good_bmask;
|
||||||
|
%ignore get_bmask_enum;
|
||||||
|
%ignore ENUM_REVERSE;
|
||||||
|
%ignore ENUM_SELMEMS;
|
||||||
|
%ignore ENUM_QTY_IDX;
|
||||||
|
%ignore ENUM_FLG_IDX;
|
||||||
|
%ignore ENUM_FLAGS;
|
||||||
|
%ignore ENUM_FLAGS_IS_BF;
|
||||||
|
%ignore ENUM_FLAGS_HIDDEN;
|
||||||
|
%ignore ENUM_MASKS;
|
||||||
|
%ignore ENUM_MEMBERS;
|
||||||
|
%ignore CONST_ENUM;
|
||||||
|
%ignore CONST_VALUE;
|
||||||
|
%ignore CONST_BMASK;
|
||||||
|
%ignore CONST_SERIAL;
|
||||||
|
%ignore CONST_SERIALS;
|
||||||
|
|
||||||
|
// FIXME: Check uval_t declarations
|
||||||
|
|
||||||
|
%include "enum.hpp"
|
32
swig/expr.i
Normal file
32
swig/expr.i
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
%ignore extfun_t;
|
||||||
|
%ignore funcset_t;
|
||||||
|
%ignore IDCFuncs;
|
||||||
|
%ignore set_idc_func;
|
||||||
|
%ignore VarLong;
|
||||||
|
%ignore VarNum;
|
||||||
|
%ignore VarString;
|
||||||
|
%ignore VarFloat;
|
||||||
|
%ignore VarFree;
|
||||||
|
%ignore calcexpr_long;
|
||||||
|
%ignore CompileEx;
|
||||||
|
%ignore Compile;
|
||||||
|
%ignore CompileLine;
|
||||||
|
%ignore Run;
|
||||||
|
%ignore ExecuteLine;
|
||||||
|
%ignore ExecuteFile;
|
||||||
|
%ignore set_idc_func_body;
|
||||||
|
%ignore get_idc_func_body;
|
||||||
|
%ignore idc_stacksize;
|
||||||
|
%ignore idc_calldepth;
|
||||||
|
%ignore expr_printf;
|
||||||
|
%ignore expr_sprintf;
|
||||||
|
%ignore expr_printfer;
|
||||||
|
%ignore idaapi init_idc;
|
||||||
|
%ignore idaapi term_idc;
|
||||||
|
%ignore del_idc_userfuncs;
|
||||||
|
%ignore find_builtin_idc_func;
|
||||||
|
%ignore idc_lx;
|
||||||
|
|
||||||
|
%include "expr.hpp"
|
||||||
|
|
||||||
|
|
6
swig/fixup.i
Normal file
6
swig/fixup.i
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
%ignore apply_fixup;
|
||||||
|
%ignore convert_fixups;
|
||||||
|
%ignore move_fixups;
|
||||||
|
|
||||||
|
%include "fixup.hpp"
|
||||||
|
|
20
swig/frame.i
Normal file
20
swig/frame.i
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
%ignore add_frame_spec_member;
|
||||||
|
%ignore del_stkvars;
|
||||||
|
%ignore calc_frame_offset;
|
||||||
|
%ignore read_regvars;
|
||||||
|
%ignore write_regvars;
|
||||||
|
%ignore del_regvars;
|
||||||
|
%ignore free_regvar;
|
||||||
|
%ignore gen_regvar_defs;
|
||||||
|
%ignore set_llabel;
|
||||||
|
%ignore get_llabel_ea;
|
||||||
|
%ignore get_llabel;
|
||||||
|
%ignore read_llabels;
|
||||||
|
%ignore write_llabels;
|
||||||
|
%ignore del_llabels;
|
||||||
|
%ignore free_llabel;
|
||||||
|
%ignore read_stkpnts;
|
||||||
|
%ignore write_stkpnts;
|
||||||
|
%ignore del_stkpnts;
|
||||||
|
|
||||||
|
%include "frame.hpp"
|
36
swig/funcs.i
Normal file
36
swig/funcs.i
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
%cstring_bounded_output_none(char *buf, MAXSTR);
|
||||||
|
%cstring_bounded_output_none(char *optlibs, MAXSTR);
|
||||||
|
|
||||||
|
// FIXME: These should probably be fixed
|
||||||
|
%ignore iterate_func_chunks;
|
||||||
|
%ignore get_idasgn_desc;
|
||||||
|
%ignore get_sig_filename;
|
||||||
|
%ignore get_idasgn_header_by_short_name;
|
||||||
|
%ignore get_idasgn_title;
|
||||||
|
|
||||||
|
// Kernel-only & unexported symbols
|
||||||
|
%ignore del_regargs;
|
||||||
|
%ignore write_regargs;
|
||||||
|
%ignore find_regarg;
|
||||||
|
%ignore free_regarg;
|
||||||
|
%ignore determine_rtl;
|
||||||
|
%ignore init_signatures;
|
||||||
|
%ignore save_signatures;
|
||||||
|
%ignore term_signatures;
|
||||||
|
%ignore init_funcs;
|
||||||
|
%ignore save_funcs;
|
||||||
|
%ignore term_funcs;
|
||||||
|
%ignore move_funcs;
|
||||||
|
%ignore copy_noret_info;
|
||||||
|
%ignore recalc_func_noret_flag;
|
||||||
|
%ignore plan_for_noret_analysis;
|
||||||
|
%ignore invalidate_sp_analysis;
|
||||||
|
|
||||||
|
%ignore create_func_eas_array;
|
||||||
|
%ignore auto_add_func_tails;
|
||||||
|
|
||||||
|
%include "funcs.hpp"
|
||||||
|
|
||||||
|
%clear(char *buf);
|
||||||
|
%clear(char *optlibs);
|
||||||
|
|
13
swig/ida.i
Normal file
13
swig/ida.i
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// Ignore kernel-only symbols
|
||||||
|
%ignore dual_text_options_t;
|
||||||
|
%ignore init;
|
||||||
|
%ignore retrieve;
|
||||||
|
%ignore read;
|
||||||
|
%ignore write;
|
||||||
|
|
||||||
|
// Make idainfo::get_proc_name() work
|
||||||
|
%cstring_bounded_output(char *buf, 8);
|
||||||
|
|
||||||
|
%include "ida.hpp"
|
||||||
|
|
||||||
|
%clear(char *buf);
|
112
swig/idaapi.i
Normal file
112
swig/idaapi.i
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
%module(docstring="IDA Pro Plugin SDK API wrapper") idaapi
|
||||||
|
// Suppress 'previous definition of XX' warnings
|
||||||
|
#pragma SWIG nowarn=302
|
||||||
|
// Enable automatic docstring generation
|
||||||
|
%feature(autodoc);
|
||||||
|
%{
|
||||||
|
#include <Python.h>
|
||||||
|
#define USE_DANGEROUS_FUNCTIONS 1
|
||||||
|
#ifdef HAVE_SSIZE_T
|
||||||
|
#define _SSIZE_T_DEFINED 1
|
||||||
|
#endif
|
||||||
|
#include "ida.hpp"
|
||||||
|
#include "auto.hpp"
|
||||||
|
#include "bytes.hpp"
|
||||||
|
#include "dbg.hpp"
|
||||||
|
#include "diskio.hpp"
|
||||||
|
#include "entry.hpp"
|
||||||
|
#include "enum.hpp"
|
||||||
|
#include "expr.hpp"
|
||||||
|
#include "frame.hpp"
|
||||||
|
#include "fixup.hpp"
|
||||||
|
#include "funcs.hpp"
|
||||||
|
#include "idd.hpp"
|
||||||
|
#include "idp.hpp"
|
||||||
|
#include "ints.hpp"
|
||||||
|
#include "kernwin.hpp"
|
||||||
|
#include "lines.hpp"
|
||||||
|
#include "loader.hpp"
|
||||||
|
#include "moves.hpp"
|
||||||
|
#include "nalt.hpp"
|
||||||
|
#include "name.hpp"
|
||||||
|
#include "offset.hpp"
|
||||||
|
#include "queue.hpp"
|
||||||
|
#include "search.hpp"
|
||||||
|
#include "srarea.hpp"
|
||||||
|
#include "strlist.hpp"
|
||||||
|
#include "struct.hpp"
|
||||||
|
#include "typeinf.hpp"
|
||||||
|
#include "ua.hpp"
|
||||||
|
#include "xref.hpp"
|
||||||
|
%}
|
||||||
|
|
||||||
|
%constant ea_t BADADDR = 0xFFFFFFFF;
|
||||||
|
%constant sel_t BADSEL = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
// Help SWIG to figure out the ulonglong type
|
||||||
|
#ifdef SWIGWIN
|
||||||
|
typedef unsigned __int64 ulonglong;
|
||||||
|
typedef __int64 longlong;
|
||||||
|
#else
|
||||||
|
typedef unsigned long long ulonglong;
|
||||||
|
typedef long long longlong;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
%include "typemaps.i"
|
||||||
|
|
||||||
|
%include "cstring.i"
|
||||||
|
%include "carrays.i"
|
||||||
|
%include "cpointer.i"
|
||||||
|
|
||||||
|
%include "typeconv.i"
|
||||||
|
|
||||||
|
%include "pro.h"
|
||||||
|
|
||||||
|
// Convert all of these
|
||||||
|
%cstring_output_maxstr_none(char *buf, size_t bufsize);
|
||||||
|
|
||||||
|
%array_class(uchar, ucharArray);
|
||||||
|
%array_class(tid_t, tidArray);
|
||||||
|
%pointer_class(int, int_pointer);
|
||||||
|
|
||||||
|
%include "ida.i"
|
||||||
|
%include "idd.hpp"
|
||||||
|
%include "idp.i"
|
||||||
|
|
||||||
|
%include "area.hpp"
|
||||||
|
%include "auto.i"
|
||||||
|
%include "bytes.i"
|
||||||
|
%include "dbg.i"
|
||||||
|
%include "diskio.i"
|
||||||
|
%include "entry.i"
|
||||||
|
%include "enum.i"
|
||||||
|
%include "expr.i"
|
||||||
|
%include "fixup.i"
|
||||||
|
%include "frame.i"
|
||||||
|
%include "funcs.i"
|
||||||
|
|
||||||
|
%inline {
|
||||||
|
/* Small wrapper to get the inf structure */
|
||||||
|
idainfo *get_inf_structure(void)
|
||||||
|
{
|
||||||
|
return &inf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
%include "ints.i"
|
||||||
|
%include "kernwin.i"
|
||||||
|
%include "lines.i"
|
||||||
|
%include "loader.i"
|
||||||
|
%include "moves.i"
|
||||||
|
%include "nalt.i"
|
||||||
|
%include "name.i"
|
||||||
|
%include "offset.i"
|
||||||
|
%include "queue.i"
|
||||||
|
%include "search.i"
|
||||||
|
%include "segment.i"
|
||||||
|
%include "srarea.i"
|
||||||
|
%include "strlist.i"
|
||||||
|
%include "struct.i"
|
||||||
|
%include "typeinf.i"
|
||||||
|
%include "ua.i"
|
||||||
|
%include "xref.i"
|
3
swig/idp.i
Normal file
3
swig/idp.i
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
%ignore gen_idb_event;
|
||||||
|
|
||||||
|
%include "idp.hpp"
|
6
swig/ints.i
Normal file
6
swig/ints.i
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// Kernel-only symbols
|
||||||
|
%ignore init_predefs;
|
||||||
|
%ignore term_predefs;
|
||||||
|
|
||||||
|
%include "ints.i"
|
||||||
|
|
217
swig/kernwin.i
Normal file
217
swig/kernwin.i
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
%include "typemaps.i"
|
||||||
|
|
||||||
|
// Make askaddr(), askseg(), and asklong() return a
|
||||||
|
// tuple: (result, value)
|
||||||
|
%apply unsigned long *INOUT { sval_t *value };
|
||||||
|
%rename (_asklong) asklong;
|
||||||
|
%apply unsigned long *INOUT { ea_t *addr };
|
||||||
|
%rename (_askaddr) askaddr;
|
||||||
|
%apply unsigned long *INOUT { sel_t *sel };
|
||||||
|
%rename (_askseg) askseg;
|
||||||
|
|
||||||
|
%pythoncode %{
|
||||||
|
def asklong(defval, format):
|
||||||
|
res, val = _idaapi._asklong(defval, format)
|
||||||
|
|
||||||
|
if res == 1:
|
||||||
|
return val
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def askaddr(defval, format):
|
||||||
|
res, ea = _idaapi._askaddr(defval, format)
|
||||||
|
|
||||||
|
if res == 1:
|
||||||
|
return ea
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def askseg(defval, format):
|
||||||
|
res, sel = _idaapi._askseg(defval, format)
|
||||||
|
|
||||||
|
if res == 1:
|
||||||
|
return sel
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
|
# This is for get_cursor()
|
||||||
|
%apply int *OUTPUT {int *x, int *y};
|
||||||
|
|
||||||
|
# This is for read_selection()
|
||||||
|
%apply unsigned long *OUTPUT { ea_t *ea1, ea_t *ea2 };
|
||||||
|
|
||||||
|
// Ignore the va_list functions
|
||||||
|
%ignore AskUsingForm_cv;
|
||||||
|
%ignore close_form;
|
||||||
|
%ignore vaskstr;
|
||||||
|
%ignore vasktext;
|
||||||
|
%ignore vwarning;
|
||||||
|
%ignore vinfo;
|
||||||
|
%ignore vnomem;
|
||||||
|
%ignore vmsg;
|
||||||
|
%ignore show_wait_box_v;
|
||||||
|
%ignore askbuttons_cv;
|
||||||
|
%ignore askfile_cv;
|
||||||
|
%ignore askyn_cv;
|
||||||
|
%ignore askyn_v;
|
||||||
|
// Ignore these string functions. There are trivial replacements in Python.
|
||||||
|
%ignore addblanks;
|
||||||
|
%ignore trim;
|
||||||
|
%ignore skipSpaces;
|
||||||
|
%ignore stristr;
|
||||||
|
|
||||||
|
|
||||||
|
%include "kernwin.hpp"
|
||||||
|
|
||||||
|
ulong choose_choose(PyObject *self,
|
||||||
|
int flags,
|
||||||
|
int x0,int y0,
|
||||||
|
int x1,int y1,
|
||||||
|
int width);
|
||||||
|
|
||||||
|
%{
|
||||||
|
ulong idaapi choose_sizer(void *self)
|
||||||
|
{
|
||||||
|
PyObject *pyres;
|
||||||
|
ulong res;
|
||||||
|
|
||||||
|
pyres = PyObject_CallMethod((PyObject *)self, "sizer", "");
|
||||||
|
res = PyInt_AsLong(pyres);
|
||||||
|
Py_DECREF(pyres);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * idaapi choose_getl(void *self, ulong n, char *buf)
|
||||||
|
{
|
||||||
|
PyObject *pyres;
|
||||||
|
char *res;
|
||||||
|
|
||||||
|
char tmp[1024];
|
||||||
|
|
||||||
|
pyres = PyObject_CallMethod((PyObject *)self, "getl", "l", n);
|
||||||
|
|
||||||
|
if (!pyres)
|
||||||
|
{
|
||||||
|
strcpy(buf, "<Empty>");
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = PyString_AsString(pyres);
|
||||||
|
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
strcpy(buf, res);
|
||||||
|
res = buf;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy(buf, "<Empty>");
|
||||||
|
res = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_DECREF(pyres);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void idaapi choose_enter(void *self, ulong n)
|
||||||
|
{
|
||||||
|
PyObject_CallMethod((PyObject *)self, "enter", "l", n);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ulong choose_choose(void *self,
|
||||||
|
int flags,
|
||||||
|
int x0,int y0,
|
||||||
|
int x1,int y1,
|
||||||
|
int width)
|
||||||
|
{
|
||||||
|
PyObject *pytitle;
|
||||||
|
|
||||||
|
char deftitle[] = "Choose";
|
||||||
|
char *title = NULL;
|
||||||
|
|
||||||
|
if ((pytitle = PyObject_GetAttrString((PyObject *)self, "title")))
|
||||||
|
{
|
||||||
|
title = PyString_AsString(pytitle);
|
||||||
|
}
|
||||||
|
|
||||||
|
return choose(
|
||||||
|
flags, // various flags: see above for description
|
||||||
|
x0, y0, // x0=-1 for autoposition
|
||||||
|
x1, y1,
|
||||||
|
self, // object to show
|
||||||
|
width, // Max width of lines
|
||||||
|
&choose_sizer, // Number of items
|
||||||
|
&choose_getl, // Description of n-th item (1..n)
|
||||||
|
// 0-th item if header line
|
||||||
|
title ? title : deftitle,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&choose_enter
|
||||||
|
); // number of the default icon to display
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
%pythoncode %{
|
||||||
|
class Choose:
|
||||||
|
"""
|
||||||
|
Choose - class for choose() with callbacks
|
||||||
|
"""
|
||||||
|
def __init__(self, list, title, flags=0):
|
||||||
|
self.list = list
|
||||||
|
self.title = title
|
||||||
|
|
||||||
|
self.flags = flags
|
||||||
|
self.x0 = -1
|
||||||
|
self.x1 = -1
|
||||||
|
self.y0 = -1
|
||||||
|
self.y1 = -1
|
||||||
|
|
||||||
|
self.width = -1
|
||||||
|
|
||||||
|
def sizer(self):
|
||||||
|
"""
|
||||||
|
Callback: sizer - returns the length of the list
|
||||||
|
"""
|
||||||
|
return len(self.list)
|
||||||
|
|
||||||
|
def getl(self, n):
|
||||||
|
"""
|
||||||
|
Callback: getl - get one item from the list
|
||||||
|
"""
|
||||||
|
if n <= len(self.list):
|
||||||
|
return self.list[n-1]
|
||||||
|
else:
|
||||||
|
return "<Empty>"
|
||||||
|
|
||||||
|
def ins(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def update(self, n):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def edit(self, n):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def enter(self, n):
|
||||||
|
print "enter(%d) called" % n
|
||||||
|
|
||||||
|
def destroy(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_icon(self, n):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def choose(self):
|
||||||
|
"""
|
||||||
|
choose - Display the choose dialogue
|
||||||
|
"""
|
||||||
|
return _idaapi.choose_choose(self, self.flags, self.x0, self.y0, self.x1, self.y1, self.width)
|
||||||
|
%}
|
||||||
|
|
63
swig/lines.i
Normal file
63
swig/lines.i
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
// Convert this for ver 4.8 tag_remove()
|
||||||
|
%cstring_output_maxstr_none(char *buf, int bufsize);
|
||||||
|
|
||||||
|
// FIXME: These should be fixed
|
||||||
|
%ignore tag_on;
|
||||||
|
%ignore tag_off;
|
||||||
|
%ignore tag_addchr;
|
||||||
|
%ignore tag_addstr;
|
||||||
|
%ignore tag_addr;
|
||||||
|
%ignore tag_advance;
|
||||||
|
%ignore tag_skipcodes;
|
||||||
|
%ignore tag_skipcode;
|
||||||
|
%ignore set_user_defined_prefix;
|
||||||
|
%ignore get_user_defined_prefix;
|
||||||
|
// Ignore va_list versions
|
||||||
|
%ignore printf_line_v;
|
||||||
|
%ignore gen_colored_cmt_line_v;
|
||||||
|
%ignore gen_cmt_line_v;
|
||||||
|
%ignore add_long_cmt_v;
|
||||||
|
%ignore describex;
|
||||||
|
// Kernel-only and unexported symbols
|
||||||
|
%ignore init_sourcefiles;
|
||||||
|
%ignore save_sourcefiles;
|
||||||
|
%ignore term_sourcefiles;
|
||||||
|
%ignore move_sourcefiles;
|
||||||
|
%ignore gen_xref_lines;
|
||||||
|
%ignore ml_getcmt_t;
|
||||||
|
%ignore ml_getnam_t;
|
||||||
|
%ignore ml_genxrf_t;
|
||||||
|
%ignore ml_saver_t;
|
||||||
|
%ignore setup_makeline;
|
||||||
|
%ignore MAKELINE_NONE;
|
||||||
|
%ignore MAKELINE_BINPREF;
|
||||||
|
%ignore MAKELINE_VOID;
|
||||||
|
%ignore MAKELINE_STACK;
|
||||||
|
%ignore save_line_in_array;
|
||||||
|
%ignore init_lines_array;
|
||||||
|
%ignore finish_makeline;
|
||||||
|
%ignore generate_disassembly;
|
||||||
|
%ignore gen_labeled_line;
|
||||||
|
%ignore gen_lname_line;
|
||||||
|
%ignore makeline_producer_t;
|
||||||
|
%ignore set_makeline_producer;
|
||||||
|
%ignore closing_comment;
|
||||||
|
%ignore close_comment;
|
||||||
|
%ignore copy_extra_lines;
|
||||||
|
%ignore ExtraLines;
|
||||||
|
%ignore ExtraKill;
|
||||||
|
%ignore ExtraFree;
|
||||||
|
%ignore Dumper;
|
||||||
|
%ignore init_lines;
|
||||||
|
%ignore save_lines;
|
||||||
|
%ignore term_lines;
|
||||||
|
%ignore gl_namedone;
|
||||||
|
%ignore data_as_stack;
|
||||||
|
%ignore calc_stack_alignment;
|
||||||
|
%ignore align_down_to_stack;
|
||||||
|
%ignore align_up_to_stack;
|
||||||
|
%ignore remove_spaces;
|
||||||
|
|
||||||
|
%include "lines.hpp"
|
||||||
|
|
||||||
|
%clear(char *buf, int bufsize);
|
123
swig/loader.i
Normal file
123
swig/loader.i
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
// Ignore callback members
|
||||||
|
%ignore loader_t::accept_file;
|
||||||
|
%ignore loader_t::load_file;
|
||||||
|
%ignore loader_t::save_file;
|
||||||
|
%ignore loader_t::move_segm;
|
||||||
|
%ignore loader_t::init_loader_options;
|
||||||
|
%ignore plugin_t::init;
|
||||||
|
%ignore plugin_t::term;
|
||||||
|
%ignore plugin_t::run;
|
||||||
|
|
||||||
|
%ignore vloader_failure;
|
||||||
|
%ignore loader_failure;
|
||||||
|
|
||||||
|
// TODO: These could be wrapped if needed
|
||||||
|
%ignore load_info_t;
|
||||||
|
%ignore build_loaders_list;
|
||||||
|
%ignore free_loaders_list;
|
||||||
|
%ignore get_loader_name_from_dll;
|
||||||
|
%ignore get_loader_name;
|
||||||
|
%ignore init_loader_options;
|
||||||
|
%ignore load_nonbinary_file;
|
||||||
|
%ignore impinfo_t;
|
||||||
|
%ignore import_module;
|
||||||
|
%ignore plugin_info_t;
|
||||||
|
%ignore get_plugins;
|
||||||
|
%ignore invoke_plugin;
|
||||||
|
%ignore dbg_info_t;
|
||||||
|
%ignore get_debugger_plugins;
|
||||||
|
%ignore init_plugins;
|
||||||
|
%ignore term_plugins;
|
||||||
|
|
||||||
|
// Callback and loader-only symbols are ignored (for now)
|
||||||
|
%ignore html_header_cb_t;
|
||||||
|
%ignore html_footer_cb_t;
|
||||||
|
%ignore html_line_cb_t;
|
||||||
|
%ignore gen_outline_t;
|
||||||
|
%ignore create_filename_cmt;
|
||||||
|
%ignore hook_cb_t;
|
||||||
|
%ignore hook_type_t;
|
||||||
|
%ignore hook_to_notification_point;
|
||||||
|
%ignore unhook_from_notification_point;
|
||||||
|
%ignore invoke_callbacks;
|
||||||
|
|
||||||
|
// Ignore kernel-only & unexported symbols
|
||||||
|
%ignore LDSC;
|
||||||
|
%ignore PLUGIN;
|
||||||
|
%ignore LNE_MAXSEG;
|
||||||
|
%ignore dlldata;
|
||||||
|
%ignore DLLDATASTART;
|
||||||
|
%ignore ldrdata;
|
||||||
|
%ignore LDRDATASTART;
|
||||||
|
%ignore idadll_t;
|
||||||
|
%ignore load_dll;
|
||||||
|
%ignore RE_NOFILE;
|
||||||
|
%ignore RE_NOTIDP;
|
||||||
|
%ignore RE_NOPAGE;
|
||||||
|
%ignore RE_NOLINK;
|
||||||
|
%ignore RE_BADRTP;
|
||||||
|
%ignore RE_BADORD;
|
||||||
|
%ignore RE_BADATP;
|
||||||
|
%ignore RE_BADMAP;
|
||||||
|
%ignore load_dll_or_die;
|
||||||
|
%ignore load_dll_or_say;
|
||||||
|
%ignore free_dll;
|
||||||
|
%ignore IDP_DESC_START;
|
||||||
|
%ignore IDP_DESC_END;
|
||||||
|
%ignore get_idp_desc;
|
||||||
|
%ignore init_fileregions;
|
||||||
|
%ignore term_fileregions;
|
||||||
|
%ignore save_fileregions;
|
||||||
|
%ignore add_fileregion;
|
||||||
|
%ignore move_fileregions;
|
||||||
|
%ignore local_gen_idc_file;
|
||||||
|
%ignore print_all_places;
|
||||||
|
%ignore save_text_line;
|
||||||
|
%ignore print_all_structs;
|
||||||
|
%ignore print_all_enums;
|
||||||
|
%ignore database_id0;
|
||||||
|
%ignore is_database_ext;
|
||||||
|
%ignore ida_database_memory;
|
||||||
|
%ignore database_flags;
|
||||||
|
%ignore DBFL_KILL;
|
||||||
|
%ignore DBFL_COMP;
|
||||||
|
%ignore DBFL_BAK;
|
||||||
|
%ignore DBFL_TEMP;
|
||||||
|
%ignore is_temp_database;
|
||||||
|
%ignore pe_create_idata;
|
||||||
|
%ignore pe_load_resources;
|
||||||
|
%ignore pe_create_flat_group;
|
||||||
|
%ignore dbcheck_t;
|
||||||
|
%ignore DBCHK_NONE;
|
||||||
|
%ignore DBCHK_OK;
|
||||||
|
%ignore DBCHK_BAD;
|
||||||
|
%ignore DBCHK_NEW;
|
||||||
|
%ignore check_database;
|
||||||
|
%ignore open_database;
|
||||||
|
%ignore flush_buffers;
|
||||||
|
%ignore save_database;
|
||||||
|
%ignore close_database;
|
||||||
|
%ignore compress_btree;
|
||||||
|
%ignore get_input_file_from_archive;
|
||||||
|
%ignore loader_move_segm;
|
||||||
|
%ignore generate_ida_copyright;
|
||||||
|
%ignore is_in_loader;
|
||||||
|
%ignore get_ids_filename;
|
||||||
|
|
||||||
|
// mem2base() has a custom wrapper
|
||||||
|
%ignore mem2base;
|
||||||
|
|
||||||
|
%include "loader.hpp"
|
||||||
|
|
||||||
|
// Custom wrapper for mem2base()
|
||||||
|
%rename (mem2base) mem2base_wrap;
|
||||||
|
%apply (char *STRING, int LENGTH) { (char *buf, int len) };
|
||||||
|
%inline %{
|
||||||
|
int mem2base_wrap(char *buf, int len, ea_t ea, long fpos)
|
||||||
|
{
|
||||||
|
return mem2base((void *)buf, ea, ea+len, fpos);
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
|
11
swig/moves.i
Normal file
11
swig/moves.i
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
// Ignore kernel only symbols
|
||||||
|
%ignore init_marks;
|
||||||
|
%ignore term_marks;
|
||||||
|
%ignore change_jumps_stack_format;
|
||||||
|
%ignore move_marks;
|
||||||
|
%ignore loc_gtag;
|
||||||
|
%ignore DEFINE_CURLOC_HELPERS;
|
||||||
|
%ignore DEFINE_LOCATION_HELPERS;
|
||||||
|
|
||||||
|
%include "moves.hpp"
|
6
swig/nalt.i
Normal file
6
swig/nalt.i
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
%ignore NALT_EA;
|
||||||
|
%ignore NALT_ULONG;
|
||||||
|
|
||||||
|
#define NALT_EA()
|
||||||
|
|
||||||
|
%include "nalt.hpp"
|
35
swig/name.i
Normal file
35
swig/name.i
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
%cstring_output_maxstr_none(char *buf, int bufsize);
|
||||||
|
|
||||||
|
%cstring_bounded_output(char *dstname, MAXSTR);
|
||||||
|
%cstring_bounded_output(char *buf, MAXSTR);
|
||||||
|
|
||||||
|
// FIXME: These should be fixed
|
||||||
|
%ignore get_name_value;
|
||||||
|
%ignore append_struct_fields;
|
||||||
|
%ignore get_struct_operand;
|
||||||
|
%ignore debug_name_how_t;
|
||||||
|
%ignore set_debug_names;
|
||||||
|
%ignore set_debug_name;
|
||||||
|
%ignore get_debug_name;
|
||||||
|
%ignore del_debug_names;
|
||||||
|
%ignore get_debug_name_ea;
|
||||||
|
%ignore nameVa;
|
||||||
|
|
||||||
|
// Unexported & kernel-only
|
||||||
|
%ignore get_short_name;
|
||||||
|
%ignore get_long_name;
|
||||||
|
%ignore get_colored_short_name;
|
||||||
|
%ignore get_colored_long_name;
|
||||||
|
%ignore addDummyName;
|
||||||
|
%ignore convert_debug_names_to_normal;
|
||||||
|
%ignore convert_name_formats;
|
||||||
|
%ignore showhide_name;
|
||||||
|
%ignore clear_lname_bit;
|
||||||
|
%ignore fix_new_name;
|
||||||
|
%ignore rename;
|
||||||
|
%ignore move_names;
|
||||||
|
%ignore is_exit_name;
|
||||||
|
%ignore dummy_name_ea;
|
||||||
|
|
||||||
|
%include "name.hpp"
|
||||||
|
|
3
swig/offset.i
Normal file
3
swig/offset.i
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
%ignore calc_probable_base;
|
||||||
|
|
||||||
|
%include "offset.hpp"
|
3
swig/pro.i
Normal file
3
swig/pro.i
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
%ignore print_all_counters;
|
||||||
|
|
||||||
|
%include "pro.h"
|
12
swig/queue.i
Normal file
12
swig/queue.i
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// TODO: This could be wrapped.
|
||||||
|
%ignore QueueGet;
|
||||||
|
|
||||||
|
// Kernel-only & unexported symbols
|
||||||
|
%ignore QueueDel;
|
||||||
|
%ignore init_queue;
|
||||||
|
%ignore save_queue;
|
||||||
|
%ignore term_queue;
|
||||||
|
%ignore move_problems;
|
||||||
|
%ignore queue_del;
|
||||||
|
|
||||||
|
%include "queue.hpp"
|
14
swig/search.i
Normal file
14
swig/search.i
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
%apply int * OUTPUT { int *opnum };
|
||||||
|
|
||||||
|
// Do not generate overloaded versions for default arguments
|
||||||
|
%feature("compactdefaultargs") find_error;
|
||||||
|
%feature("compactdefaultargs") find_notype;
|
||||||
|
%feature("compactdefaultargs") find_void;
|
||||||
|
%feature("compactdefaultargs") find_imm;
|
||||||
|
|
||||||
|
// FIXME: search() should be checked and enabled
|
||||||
|
%ignore search;
|
||||||
|
%ignore user2bin;
|
||||||
|
|
||||||
|
%include "search.hpp"
|
||||||
|
%clear int *opnum;
|
29
swig/segment.i
Normal file
29
swig/segment.i
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// FIXME: These could be fixed
|
||||||
|
%ignore getn_selector;
|
||||||
|
%ignore set_segment_translations;
|
||||||
|
%ignore del_segment_translations;
|
||||||
|
%ignore get_segment_translations;
|
||||||
|
|
||||||
|
// Ignore functions with callbacks
|
||||||
|
%ignore enumerate_selectors;
|
||||||
|
%ignore enumerate_segments_with_selector;
|
||||||
|
|
||||||
|
// Kernel-only
|
||||||
|
%ignore init_groups;
|
||||||
|
%ignore save_groups;
|
||||||
|
%ignore term_groups;
|
||||||
|
%ignore vset_segm_name;
|
||||||
|
%ignore get_segm_expr;
|
||||||
|
%ignore get_based_segm_expr;
|
||||||
|
%ignore createSegmentation;
|
||||||
|
%ignore initSegment;
|
||||||
|
%ignore save_segments;
|
||||||
|
%ignore termSegment;
|
||||||
|
%ignore DeleteAllSegments;
|
||||||
|
%ignore delete_debug_segments;
|
||||||
|
%ignore is_debugger_segm;
|
||||||
|
%ignore is_ephemeral_segm;
|
||||||
|
%ignore correct_address;
|
||||||
|
|
||||||
|
%include "segment.hpp"
|
||||||
|
|
21
swig/srarea.i
Normal file
21
swig/srarea.i
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// Ignore kernel-only symbols
|
||||||
|
%ignore createSRarea;
|
||||||
|
%ignore killSRareas;
|
||||||
|
%ignore delSRarea;
|
||||||
|
%ignore SRareaStart;
|
||||||
|
%ignore SRareaEnd;
|
||||||
|
%ignore repairSRarea;
|
||||||
|
%ignore SRinit;
|
||||||
|
%ignore SRterm;
|
||||||
|
%ignore SRsave;
|
||||||
|
|
||||||
|
#define R_es 29
|
||||||
|
#define R_cs 30
|
||||||
|
#define R_ss 31
|
||||||
|
#define R_ds 32
|
||||||
|
#define R_fs 33
|
||||||
|
#define R_gs 34
|
||||||
|
|
||||||
|
%feature("compactdefaultargs") splitSRarea1;
|
||||||
|
|
||||||
|
%include "srarea.hpp"
|
11
swig/strlist.i
Normal file
11
swig/strlist.i
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// Ignore kernel-only symbol
|
||||||
|
|
||||||
|
%ignore strwinsetup_t::setup_strings_window;
|
||||||
|
%ignore strwinsetup_t::save_config;
|
||||||
|
%ignore strwinsetup_t::restore_config;
|
||||||
|
|
||||||
|
%ignore move_strings;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
%include "strlist.hpp"
|
14
swig/struct.i
Normal file
14
swig/struct.i
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// Kernel-only symbols
|
||||||
|
%ignore init_struc;
|
||||||
|
%ignore save_struc;
|
||||||
|
%ignore term_struc;
|
||||||
|
|
||||||
|
%feature("compactdefaultargs") add_struc;
|
||||||
|
|
||||||
|
%include "struct.hpp"
|
||||||
|
// Add a get_member() member function to struc_t.
|
||||||
|
// This helps to access the members array in the class.
|
||||||
|
%extend struc_t {
|
||||||
|
member_t * get_member(int index) { return &(self->members[index]); }
|
||||||
|
}
|
||||||
|
|
82
swig/typeconv.i
Normal file
82
swig/typeconv.i
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
// Convert an incoming Python list to a tid_t[] array
|
||||||
|
%typemap(in) tid_t[ANY](tid_t temp[$1_dim0]) {
|
||||||
|
int i, len;
|
||||||
|
|
||||||
|
if (!PySequence_Check($input))
|
||||||
|
{
|
||||||
|
PyErr_SetString(PyExc_TypeError,"Expecting a sequence");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cap the number of elements to copy */
|
||||||
|
len = PySequence_Length($input) < $1_dim0 ? PySequence_Length($input) : $1_dim0;
|
||||||
|
|
||||||
|
for (i =0; i < len; i++)
|
||||||
|
{
|
||||||
|
PyObject *o = PySequence_GetItem($input,i);
|
||||||
|
if (!PyLong_Check(o))
|
||||||
|
{
|
||||||
|
Py_XDECREF(o);
|
||||||
|
PyErr_SetString(PyExc_ValueError,"Expecting a sequence of long integers");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp[i] = PyLong_AsUnsignedLong(o);
|
||||||
|
Py_DECREF(o);
|
||||||
|
}
|
||||||
|
$1 = &temp[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
%define %cstring_output_maxstr_none(TYPEMAP, SIZE)
|
||||||
|
%typemap (default) SIZE {
|
||||||
|
$1 = MAXSTR;
|
||||||
|
}
|
||||||
|
%typemap(in,numinputs=0) (TYPEMAP, SIZE) {
|
||||||
|
#ifdef __cplusplus
|
||||||
|
$1 = ($1_ltype) new char[MAXSTR+1];
|
||||||
|
#else
|
||||||
|
$1 = ($1_ltype) malloc(MAXSTR+1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
%typemap(out) ssize_t {
|
||||||
|
/* REMOVING ssize_t return value in $symname */
|
||||||
|
}
|
||||||
|
%typemap(argout) (TYPEMAP,SIZE) {
|
||||||
|
if (result > 0)
|
||||||
|
{
|
||||||
|
resultobj = PyString_FromString($1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
resultobj = Py_None;
|
||||||
|
}
|
||||||
|
#ifdef __cplusplus
|
||||||
|
delete [] $1;
|
||||||
|
#else
|
||||||
|
free($1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
%enddef
|
||||||
|
|
||||||
|
%define %cstring_bounded_output_none(TYPEMAP,MAX)
|
||||||
|
%typemap(in, numinputs=0) TYPEMAP(char temp[MAX+1]) {
|
||||||
|
$1 = ($1_ltype) temp;
|
||||||
|
}
|
||||||
|
%typemap(argout,fragment="t_output_helper") TYPEMAP {
|
||||||
|
PyObject *o;
|
||||||
|
$1[MAX] = 0;
|
||||||
|
|
||||||
|
if ($1 > 0)
|
||||||
|
{
|
||||||
|
o = PyString_FromString($1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
o = Py_None;
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
}
|
||||||
|
$result = t_output_helper($result,o);
|
||||||
|
}
|
||||||
|
%enddef
|
||||||
|
|
174
swig/typeinf.i
Normal file
174
swig/typeinf.i
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
// Most of these could be wrapped if needed
|
||||||
|
%ignore get_cc;
|
||||||
|
%ignore get_cc_type_size;
|
||||||
|
%ignore set_argloc;
|
||||||
|
%ignore set_dt;
|
||||||
|
%ignore set_da;
|
||||||
|
%ignore set_de;
|
||||||
|
%ignore get_dt;
|
||||||
|
%ignore get_da;
|
||||||
|
%ignore get_de;
|
||||||
|
%ignore skip_ptr_type_header;
|
||||||
|
%ignore skip_array_type_header;
|
||||||
|
%ignore typend;
|
||||||
|
%ignore typlen;
|
||||||
|
%ignore typncpy;
|
||||||
|
%ignore tppncpy;
|
||||||
|
%ignore typcmp;
|
||||||
|
%ignore typdup;
|
||||||
|
%ignore equal_types;
|
||||||
|
%ignore resolve_typedef;
|
||||||
|
%ignore is_resolved_type_const;
|
||||||
|
%ignore is_resolved_type_void;
|
||||||
|
%ignore is_resolved_type_ptr;
|
||||||
|
%ignore is_resolved_type_func;
|
||||||
|
%ignore is_resolved_type_array;
|
||||||
|
%ignore is_resolved_type_complex;
|
||||||
|
%ignore is_resolved_type_struct;
|
||||||
|
%ignore is_resolved_type_union;
|
||||||
|
%ignore is_resolved_type_enum;
|
||||||
|
%ignore is_resolved_type_bitfld;
|
||||||
|
%ignore is_castable;
|
||||||
|
%ignore remove_constness;
|
||||||
|
%ignore remove_pointerness;
|
||||||
|
%ignore get_int_type_bit;
|
||||||
|
%ignore get_unk_type_bit;
|
||||||
|
%ignore tns;
|
||||||
|
|
||||||
|
%ignore til_t::base;
|
||||||
|
%ignore til_t::syms;
|
||||||
|
%ignore til_t::types;
|
||||||
|
%ignore til_t::macros;
|
||||||
|
|
||||||
|
%ignore add_base_tils;
|
||||||
|
%ignore sort_til;
|
||||||
|
%ignore til_add_macro;
|
||||||
|
%ignore til_next_macro;
|
||||||
|
|
||||||
|
%ignore get_type_size;
|
||||||
|
%ignore get_type_size0;
|
||||||
|
%ignore skip_type;
|
||||||
|
%ignore get_pointer_object_size;
|
||||||
|
|
||||||
|
%ignore descr_t;
|
||||||
|
|
||||||
|
%ignore unpack_type;
|
||||||
|
%ignore print_type_to_one_line;
|
||||||
|
%ignore print_type_to_many_lines;
|
||||||
|
%ignore print_type;
|
||||||
|
%ignore show_type;
|
||||||
|
%ignore show_plist;
|
||||||
|
|
||||||
|
%ignore extract_pstr;
|
||||||
|
%ignore extract_name;
|
||||||
|
%ignore skipName;
|
||||||
|
%ignore extract_comment;
|
||||||
|
%ignore skipComment;
|
||||||
|
%ignore extract_fargcmt;
|
||||||
|
%ignore skip_argloc;
|
||||||
|
%ignore extract_argloc;
|
||||||
|
|
||||||
|
%ignore h2ti;
|
||||||
|
%ignore h2ti_warning;
|
||||||
|
%ignore parse_type;
|
||||||
|
%ignore parse_types;
|
||||||
|
%ignore get_named_type;
|
||||||
|
|
||||||
|
%ignore set_named_type;
|
||||||
|
%ignore get_named_type_size;
|
||||||
|
|
||||||
|
%ignore decorate_name;
|
||||||
|
%ignore gen_decorate_name;
|
||||||
|
%ignore calc_bare_name;
|
||||||
|
%ignore predicate_t;
|
||||||
|
%ignore choose_named_type;
|
||||||
|
%ignore get_default_align;
|
||||||
|
%ignore align_size;
|
||||||
|
%ignore align_size;
|
||||||
|
%ignore get_default_enum_size;
|
||||||
|
%ignore max_ptr_size;
|
||||||
|
%ignore based_ptr_name_and_size;
|
||||||
|
%ignore calc_arglocs;
|
||||||
|
|
||||||
|
%ignore apply_type;
|
||||||
|
%ignore apply_callee_type;
|
||||||
|
%ignore guess_func_type;
|
||||||
|
%ignore guess_type;
|
||||||
|
|
||||||
|
%ignore build_funcarg_arrays;
|
||||||
|
%ignore free_funcarg_arrays;
|
||||||
|
%ignore extract_func_ret_type;
|
||||||
|
%ignore calc_names_cmts;
|
||||||
|
%ignore resolve_complex_type;
|
||||||
|
%ignore foreach_strmem;
|
||||||
|
%ignore is_type_scalar;
|
||||||
|
%ignore get_type_signness;
|
||||||
|
%ignore is_type_signed;
|
||||||
|
%ignore is_type_unsigned;
|
||||||
|
%ignore get_struct_member;
|
||||||
|
%ignore idb_type_to_til;
|
||||||
|
%ignore get_idb_type;
|
||||||
|
%ignore apply_type_to_stkarg;
|
||||||
|
%ignore use_regarg_type_cb;
|
||||||
|
%ignore set_op_type_t;
|
||||||
|
%ignore is_stkarg_load_t;
|
||||||
|
%ignore has_delay_slot_t;
|
||||||
|
%ignore gen_use_arg_types;
|
||||||
|
|
||||||
|
// Kernel-only symbols
|
||||||
|
%ignore init_til;
|
||||||
|
%ignore save_til;
|
||||||
|
%ignore term_til;
|
||||||
|
%ignore determine_til;
|
||||||
|
%ignore get_tilpath;
|
||||||
|
%ignore autoload_til;
|
||||||
|
%ignore get_idainfo_by_type;
|
||||||
|
%ignore apply_callee_type;
|
||||||
|
%ignore propagate_stkargs;
|
||||||
|
%ignore build_anon_type_name;
|
||||||
|
%ignore type_names;
|
||||||
|
%ignore get_compiler_id;
|
||||||
|
|
||||||
|
%include "typeinf.hpp"
|
||||||
|
|
||||||
|
// Custom wrappers
|
||||||
|
|
||||||
|
%rename (load_til) load_til_wrap;
|
||||||
|
%inline %{
|
||||||
|
til_t * load_til(const char *tildir, const char *name)
|
||||||
|
{
|
||||||
|
char errbuf[4096];
|
||||||
|
til_t *res;
|
||||||
|
|
||||||
|
res = load_til(tildir, name, errbuf, sizeof(errbuf));
|
||||||
|
|
||||||
|
if (!res)
|
||||||
|
{
|
||||||
|
PyErr_SetString(PyExc_RuntimeError, errbuf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
%rename (load_til_header_wrap) load_til_header_wrap;
|
||||||
|
%inline %{
|
||||||
|
til_t * load_til_header_wrap(const char *tildir, const char *name)
|
||||||
|
{
|
||||||
|
char errbuf[4096];
|
||||||
|
til_t *res;
|
||||||
|
|
||||||
|
res = load_til_header(tildir, name, errbuf, sizeof(errbuf));;
|
||||||
|
|
||||||
|
if (!res)
|
||||||
|
{
|
||||||
|
PyErr_SetString(PyExc_RuntimeError, errbuf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
27
swig/ua.i
Normal file
27
swig/ua.i
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// Include the patched header
|
||||||
|
// All the unchecked declarations are between
|
||||||
|
// #ifndef SWIG
|
||||||
|
%include "ua.hpp"
|
||||||
|
|
||||||
|
// Small function to get the global cmd pointer
|
||||||
|
// In Python it returns an insn_t class instance
|
||||||
|
%inline {
|
||||||
|
insn_t * get_current_instruction()
|
||||||
|
{
|
||||||
|
return &cmd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the nth operand from the insn_t class
|
||||||
|
%inline {
|
||||||
|
op_t *get_instruction_operand(insn_t *ins, int n)
|
||||||
|
{
|
||||||
|
if (!ins)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &(ins->Operands[n]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
22
swig/xref.i
Normal file
22
swig/xref.i
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// Ignore kernel-only functions and variables
|
||||||
|
%ignore create_xrefs_from;
|
||||||
|
%ignore create_xrefs_from_data;
|
||||||
|
%ignore delete_all_xrefs_from;
|
||||||
|
%ignore delete_data_xrefs_from;
|
||||||
|
%ignore delete_code_xrefs_from;
|
||||||
|
%ignore destroy_if_align;
|
||||||
|
%ignore lastXR;
|
||||||
|
%ignore has_jump_or_flow_xref;
|
||||||
|
%ignore has_call_xref;
|
||||||
|
%ignore destroy_switch_info;
|
||||||
|
|
||||||
|
// These functions should not be called directly (according to docs)
|
||||||
|
%ignore xrefblk_t_first_from;
|
||||||
|
%ignore xrefblk_t_next_from;
|
||||||
|
%ignore xrefblk_t_first_to;
|
||||||
|
%ignore xrefblk_t_next_to;
|
||||||
|
|
||||||
|
// 'from' is a reserved Python keyword
|
||||||
|
%rename (frm) from;
|
||||||
|
|
||||||
|
%include "xref.hpp"
|
Loading…
Reference in New Issue
Block a user