From ce86eb9fa259f9cbc31ec772a896661f5b8340be Mon Sep 17 00:00:00 2001 From: tnballo Date: Tue, 17 Nov 2020 15:21:27 -0500 Subject: [PATCH] Update low-level RPC API for Py3 --- README.md | 2 +- src/bap/rpc.py | 19 +++++++++---------- tests/test_low_level_interface.py | 13 +++++++++++++ 3 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 tests/test_low_level_interface.py diff --git a/README.md b/README.md index 44d2e4f..70ac78b 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Installation section). ```python >>> import bap - >>> print '\n'.join(insn.asm for insn in bap.disasm("\x48\x83\xec\x08")) + >>> print '\n'.join(insn.asm for insn in bap.disasm(b"\x48\x83\xec\x08")) decl %eax subl $0x8, %esp ``` diff --git a/src/bap/rpc.py b/src/bap/rpc.py index 8ac0c1b..d182517 100644 --- a/src/bap/rpc.py +++ b/src/bap/rpc.py @@ -171,7 +171,7 @@ def load_symbols(self): def get_symbol(self, name, d=None): try: - return (s for s in self.symbols if s.name == name).next() + return next(s for s in self.symbols if s.name == name) except StopIteration: return d @@ -214,8 +214,8 @@ def __init__(self, mem, parent): def load_data(self): try: - url = (urlparse(url) for url in self.links - if urlparse(url).scheme == 'mmap').next() + url = next(urlparse(url) for url in self.links + if urlparse(url).scheme == 'mmap') qs = parse_qs(url.query) offset = int(qs['offset'][0]) with open(url.path, "rw+b") as f: @@ -266,8 +266,8 @@ def __init__(self, server={}): self.last_id = 0 for attempt in range(RETRIES): try: - self.capabilities = self.call({'init' : { - 'version' : '0.1'}}).next()['capabilities'] + self.capabilities = next(self.call({'init' : { + 'version' : '0.1'}}))['capabilities'] break except Exception: if attempt + 1 == RETRIES: @@ -278,7 +278,7 @@ def __init__(self, server={}): if not "capabilities" in self.__dict__: raise RuntimeError("Failed to connect to BAP server") self.data = {} - self.temp = NamedTemporaryFile('rw+b', prefix="bap-") + self.temp = NamedTemporaryFile('w+b', prefix="bap-") def insns(self, src, **kwargs): req = {'resource' : src} @@ -300,7 +300,7 @@ def load_file(self, name): 'url' : 'file://' + name}}) def get_resource(self, name): - return self.call({'get_resource' : name}).next() + return next(self.call({'get_resource' : name})) def load_chunk(self, data, **kwargs): kwargs.setdefault('url', self.mmap(data)) @@ -341,14 +341,13 @@ def mmap(self, data): return url def _load_resource(self, res): - rep = self.call(res).next() + rep = next(self.call(res)) if 'error' in rep: raise ServerError(rep) return Id(rep['resource']) - def jsons(r, p=0): - dec = json.JSONDecoder(encoding='utf-8') + dec = json.JSONDecoder() while True: obj,p = dec.scan_once(r.text,p) yield obj diff --git a/tests/test_low_level_interface.py b/tests/test_low_level_interface.py new file mode 100644 index 0000000..261097f --- /dev/null +++ b/tests/test_low_level_interface.py @@ -0,0 +1,13 @@ +import unittest +import bap + +class TestLowLevelInterface(unittest.TestCase): + + def test_low_level_interface(self): + asm_str = '\n'.join(insn.asm for insn in bap.disasm(b"\x48\x83\xec\x08")) + self.assertIsNotNone(asm_str) + self.assertIn("\tdecl\t%eax", asm_str) + self.assertIn("\tsubl\t$0x8, %esp", asm_str) + +if __name__ == "__main__": + unittest.main() \ No newline at end of file