- Avoid confusions with the name :) --HG-- rename : swig/Makefile => r2-bindings/Makefile rename : swig/README => r2-bindings/README rename : swig/autogen.sh => r2-bindings/autogen.sh rename : swig/check-langs.sh => r2-bindings/check-langs.sh rename : swig/config.mk.acr => r2-bindings/config.mk.acr rename : swig/configure => r2-bindings/configure rename : swig/configure.acr => r2-bindings/configure.acr rename : swig/cxx/Makefile => r2-bindings/cxx/Makefile rename : swig/do-swig.sh => r2-bindings/do-swig.sh rename : swig/do-test.sh => r2-bindings/do-test.sh rename : swig/go/Makefile => r2-bindings/go/Makefile rename : swig/go/fixgoswig.sh => r2-bindings/go/fixgoswig.sh rename : swig/go/test-r_bin.go => r2-bindings/go/test-r_bin.go rename : swig/guile/Makefile => r2-bindings/guile/Makefile rename : swig/guile/test-asm.scm => r2-bindings/guile/test-asm.scm rename : swig/guile/test-util.scm => r2-bindings/guile/test-util.scm rename : swig/guile/vapi.patch => r2-bindings/guile/vapi.patch rename : swig/java/Makefile => r2-bindings/java/Makefile rename : swig/java/TestRBin.java => r2-bindings/java/TestRBin.java rename : swig/lua/Makefile => r2-bindings/lua/Makefile rename : swig/lua/test-r_asm.lua => r2-bindings/lua/test-r_asm.lua rename : swig/lua/test-r_bin.lua => r2-bindings/lua/test-r_bin.lua rename : swig/lua/test-r_bp.lua => r2-bindings/lua/test-r_bp.lua rename : swig/lua/test-r_core.lua => r2-bindings/lua/test-r_core.lua rename : swig/perl/Makefile => r2-bindings/perl/Makefile rename : swig/perl/test-r_asm.pl => r2-bindings/perl/test-r_asm.pl rename : swig/perl/test-r_bin.pl => r2-bindings/perl/test-r_bin.pl rename : swig/perl/test-r_bp.pl => r2-bindings/perl/test-r_bp.pl rename : swig/python-config-wrapper => r2-bindings/python-config-wrapper rename : swig/python/Makefile => r2-bindings/python/Makefile rename : swig/python/r_cons.i.experimental => r2-bindings/python/r_cons.i.experimental rename : swig/python/remote.py => r2-bindings/python/remote.py rename : swig/python/test-r2rc.py => r2-bindings/python/test-r2rc.py rename : swig/python/test-r_asm.py => r2-bindings/python/test-r_asm.py rename : swig/python/test-r_bin.py => r2-bindings/python/test-r_bin.py rename : swig/python/test-r_bp.py => r2-bindings/python/test-r_bp.py rename : swig/python/test-r_bp2.py => r2-bindings/python/test-r_bp2.py rename : swig/python/test-r_cons.py => r2-bindings/python/test-r_cons.py rename : swig/python/test-r_core.py => r2-bindings/python/test-r_core.py rename : swig/python/test-r_flags.py => r2-bindings/python/test-r_flags.py rename : swig/python/test-r_hash.py => r2-bindings/python/test-r_hash.py rename : swig/python/test-r_num.py => r2-bindings/python/test-r_num.py rename : swig/python/test-r_util.py => r2-bindings/python/test-r_util.py rename : swig/python/test-ragdiff2.py => r2-bindings/python/test-ragdiff2.py rename : swig/ruby/Makefile => r2-bindings/ruby/Makefile rename : swig/ruby/test-r_bin.rb => r2-bindings/ruby/test-r_bin.rb rename : swig/ruby/test-r_bp.rb => r2-bindings/ruby/test-r_bp.rb rename : swig/ruby/test-r_core.rb => r2-bindings/ruby/test-r_core.rb rename : swig/rules.mk => r2-bindings/rules.mk rename : swig/vapi/libr.deps => r2-bindings/vapi/libr.deps rename : swig/vapi/libr.vapi => r2-bindings/vapi/libr.vapi rename : swig/vapi/r_anal.deps => r2-bindings/vapi/r_anal.deps rename : swig/vapi/r_anal.vapi => r2-bindings/vapi/r_anal.vapi rename : swig/vapi/r_asm.deps => r2-bindings/vapi/r_asm.deps rename : swig/vapi/r_asm.vapi => r2-bindings/vapi/r_asm.vapi rename : swig/vapi/r_bin.deps => r2-bindings/vapi/r_bin.deps rename : swig/vapi/r_bin.vapi => r2-bindings/vapi/r_bin.vapi rename : swig/vapi/r_bp.deps => r2-bindings/vapi/r_bp.deps rename : swig/vapi/r_bp.vapi => r2-bindings/vapi/r_bp.vapi rename : swig/vapi/r_cmd.deps => r2-bindings/vapi/r_cmd.deps rename : swig/vapi/r_cmd.vapi => r2-bindings/vapi/r_cmd.vapi rename : swig/vapi/r_config.vapi => r2-bindings/vapi/r_config.vapi rename : swig/vapi/r_cons.vapi => r2-bindings/vapi/r_cons.vapi rename : swig/vapi/r_core.deps => r2-bindings/vapi/r_core.deps rename : swig/vapi/r_core.vapi => r2-bindings/vapi/r_core.vapi rename : swig/vapi/r_crypto.vapi => r2-bindings/vapi/r_crypto.vapi rename : swig/vapi/r_db.vapi => r2-bindings/vapi/r_db.vapi rename : swig/vapi/r_debug.deps => r2-bindings/vapi/r_debug.deps rename : swig/vapi/r_debug.vapi => r2-bindings/vapi/r_debug.vapi rename : swig/vapi/r_diff.vapi => r2-bindings/vapi/r_diff.vapi rename : swig/vapi/r_flags.deps => r2-bindings/vapi/r_flags.deps rename : swig/vapi/r_flags.vapi => r2-bindings/vapi/r_flags.vapi rename : swig/vapi/r_fs.deps => r2-bindings/vapi/r_fs.deps rename : swig/vapi/r_fs.vapi => r2-bindings/vapi/r_fs.vapi rename : swig/vapi/r_hash.vapi => r2-bindings/vapi/r_hash.vapi rename : swig/vapi/r_io.deps => r2-bindings/vapi/r_io.deps rename : swig/vapi/r_io.vapi => r2-bindings/vapi/r_io.vapi rename : swig/vapi/r_lang.vapi => r2-bindings/vapi/r_lang.vapi rename : swig/vapi/r_lib.vapi => r2-bindings/vapi/r_lib.vapi rename : swig/vapi/r_line.vapi => r2-bindings/vapi/r_line.vapi rename : swig/vapi/r_parse.deps => r2-bindings/vapi/r_parse.deps rename : swig/vapi/r_parse.vapi => r2-bindings/vapi/r_parse.vapi rename : swig/vapi/r_print.vapi => r2-bindings/vapi/r_print.vapi rename : swig/vapi/r_reg.deps => r2-bindings/vapi/r_reg.deps rename : swig/vapi/r_reg.vapi => r2-bindings/vapi/r_reg.vapi rename : swig/vapi/r_search.deps => r2-bindings/vapi/r_search.deps rename : swig/vapi/r_search.vapi => r2-bindings/vapi/r_search.vapi rename : swig/vapi/r_sign.vapi => r2-bindings/vapi/r_sign.vapi rename : swig/vapi/r_socket.vapi => r2-bindings/vapi/r_socket.vapi rename : swig/vapi/r_syscall.vapi => r2-bindings/vapi/r_syscall.vapi rename : swig/vapi/r_util.vapi => r2-bindings/vapi/r_util.vapi rename : swig/vapi/t/Makefile => r2-bindings/vapi/t/Makefile rename : swig/vapi/t/array.vala => r2-bindings/vapi/t/array.vala rename : swig/vapi/t/asm.gs => r2-bindings/vapi/t/asm.gs rename : swig/vapi/t/asm.vala => r2-bindings/vapi/t/asm.vala rename : swig/vapi/t/asmsearch.vala => r2-bindings/vapi/t/asmsearch.vala rename : swig/vapi/t/bin.vala => r2-bindings/vapi/t/bin.vala rename : swig/vapi/t/bintest.vala => r2-bindings/vapi/t/bintest.vala rename : swig/vapi/t/bwdisassemble.vala => r2-bindings/vapi/t/bwdisassemble.vala rename : swig/vapi/t/core.vala => r2-bindings/vapi/t/core.vala rename : swig/vapi/t/db.vala => r2-bindings/vapi/t/db.vala rename : swig/vapi/t/findops.vala => r2-bindings/vapi/t/findops.vala rename : swig/vapi/t/hash.vala => r2-bindings/vapi/t/hash.vala rename : swig/vapi/t/io.vala => r2-bindings/vapi/t/io.vala rename : swig/vapi/t/lang.vala => r2-bindings/vapi/t/lang.vala rename : swig/vapi/t/list.vala => r2-bindings/vapi/t/list.vala rename : swig/vapi/t/list.vapi => r2-bindings/vapi/t/list.vapi rename : swig/vapi/t/plugin.vala => r2-bindings/vapi/t/plugin.vala rename : swig/vapi/t/pluginwrap.c => r2-bindings/vapi/t/pluginwrap.c rename : swig/vapi/t/regs.vala => r2-bindings/vapi/t/regs.vala rename : swig/vapi/t/reloc.vala => r2-bindings/vapi/t/reloc.vala rename : swig/vapi/t/rgot.vala => r2-bindings/vapi/t/rgot.vala rename : swig/vapi/t/sc.vala => r2-bindings/vapi/t/sc.vala rename : swig/vapi/t/search.gs => r2-bindings/vapi/t/search.gs rename : swig/vapi/t/search.vala => r2-bindings/vapi/t/search.vala rename : swig/vapi/t/socket.vala => r2-bindings/vapi/t/socket.vala
220 lines
5.1 KiB
Python
220 lines
5.1 KiB
Python
#!/usr/bin/python
|
|
#
|
|
# Python implementation of the radare remote protocol
|
|
#
|
|
|
|
##===================================================0
|
|
## server api
|
|
##===================================================0
|
|
|
|
from socket import *
|
|
from struct import *
|
|
import traceback
|
|
import sys
|
|
|
|
RAP_OPEN = 1
|
|
RAP_READ = 2
|
|
RAP_WRITE = 3
|
|
RAP_SEEK = 4
|
|
RAP_CLOSE = 5
|
|
RAP_SYSTEM = 6
|
|
RAP_CMD = 7
|
|
RAP_REPLY = 0x80
|
|
|
|
# TODO: Add udp
|
|
# TODO: allow to init funptrs with a tuple
|
|
class RapServer():
|
|
def __init__(self):
|
|
self.offset = 0
|
|
self.size = 0
|
|
self.handle_eof = None
|
|
self.handle_cmd_system = None
|
|
self.handle_cmd_seek = None
|
|
self.handle_cmd_read = None
|
|
self.handle_cmd_write = None
|
|
self.handle_cmd_open = None
|
|
self.handle_cmd_close = None
|
|
|
|
def _handle_packet(self, c, key):
|
|
ret = ""
|
|
if key == RAP_OPEN:
|
|
buffer = c.recv(2)
|
|
(flags, length) = unpack(">BB", buffer)
|
|
file = c.recv(length)
|
|
if self.handle_cmd_open != None:
|
|
fd = self.handle_cmd_open(file, flags)
|
|
else: fd = 3434
|
|
buf = pack(">Bi", key|RAP_REPLY, fd)
|
|
c.send(buf)
|
|
elif key == RAP_READ:
|
|
buffer = c.recv(4)
|
|
(length,) = unpack(">I", buffer)
|
|
if self.handle_cmd_read != None:
|
|
ret = str(self.handle_cmd_read(length))
|
|
try:
|
|
lon = len(ret)
|
|
except:
|
|
ret = ""
|
|
lon = 0
|
|
else:
|
|
ret = ""
|
|
lon = 0;
|
|
buf = pack(">Bi", key|RAP_REPLY, lon)
|
|
c.send(buf+ret)
|
|
elif key == RAP_WRITE:
|
|
buffer = c.recv(4)
|
|
(length,) = unpack(">I", buffer)
|
|
buffer = c.recv(length)
|
|
# TODO: get buffer and length
|
|
if self.handle_cmd_write != None:
|
|
length = self.handle_cmd_write (buffer)
|
|
buf = pack(">Bi", key|RAP_REPLY, length)
|
|
c.send(buf)
|
|
elif key == RAP_SEEK:
|
|
buffer = c.recv(9)
|
|
(type, off) = unpack(">BQ", buffer)
|
|
if self.handle_cmd_seek != None:
|
|
seek = self.handle_cmd_seek(off, type)
|
|
else:
|
|
if type == 0: # SET
|
|
seek = off;
|
|
elif type == 1: # CUR
|
|
seek = seek + off
|
|
elif type == 2: # END
|
|
seek = self.size;
|
|
self.offset = seek
|
|
buf = pack(">BQ", key|RAP_REPLY, seek)
|
|
c.send(buf)
|
|
elif key == RAP_CLOSE:
|
|
if self.handle_cmd_close != None:
|
|
length = self.handle_cmd_close (fd)
|
|
elif key == RAP_SYSTEM:
|
|
buf = c.recv(4)
|
|
(length,) = unpack(">i", buf)
|
|
ret = c.recv(length)
|
|
if self.handle_cmd_system != None:
|
|
reply = self.handle_cmd_system(ret)
|
|
else: reply = ""
|
|
buf = pack(">Bi", key|RAP_REPLY, len(str(reply)))
|
|
c.send(buf+reply)
|
|
else:
|
|
print "Unknown command"
|
|
c.close()
|
|
|
|
def _handle_client(self, c):
|
|
while True:
|
|
try:
|
|
buf = c.recv(1)
|
|
if buf == "" and self.handle_eof is not None:
|
|
self.handle_eof(c)
|
|
break
|
|
if len(buf) == 0:
|
|
print "Connection closed\n"
|
|
break
|
|
self._handle_packet(c, ord(buf))
|
|
except KeyboardInterrupt:
|
|
break
|
|
|
|
def listen_tcp(self, port):
|
|
s = socket();
|
|
s.bind(("0.0.0.0", port))
|
|
s.listen(999)
|
|
print "Listening at port %d"%port
|
|
while True:
|
|
(c, (addr,port)) = s.accept()
|
|
print "New client %s:%d"%(addr,port)
|
|
self._handle_client(c)
|
|
|
|
|
|
##===================================================0
|
|
## client api
|
|
##===================================================0
|
|
|
|
class RapClient():
|
|
def __init__(self, host, port):
|
|
self.connect_tcp(host, port)
|
|
|
|
def connect_tcp(self, host, port):
|
|
fd = socket();
|
|
fd.connect((host, port))
|
|
self.fd = fd
|
|
|
|
def disconnect(self):
|
|
self.fd.close()
|
|
self.fd = None
|
|
|
|
def open(self, file, flags):
|
|
b = pack(">BBB", RAP_OPEN, flags, len(file))
|
|
self.fd.send(b)
|
|
self.fd.send(file)
|
|
# response
|
|
buf = self.fd.recv(5)
|
|
(c,l) = unpack(">Bi", buf)
|
|
if c != (RAP_REPLY|RAP_OPEN):
|
|
print "rmt-open: Invalid response packet 0x%02x"%c
|
|
return l
|
|
|
|
def read(self, count):
|
|
b = pack(">Bi", RAP_READ, count) #len(buf))
|
|
self.fd.send(b)
|
|
# response
|
|
buf = self.fd.recv(5)
|
|
(c,l) = unpack(">Bi", buf)
|
|
buf = self.fd.recv(l)
|
|
return buf
|
|
|
|
# TODO: not tested
|
|
def write(self, buf):
|
|
#self.fd.send(buf)
|
|
b = pack(">Bi", RAP_WRITE, len(buf))
|
|
self.fd.send(b+buf)
|
|
# response
|
|
buf = self.fd.recv(5)
|
|
(c,l) = unpack(">Bi", buf)
|
|
if c != (RAP_REPLY|RAP_WRITE):
|
|
print "rmt-write: Invalid response packet 0x%02x"%c
|
|
|
|
def lseek(self, type, addr):
|
|
# WTF BBQ?
|
|
buf = pack(">BBQ", RAP_SEEK, type, addr)
|
|
self.fd.send(buf)
|
|
# read response
|
|
buf = self.fd.recv(5) # XXX READ 5!?!?!? shouldnt be 9 ?!?!? WTF
|
|
(c,l) = unpack(">Bi", buf)
|
|
#print "Lseek : %d"%l
|
|
return l
|
|
|
|
def close(self, fd):
|
|
buf = pack(">Bi", RAP_CLOSE, fd)
|
|
self.fd.send(buf)
|
|
# read response
|
|
buf = self.fd.recv(5)
|
|
(c,l) = unpack(">Bi", buf)
|
|
if c != RAP_REPLY | RAP_CLOSE:
|
|
print "rmt-close: Invalid response packet"
|
|
|
|
def cmd(self, cmd):
|
|
buf = pack(">Bi", RAP_CMD, len(str(cmd)))
|
|
self.fd.send(buf + cmd)
|
|
# read response
|
|
buf = self.fd.recv(5)
|
|
(c,l) = unpack(">Bi", buf)
|
|
if c != RAP_CMD | RAP_REPLY:
|
|
print "rmt-cmd: Invalid response packet"
|
|
return ""
|
|
buf = self.fd.recv(l)
|
|
return buf
|
|
|
|
def system(self, cmd):
|
|
buf = pack(">Bi", RAP_SYSTEM, len(str(cmd)))
|
|
self.fd.send(buf)
|
|
self.fd.send(cmd)
|
|
# read response
|
|
buf = self.fd.recv(5)
|
|
(c,l) = unpack(">Bi", buf)
|
|
if c != RAP_SYSTEM | RAP_REPLY:
|
|
print "rmt-system: Invalid response packet"
|
|
return ""
|
|
if l>0:
|
|
buf = self.fd.recv(l)
|
|
return buf
|