Tabs converted to 4 spaces in Python sources.

This commit is contained in:
gergely.erdelyi 2008-06-15 14:39:43 +00:00
parent 921d57098a
commit 398ffdae3a
3 changed files with 3691 additions and 3691 deletions

View File

@ -14,340 +14,340 @@ idautils.py - High level utility functions for IDA
import idaapi import idaapi
def refs(ea, funcfirst, funcnext): def refs(ea, funcfirst, funcnext):
""" """
Generic reference collector - INTERNAL USE ONLY. Generic reference collector - INTERNAL USE ONLY.
""" """
reflist = [] reflist = []
ref = funcfirst(ea) ref = funcfirst(ea)
if ref != idaapi.BADADDR: if ref != idaapi.BADADDR:
reflist.append(ref) reflist.append(ref)
while 1: while 1:
ref = funcnext(ea, ref) ref = funcnext(ea, ref)
if ref == idaapi.BADADDR: if ref == idaapi.BADADDR:
break break
else: else:
reflist.append(ref) reflist.append(ref)
return reflist return reflist
def CodeRefsTo(ea, flow): def CodeRefsTo(ea, flow):
""" """
Get a list of code references to 'ea' Get a list of code references to 'ea'
@param ea: Target address @param ea: Target address
@param flow: Follow normal code flow or not @param flow: Follow normal code flow or not
@type flow: Boolean (0/1, False/True) @type flow: Boolean (0/1, False/True)
@return: list of references (may be empty list) @return: list of references (may be empty list)
Example:: Example::
for ref in CodeRefsTo(ScreenEA(), 1): for ref in CodeRefsTo(ScreenEA(), 1):
print ref print ref
""" """
if flow == 1: if flow == 1:
return refs(ea, idaapi.get_first_cref_to, idaapi.get_next_cref_to) return refs(ea, idaapi.get_first_cref_to, idaapi.get_next_cref_to)
else: else:
return refs(ea, idaapi.get_first_fcref_to, idaapi.get_next_fcref_to) return refs(ea, idaapi.get_first_fcref_to, idaapi.get_next_fcref_to)
def CodeRefsFrom(ea, flow): def CodeRefsFrom(ea, flow):
""" """
Get a list of code references from 'ea' Get a list of code references from 'ea'
@param ea: Target address @param ea: Target address
@param flow: Follow normal code flow or not @param flow: Follow normal code flow or not
@type flow: Boolean (0/1, False/True) @type flow: Boolean (0/1, False/True)
@return: list of references (may be empty list) @return: list of references (may be empty list)
Example:: Example::
for ref in CodeRefsFrom(ScreenEA(), 1): for ref in CodeRefsFrom(ScreenEA(), 1):
print ref print ref
""" """
if flow == 1: if flow == 1:
return refs(ea, idaapi.get_first_cref_from, idaapi.get_next_cref_from) return refs(ea, idaapi.get_first_cref_from, idaapi.get_next_cref_from)
else: else:
return refs(ea, idaapi.get_first_fcref_from, idaapi.get_next_fcref_from) return refs(ea, idaapi.get_first_fcref_from, idaapi.get_next_fcref_from)
def DataRefsTo(ea): def DataRefsTo(ea):
""" """
Get a list of data references to 'ea' Get a list of data references to 'ea'
@param ea: Target address @param ea: Target address
@return: list of references (may be empty list) @return: list of references (may be empty list)
Example:: Example::
for ref in DataRefsTo(ScreenEA(), 1): for ref in DataRefsTo(ScreenEA(), 1):
print ref print ref
""" """
return refs(ea, idaapi.get_first_dref_to, idaapi.get_next_dref_to) return refs(ea, idaapi.get_first_dref_to, idaapi.get_next_dref_to)
def DataRefsFrom(ea): def DataRefsFrom(ea):
""" """
Get a list of data references from 'ea' Get a list of data references from 'ea'
@param ea: Target address @param ea: Target address
@return: list of references (may be empty list) @return: list of references (may be empty list)
Example:: Example::
for ref in DataRefsFrom(ScreenEA(), 1): for ref in DataRefsFrom(ScreenEA(), 1):
print ref print ref
""" """
return refs(ea, idaapi.get_first_dref_from, idaapi.get_next_dref_from) return refs(ea, idaapi.get_first_dref_from, idaapi.get_next_dref_from)
def XrefTypeName(typecode): def XrefTypeName(typecode):
""" """
Convert cross-reference type codes to readable names Convert cross-reference type codes to readable names
@param typecode: cross-reference type code @param typecode: cross-reference type code
""" """
ref_types = { ref_types = {
0 : 'Data_Unknown', 0 : 'Data_Unknown',
1 : 'Data_Offset', 1 : 'Data_Offset',
2 : 'Data_Write', 2 : 'Data_Write',
3 : 'Data_Read', 3 : 'Data_Read',
4 : 'Data_Text', 4 : 'Data_Text',
5 : 'Data_Informational', 5 : 'Data_Informational',
16 : 'Code_Far_Call', 16 : 'Code_Far_Call',
17 : 'Code_Near_Call', 17 : 'Code_Near_Call',
18 : 'Code_Far_Jump', 18 : 'Code_Far_Jump',
19 : 'Code_Near_Jump', 19 : 'Code_Near_Jump',
20 : 'Code_User', 20 : 'Code_User',
21 : 'Ordinary_Flow' 21 : 'Ordinary_Flow'
} }
assert typecode in ref_types, "unknown reference type %d" % typecode assert typecode in ref_types, "unknown reference type %d" % typecode
return ref_types[typecode] return ref_types[typecode]
def XrefsFrom(ea, flags=0): def XrefsFrom(ea, flags=0):
""" """
Return all references from address 'ea' Return all references from address 'ea'
@param ea: Reference address @param ea: Reference address
@param flags: any of idaapi.XREF_* flags @param flags: any of idaapi.XREF_* flags
Example: Example:
for xref in XrefsFrom(here(), 0): for xref in XrefsFrom(here(), 0):
print xref.type, XrefTypeName(xref.type), \ print xref.type, XrefTypeName(xref.type), \
'from', hex(xref.frm), 'to', hex(xref.to) 'from', hex(xref.frm), 'to', hex(xref.to)
""" """
xref = idaapi.xrefblk_t() xref = idaapi.xrefblk_t()
if xref.first_from(ea, flags): if xref.first_from(ea, flags):
yield xref yield xref
while xref.next_from(): while xref.next_from():
yield xref yield xref
def XrefsTo(ea, flags=0): def XrefsTo(ea, flags=0):
""" """
Return all references to address 'ea' Return all references to address 'ea'
@param ea: Reference address @param ea: Reference address
@param flags: any of idaapi.XREF_* flags @param flags: any of idaapi.XREF_* flags
Example: Example:
for xref in XrefsTo(here(), 0): for xref in XrefsTo(here(), 0):
print xref.type, XrefTypeName(xref.type), \ print xref.type, XrefTypeName(xref.type), \
'from', hex(xref.frm), 'to', hex(xref.to) 'from', hex(xref.frm), 'to', hex(xref.to)
""" """
xref = idaapi.xrefblk_t() xref = idaapi.xrefblk_t()
if xref.first_to(ea, flags): if xref.first_to(ea, flags):
yield xref yield xref
while xref.next_to(): while xref.next_to():
yield xref yield xref
def Heads(start, end): def Heads(start, end):
""" """
Get a list of heads (instructions or data) Get a list of heads (instructions or data)
@param start: start address (this one is always included) @param start: start address (this one is always included)
@param end: end address @param end: end address
@return: list of heads between start and end @return: list of heads between start and end
""" """
headlist = [] headlist = []
headlist.append(start) headlist.append(start)
ea = start ea = start
while 1: while 1:
ea = idaapi.next_head(ea, end) ea = idaapi.next_head(ea, end)
if ea == idaapi.BADADDR: if ea == idaapi.BADADDR:
break break
else: else:
headlist.append(ea) headlist.append(ea)
return headlist return headlist
def Functions(start, end): def Functions(start, end):
""" """
Get a list of functions Get a list of functions
@param start: start address @param start: start address
@param end: end address @param end: end address
@return: list of heads between start and end @return: list of heads between start and end
@note: The last function that starts before 'end' is included even @note: The last function that starts before 'end' is included even
if it extends beyond 'end'. if it extends beyond 'end'.
""" """
startaddr = start startaddr = start
endaddr = end endaddr = end
funclist = [] funclist = []
func = idaapi.get_func(start) func = idaapi.get_func(start)
if func: if func:
funclist.append(func.startEA) funclist.append(func.startEA)
ea = start ea = start
while 1: while 1:
func = idaapi.get_next_func(ea) func = idaapi.get_next_func(ea)
if not func: break if not func: break
if func.startEA < end: if func.startEA < end:
funclist.append(func.startEA) funclist.append(func.startEA)
ea = func.startEA ea = func.startEA
else: else:
break break
return funclist return funclist
def Chunks(start): def Chunks(start):
""" """
Get a list of function chunks Get a list of function chunks
@param start: address of the function @param start: address of the function
@return: list of funcion chunks (tuples of the form (start_ea, end_ea)) @return: list of funcion chunks (tuples of the form (start_ea, end_ea))
belonging to the function belonging to the function
""" """
function_chunks = [] function_chunks = []
func_iter = idaapi.func_tail_iterator_t( idaapi.get_func( start ) ) func_iter = idaapi.func_tail_iterator_t( idaapi.get_func( start ) )
status = func_iter.main() status = func_iter.main()
while status: while status:
chunk = func_iter.chunk() chunk = func_iter.chunk()
function_chunks.append((chunk.startEA, chunk.endEA)) function_chunks.append((chunk.startEA, chunk.endEA))
status = func_iter.next() status = func_iter.next()
return function_chunks return function_chunks
def Segments(): def Segments():
""" """
Get list of segments (sections) in the binary image Get list of segments (sections) in the binary image
@return: List of segment start addresses. @return: List of segment start addresses.
""" """
seglist = [] seglist = []
for n in range(idaapi.get_segm_qty()): for n in range(idaapi.get_segm_qty()):
seg = idaapi.getnseg(n) seg = idaapi.getnseg(n)
if not seg: if not seg:
break break
else: else:
seglist.append(seg.startEA) seglist.append(seg.startEA)
return seglist return seglist
def GetDataList(ea, count, itemsize=1): def GetDataList(ea, count, itemsize=1):
""" """
Get data list - INTERNAL USE ONLY Get data list - INTERNAL USE ONLY
""" """
getdata = None getdata = None
if itemsize == 1: if itemsize == 1:
getdata = idaapi.get_byte getdata = idaapi.get_byte
if itemsize == 2: if itemsize == 2:
getdata = idaapi.get_word getdata = idaapi.get_word
if itemsize == 4: if itemsize == 4:
getdata = idaapi.get_dword getdata = idaapi.get_dword
if getdata == None: if getdata == None:
raise ValueError, "Invalid data size! Must be 1, 2 or 4" raise ValueError, "Invalid data size! Must be 1, 2 or 4"
list = [] list = []
for offs in range(count): for offs in range(count):
list.append(getdata(ea)) list.append(getdata(ea))
ea = ea + itemsize ea = ea + itemsize
return list return list
def PutDataList(ea, list, itemsize=1): def PutDataList(ea, list, itemsize=1):
""" """
Put data list - INTERNAL USE ONLY Put data list - INTERNAL USE ONLY
""" """
putdata = None putdata = None
if itemsize == 1: if itemsize == 1:
putdata = idaapi.patch_byte putdata = idaapi.patch_byte
if itemsize == 2: if itemsize == 2:
putdata = idaapi.patch_word putdata = idaapi.patch_word
if itemsize == 4: if itemsize == 4:
putdata = idaapi.patch_dword putdata = idaapi.patch_dword
if putdata == None: if putdata == None:
raise ValueError, "Invalid data size! Must be 1, 2 or 4" raise ValueError, "Invalid data size! Must be 1, 2 or 4"
for val in list: for val in list:
putdata(ea, val) putdata(ea, val)
ea = ea + itemsize ea = ea + itemsize
def MapDataList(ea, length, func, wordsize=1): def MapDataList(ea, length, func, wordsize=1):
""" """
Map through a list of data words in the database Map through a list of data words in the database
@param ea: start address @param ea: start address
@param length: number of words to map @param length: number of words to map
@param func: mapping function @param func: mapping function
@param wordsize: size of words to map [default: 1 byte] @param wordsize: size of words to map [default: 1 byte]
@return: None @return: None
""" """
PutDataList(ea, map(func, GetDataList(ea, length, wordsize)), wordsize) PutDataList(ea, map(func, GetDataList(ea, length, wordsize)), wordsize)
def GetInputFileMD5(): def GetInputFileMD5():
""" """
Return the MD5 hash of the input binary file Return the MD5 hash of the input binary file
@return: MD5 string or None on error @return: MD5 string or None on error
""" """
ua=idaapi.ucharArray(16) ua=idaapi.ucharArray(16)
if idaapi.retrieve_input_file_md5(ua.cast()): if idaapi.retrieve_input_file_md5(ua.cast()):
md5str="" md5str=""
for i in range(16): for i in range(16):
md5str += "%02x" % ua[i] md5str += "%02x" % ua[i]
return md5str return md5str
else: else:
return None return None

