diff --git a/ida_script.py b/ida_script.py index 3bc4abb73..8f0844a73 100644 --- a/ida_script.py +++ b/ida_script.py @@ -1,7 +1,7 @@ import idaapi import idautils import idc - +import functools import datetime import threading import xmlrpclib @@ -13,8 +13,7 @@ idc.SaveBase(idc.GetIdbPath() + '.' + datetime.datetime.now().isoformat()) xmlrpclib.Marshaller.dispatch[type(0L)] = lambda _, v, w: w("%d" % v) xmlrpclib.Marshaller.dispatch[type(0)] = lambda _, v, w: w("%d" % v) -port = 8888 - +port = 8888 orig_LineA = idc.LineA def LineA(*a,**kw): @@ -25,10 +24,25 @@ def LineA(*a,**kw): idc.LineA = LineA +mutex = threading.Condition() + +def wrap(f): + def wrapper(*a, **kw): + try: + rv = [] + def work(): rv.append(f(*a,**kw)) + with mutex: idaapi.execute_sync(work, idaapi.MFF_WRITE) + return rv[0] + except: + import traceback + traceback.print_exc() + raise + return wrapper + def register_module(module): for name, function in module.__dict__.items(): if hasattr(function, '__call__'): - server.register_function(function, name) + server.register_function(wrap(function), name) server = SimpleXMLRPCServer(('127.0.0.1', port), logRequests=True, allow_none=True) register_module(idc) diff --git a/pwndbg/ida.py b/pwndbg/ida.py index abbf9da84..85d9c8908 100644 --- a/pwndbg/ida.py +++ b/pwndbg/ida.py @@ -5,8 +5,10 @@ Talks to an XMLRPC server running inside of an active IDA Pro instance, in order to query it about the database. Allows symbol resolution and interactive debugging. """ +import errno import functools import socket +import traceback from contextlib import closing import gdb @@ -35,20 +37,25 @@ _ida = None xmlrpclib.Marshaller.dispatch[type(0)] = lambda _, v, w: w("%d" % v) - def setPort(port): global _ida _ida = xmlrpclib.ServerProxy('http://localhost:%s' % port) - try: _ida.here() - except: _ida = None - -setPort(8888) + try: + _ida.here() + except socket.error as e: + if e.errno != errno.ECONNREFUSED: + traceback.print_exc() + _ida = None class withIDA(object): def __init__(self, fn): self.fn = fn functools.update_wrapper(self, fn) def __call__(self, *args, **kwargs): + # import pdb + # pdb.set_trace() + if _ida is None: + setPort(8888) if _ida is not None: return self.fn(*args, **kwargs) return None