mirror of
https://github.com/radareorg/radare2-r2pipe.git
synced 2026-11-10 04:11:28 -10:00
167 lines
5.3 KiB
Python
167 lines
5.3 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""r2pipe
|
|
|
|
This module provides an API to interact with the radare2
|
|
commandline interface from Python using a pipe.
|
|
|
|
The pipe can be connected to the parent process to run
|
|
Python scripts from the radare2 shell itself, or it can
|
|
spawn a new process, connect via HTTP to a remote r2 http
|
|
server, etc.
|
|
|
|
Some r2 commands display the information in JSON, that's
|
|
why r2pipe provides `-j` methods to directly parse it
|
|
and return a native Python object.
|
|
|
|
Example:
|
|
$ python
|
|
> import r2pipe
|
|
> r = r2pipe.open("/bin/ls")
|
|
> print(r.cmd("pd 10"))
|
|
> print(r.cmdj("aoj")[0]['size']) > r.quit()
|
|
"""
|
|
|
|
from r2pipe.open_sync import open
|
|
from r2pipe.open_base import OpenBase
|
|
|
|
try:
|
|
import r2lang
|
|
except ImportError:
|
|
r2lang = None
|
|
|
|
VERSION = "1.9.6"
|
|
|
|
def in_r2():
|
|
"""Return wheter r2pipe is called from radare2 environment or the system shell
|
|
"""
|
|
try:
|
|
import os
|
|
a = int(os.environ["R2PIPE_IN"])
|
|
b = int(os.environ["R2PIPE_OUT"])
|
|
return a > 0 and b > 0
|
|
except (ValueError, KeyError, TypeError):
|
|
return False
|
|
|
|
from r2pipe.open_base import in_rlang
|
|
|
|
def version():
|
|
"""Return string with the version of the r2pipe library
|
|
"""
|
|
return VERSION
|
|
|
|
def local_sessions():
|
|
"""Return list of local r2agent sessions
|
|
Returns:
|
|
Returns a list of dictionaries containing session information (uri, pid, file)
|
|
"""
|
|
return OpenBase.local_sessions()
|
|
|
|
|
|
# Open class is now in open_base.py
|
|
if __name__ == "__main__":
|
|
import os
|
|
import sys
|
|
from r2pipe.open_sync import open as r2pipe_open
|
|
print("[+] Spawning r2 tcp and http servers")
|
|
os.system("pkill r2")
|
|
os.system("radare2 -qc.:9080 /bin/ls &")
|
|
os.system("radare2 -qc=h /bin/ls &")
|
|
import time
|
|
time.sleep(1)
|
|
|
|
if sys.version_info <= (3, 0):
|
|
# Test r2pipe with local process
|
|
print("[+] Testing python r2pipe local")
|
|
rlocal = r2pipe_open("/bin/ls")
|
|
print(rlocal.cmd("pi 5"))
|
|
# print rlocal.cmd("pn")
|
|
info = rlocal.cmdj("ij")
|
|
print("Architecture: " + info["bin"]["machine"])
|
|
|
|
# Test r2pipe with remote tcp process (launch it with "radare2 -qc.:9080 myfile")
|
|
print("[+] Testing python r2pipe tcp://")
|
|
rremote = r2pipe_open("tcp://127.0.0.1:9080")
|
|
disas = rremote.cmd("pi 5")
|
|
if not disas:
|
|
print("Error with remote tcp conection")
|
|
else:
|
|
print(disas)
|
|
|
|
# Test r2pipe with remote http process (launch it with "radare2 -qc=H myfile")
|
|
print("[+] Testing python r2pipe http://")
|
|
rremote = r2pipe_open("http://127.0.0.1:9090")
|
|
disas = rremote.cmd("pi 5")
|
|
if not disas:
|
|
print("Error with remote http conection")
|
|
else:
|
|
print(disas)
|
|
else:
|
|
# --------------------------------------------------------------------------
|
|
# Python 3 examples, with non-blocking API and callbacks
|
|
# --------------------------------------------------------------------------
|
|
def callback(result):
|
|
"""Dummy callback printing command execution result
|
|
"""
|
|
print(result)
|
|
|
|
#
|
|
# Test r2pipe with local process
|
|
#
|
|
# Start 1 task
|
|
print("[+] Testing python r2pipe local")
|
|
rlocal = r2pipe_open("/bin/ls")
|
|
t = rlocal.cmd("pi 5", callback=callback)
|
|
rlocal.wait(t) # Wait for task end
|
|
info = rlocal.cmdj("ij")
|
|
rlocal.wait(info)
|
|
print("Architecture: " + info["bin"]["machine"])
|
|
rlocal.close()
|
|
# Start 3 tasks with Context manager
|
|
print("[+] Testing python r2pipe local with 3 queries")
|
|
with r2pipe_open("/bin/ls") as rlocall:
|
|
t1 = rlocall.cmd("pi 5", callback=callback)
|
|
t2 = rlocall.cmd("pi 5", callback=callback)
|
|
t3 = rlocall.cmd("pi 5", callback=callback)
|
|
rlocall.wait([t1, t2, t3])
|
|
|
|
#
|
|
# Test r2pipe with remote tcp process (launch it with "radare2 -qc.:9080 myfile")
|
|
#
|
|
# Start 1 task
|
|
print("[+] Testing python r2pipe tcp://")
|
|
rremote = r2pipe_open("tcp://127.0.0.1:9080")
|
|
t = rremote.cmd("pi 5", callback=callback)
|
|
rremote.wait(t)
|
|
rremote.close()
|
|
|
|
# Start 3 tasks with Context manager
|
|
print("[+] Testing python r2pipe tcp:// with 3 queries")
|
|
with r2pipe_open("tcp://127.0.0.1:9080") as rremote:
|
|
t1 = rremote.cmd("pi 5", callback=callback)
|
|
t2 = rremote.cmd("pi 5", callback=callback)
|
|
t3 = rremote.cmd("pi 5", callback=callback)
|
|
|
|
rremote.wait([t1, t2, t3])
|
|
|
|
#
|
|
# Test r2pipe with remote http process (launch it with "radare2 -qc=H myfile")
|
|
#
|
|
print("[+] Testing python r2pipe http://")
|
|
rremote = r2pipe_open("tcp://127.0.0.1:9080")
|
|
t = rremote.cmd("pi 5", callback=callback)
|
|
rremote.wait(t)
|
|
rremote.close()
|
|
|
|
# Start 3 tasks with Context manager
|
|
print("[+] Testing python r2pipe http:// with 3 queries")
|
|
with r2pipe_open("http://127.0.0.1:9090") as rremote:
|
|
t1 = rremote.cmd("pi 10", callback=callback)
|
|
t2 = rremote.cmd("pi 5", callback=callback)
|
|
t3 = rremote.cmd("pi 5", callback=callback)
|
|
|
|
rremote.wait([t1, t2, t3])
|
|
|
|
os.system("pkill -INT radare2")
|