File diff suppressed because it is too large Load Diff

View File

@ -19,65 +19,65 @@ warnings.filterwarnings('ignore', category=FutureWarning)
def addscriptpath(script): def addscriptpath(script):
""" """
Add the path part of the scriptfile to the system path to Add the path part of the scriptfile to the system path to
allow modules to be loaded from the same place. allow modules to be loaded from the same place.
Each path is added only once. Each path is added only once.
""" """
pathfound = 0 pathfound = 0
scriptpath = os.path.dirname(script) scriptpath = os.path.dirname(script)
for pathitem in sys.path: for pathitem in sys.path:
if pathitem == scriptpath: if pathitem == scriptpath:
pathfound = 1 pathfound = 1
break break
if pathfound == 0: if pathfound == 0:
sys.path.append(scriptpath) sys.path.append(scriptpath)
# Add the script to ScriptBox if it's not there yet # Add the script to ScriptBox if it's not there yet
if not script in ScriptBox_instance.list: if not script in ScriptBox_instance.list:
ScriptBox_instance.list.insert(0, script) ScriptBox_instance.list.insert(0, script)
def runscript(script): def runscript(script):
""" """
Run the specified script after adding its directory path to Run the specified script after adding its directory path to
system path. system path.
This function is used by the low-level plugin code. This function is used by the low-level plugin code.
""" """
addscriptpath(script) addscriptpath(script)
argv = sys.argv argv = sys.argv
sys.argv = [ script ] sys.argv = [ script ]
execfile(script, globals()) execfile(script, globals())
sys.argv = argv sys.argv = argv
def print_banner(): def print_banner():
version1 = "IDAPython version %d.%d.%d %s (serial %d) initialized" % IDAPYTHON_VERSION 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 version2 = "Python interpreter version %d.%d.%d %s (serial %d)" % sys.version_info
linelen = max(len(version1), len(version2)) linelen = max(len(version1), len(version2))
print '-' * linelen print '-' * linelen
print version1 print version1
print version2 print version2
print '-' * linelen print '-' * linelen
#----------------------------------------------------------- #-----------------------------------------------------------
# Take over the standard text outputs # Take over the standard text outputs
#----------------------------------------------------------- #-----------------------------------------------------------
class MyStdOut: class MyStdOut:
""" """
Dummy file-like class that receives stout and stderr Dummy file-like class that receives stout and stderr
""" """
def write(self, text): def write(self, text):
_idaapi.msg(text.replace("%", "%%")) _idaapi.msg(text.replace("%", "%%"))
def flush(self): def flush(self):
pass pass
# Redirect stderr and stdout to the IDA message window # Redirect stderr and stdout to the IDA message window
@ -103,24 +103,24 @@ from idautils import *
# Build up the ScriptBox tool # Build up the ScriptBox tool
#----------------------------------------------------------- #-----------------------------------------------------------
class ScriptBox(Choose): class ScriptBox(Choose):
def __init__(self, list=[]): def __init__(self, list=[]):
Choose.__init__(self, list, "ScriptBox", 1) Choose.__init__(self, list, "ScriptBox", 1)
self.width = 50 self.width = 50
def run(self): def run(self):
if len(self.list) == 0: if len(self.list) == 0:
Warning("ScriptBox history is empty.\nRun some script with Alt-9 and try again.") Warning("ScriptBox history is empty.\nRun some script with Alt-9 and try again.")
return None return None
n = self.choose() n = self.choose()
if n > 0: if n > 0:
return self.list[n-1] return self.list[n-1]
else: else:
return None return None
def addscript(self, scriptpath): def addscript(self, scriptpath):
self.list.append(scriptpath) self.list.append(scriptpath)
ScriptBox_instance = ScriptBox([]) ScriptBox_instance = ScriptBox([])
@ -128,9 +128,9 @@ ScriptBox_instance = ScriptBox([])
userrc = get_user_idadir() + os.sep + "idapythonrc.py" userrc = get_user_idadir() + os.sep + "idapythonrc.py"
if os.path.exists(userrc): if os.path.exists(userrc):
runscript(userrc) runscript(userrc)
# Remove the user script from the history # Remove the user script from the history
del ScriptBox_instance.list[0] del ScriptBox_instance.list[0]
# All done, ready to rock. # All done, ready to rock.