98 lines
2.3 KiB
Plaintext
98 lines
2.3 KiB
Plaintext
RAP protocol
|
|
============
|
|
|
|
RAP stands for the Remote Access Protocol of Radare2, it is compatible with radare1
|
|
and it simply defines a communication between a client and a server to simulate IO
|
|
operations.
|
|
|
|
There are two different implementations, one in C and another in Python.
|
|
|
|
Usage example
|
|
-------------
|
|
|
|
Start in one terminal the following command to wait for incoming connections:
|
|
|
|
r2 rap://:9999
|
|
|
|
In another machine or terminal connect it:
|
|
|
|
r2 rap://localhost:9999//bin/ls
|
|
|
|
As you see, the path of the remote file to load must be specified, and this handled
|
|
by the open() packet.
|
|
|
|
Known Bugs
|
|
----------
|
|
|
|
* Read/Write operations ignore the filedescriptor completely because it is suposed to be handled by the IO layer and it is redundant, but it introduces a bug that breaks support for multiple files.
|
|
* This can be fixed with a new packet type RAP_SETFD.
|
|
* Read lengths should be only 2 bytes, there's no sense in read > 64K of memory in a shot.
|
|
* Seek does not returns anything
|
|
* System vs Cmd - the first should have a return value as well as string result
|
|
* Filedescriptors are asumed to be 32bit
|
|
|
|
|
|
Operations
|
|
----------
|
|
|
|
The protocol is designed to be bidirectional, but right now, only one way is supported.
|
|
The client sends a byte specifying the operation and the server will reply the same byte
|
|
masked with the RMT_REPLY value (0x80 | op)
|
|
|
|
RAP_OPEN = 1
|
|
RAP_READ = 2
|
|
RAP_WRITE = 3
|
|
RAP_SEEK = 4
|
|
RAP_CLOSE = 5
|
|
RAP_SYSTEM = 6
|
|
RAP_CMD = 7
|
|
RAP_REPLY = 0x80
|
|
|
|
This is how are constructed the packets:
|
|
|
|
RAP_OPEN
|
|
struct packed RapOpen {
|
|
ut8 op = 1;
|
|
ut8 rw = 0; // 0 = read-only, 1 = read-write
|
|
ut8 len = 15; // length of filename
|
|
}
|
|
>> 01 RW LN [....]
|
|
<< 81 FD=(.. .. .. ..)
|
|
|
|
RAP_READ
|
|
>> 02 LN=(.. .. .. ..)
|
|
<< 82 LN=(.. .. .. ..) [..LN..]
|
|
|
|
RAP_WRITE
|
|
>> 03 LN=(.. .. .. ..) [..LN..]
|
|
<< 83 LN=(.. .. .. ..)
|
|
|
|
RAP_SEEK
|
|
>> 04 FLAG=(..) OFFSET=(.. 8 bytes ..)
|
|
<< 84
|
|
|
|
RAP_CLOSE
|
|
>> 05 FD=(4 bytes)
|
|
<< 85 RET=(4 bytes)
|
|
|
|
RAP_SYSTEM
|
|
>> 06 LEN=(4 bytes) STR[LEN bytes]
|
|
<< 86 LN=(.. .. .. ..) STR[ LEN bytes]
|
|
|
|
RAP_CMD_
|
|
>> 07 LEN=(4 bytes) STR[LEN bytes]
|
|
<< 87 LN=(.. .. .. ..) STR[ LEN bytes]
|
|
|
|
|
|
Examples
|
|
--------
|
|
|
|
Python:
|
|
|
|
See radare2-bindings/python/remote.py and test-rap-*.py
|
|
|
|
C:
|
|
|
|
Server: libr/socket/rap_server.c
|
|
Client: libr/io/p/io_rap.c
|