mirror of
https://github.com/radareorg/radare2.git
synced 2024-11-23 05:09:43 +00:00
Fix #22698 - Implement rax2 -j flag for json output ##tools
This commit is contained in:
parent
cb53db44f0
commit
cbcbd5f020
@ -13,6 +13,7 @@ _rax2() {
|
|||||||
'-F[stdin slurp C hex ; rax2 -F < shellcode.c]'
|
'-F[stdin slurp C hex ; rax2 -F < shellcode.c]'
|
||||||
'-h[help ; rax2 -h]'
|
'-h[help ; rax2 -h]'
|
||||||
'-i[dump as C array ; rax2 -i < bytes]'
|
'-i[dump as C array ; rax2 -i < bytes]'
|
||||||
|
'-j[json format output; rax2 -j 0x1234]'
|
||||||
'-k[keep base ; rax2 -k 33+3 -> 36]'
|
'-k[keep base ; rax2 -k 33+3 -> 36]'
|
||||||
'-K[randomart ; rax2 -K 0x34 1020304050]'
|
'-K[randomart ; rax2 -K 0x34 1020304050]'
|
||||||
'-L[bin -> hex ; rax2 -L 1111111]'
|
'-L[bin -> hex ; rax2 -L 1111111]'
|
||||||
|
@ -3,7 +3,9 @@
|
|||||||
#define R_LOG_ORIGIN "rax2"
|
#define R_LOG_ORIGIN "rax2"
|
||||||
|
|
||||||
#include <r_main.h>
|
#include <r_main.h>
|
||||||
|
#include <r_util/pj.h>
|
||||||
#include <r_util/r_print.h>
|
#include <r_util/r_print.h>
|
||||||
|
#include <r_util/r_str.h>
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
RAX2_FLAG_HEXSTR2RAW = (1 << 0), // -s
|
RAX2_FLAG_HEXSTR2RAW = (1 << 0), // -s
|
||||||
@ -30,11 +32,12 @@ typedef enum {
|
|||||||
RAX2_FLAG_OCTAL2RAW = (1 << 21), // -o
|
RAX2_FLAG_OCTAL2RAW = (1 << 21), // -o
|
||||||
RAX2_FLAG_IPADDR2NUM = (1 << 22), // -I
|
RAX2_FLAG_IPADDR2NUM = (1 << 22), // -I
|
||||||
RAX2_FLAG_NEWLINE = (1 << 23), // -n
|
RAX2_FLAG_NEWLINE = (1 << 23), // -n
|
||||||
|
RAX2_FLAG_JSONBASES = (1 << 24), // -j
|
||||||
} RaxAction;
|
} RaxAction;
|
||||||
|
|
||||||
static bool rax(RNum *num, char *str, int len, int last, ut64 *flags, int *fm);
|
static bool rax(RNum *num, char *str, int len, int last, ut64 *flags, int *fm, PJ **pj);
|
||||||
|
|
||||||
static int use_stdin(RNum *num, ut64 *flags, int *fm) {
|
static int use_stdin(RNum *num, ut64 *flags, int *fm, PJ **pj) {
|
||||||
r_return_val_if_fail (num && flags, -1);
|
r_return_val_if_fail (num && flags, -1);
|
||||||
if (!flags) {
|
if (!flags) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -42,7 +45,7 @@ static int use_stdin(RNum *num, ut64 *flags, int *fm) {
|
|||||||
int rc = 0;
|
int rc = 0;
|
||||||
if (*flags & RAX2_FLAG_SLURPHEX) {
|
if (*flags & RAX2_FLAG_SLURPHEX) {
|
||||||
char buf[1]= {0};
|
char buf[1]= {0};
|
||||||
if (!rax (num, buf, 1, 0, flags, fm)) {
|
if (!rax (num, buf, 1, 0, flags, fm, pj)) {
|
||||||
rc = 1;
|
rc = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -52,7 +55,7 @@ static int use_stdin(RNum *num, ut64 *flags, int *fm) {
|
|||||||
if (!buf) {
|
if (!buf) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!rax (num, buf, l, 0, flags, fm)) {
|
if (!rax (num, buf, l, 0, flags, fm, pj)) {
|
||||||
rc = 1;
|
rc = 1;
|
||||||
}
|
}
|
||||||
free (buf);
|
free (buf);
|
||||||
@ -176,6 +179,7 @@ static int help(void) {
|
|||||||
" -h help ; rax2 -h\n"
|
" -h help ; rax2 -h\n"
|
||||||
" -i dump as C byte array ; rax2 -i < bytes\n"
|
" -i dump as C byte array ; rax2 -i < bytes\n"
|
||||||
" -I IP address <-> LONG ; rax2 -I 3530468537\n"
|
" -I IP address <-> LONG ; rax2 -I 3530468537\n"
|
||||||
|
" -j json format output ; rax2 -j 0x1234 # same as r2 -c '?j 0x1234'\n"
|
||||||
" -k keep base ; rax2 -k 33+3 -> 36\n"
|
" -k keep base ; rax2 -k 33+3 -> 36\n"
|
||||||
" -K randomart ; rax2 -K 0x34 1020304050\n"
|
" -K randomart ; rax2 -K 0x34 1020304050\n"
|
||||||
" -L bin -> hex(bignum) ; rax2 -L 111111111 # 0x1ff\n"
|
" -L bin -> hex(bignum) ; rax2 -L 111111111 # 0x1ff\n"
|
||||||
@ -208,7 +212,7 @@ static bool invalid_length(ut64 flags) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool rax(RNum *num, char *str, int len, int last, ut64 *_flags, int *fm) {
|
static bool rax(RNum *num, char *str, int len, int last, ut64 *_flags, int *fm, PJ **pj) {
|
||||||
const char *errstr = NULL;
|
const char *errstr = NULL;
|
||||||
ut64 flags = *_flags;
|
ut64 flags = *_flags;
|
||||||
ut8 *buf;
|
ut8 *buf;
|
||||||
@ -267,10 +271,11 @@ static bool rax(RNum *num, char *str, int len, int last, ut64 *_flags, int *fm)
|
|||||||
case 'i': flags ^= RAX2_FLAG_DUMPCSTR; break;
|
case 'i': flags ^= RAX2_FLAG_DUMPCSTR; break;
|
||||||
case 'o': flags ^= RAX2_FLAG_OCTAL2RAW; break;
|
case 'o': flags ^= RAX2_FLAG_OCTAL2RAW; break;
|
||||||
case 'I': flags ^= RAX2_FLAG_IPADDR2NUM; break;
|
case 'I': flags ^= RAX2_FLAG_IPADDR2NUM; break;
|
||||||
|
case 'j': flags ^= RAX2_FLAG_JSONBASES; break;
|
||||||
case 'v': return r_main_version_print ("rax2", 0);
|
case 'v': return r_main_version_print ("rax2", 0);
|
||||||
case '\0':
|
case '\0':
|
||||||
*_flags = flags;
|
*_flags = flags;
|
||||||
return !use_stdin (num, _flags, fm);
|
return !use_stdin (num, _flags, fm, pj);
|
||||||
default:
|
default:
|
||||||
/* not as complete as for positive numbers */
|
/* not as complete as for positive numbers */
|
||||||
out_mode = (flags ^ 32)? '0': 'I';
|
out_mode = (flags ^ 32)? '0': 'I';
|
||||||
@ -289,7 +294,7 @@ static bool rax(RNum *num, char *str, int len, int last, ut64 *_flags, int *fm)
|
|||||||
}
|
}
|
||||||
*_flags = flags;
|
*_flags = flags;
|
||||||
if (last) {
|
if (last) {
|
||||||
return !use_stdin (num, _flags, fm);
|
return !use_stdin (num, _flags, fm, pj);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -591,14 +596,73 @@ dotherax:
|
|||||||
printf ("double %lf\n", d);
|
printf ("double %lf\n", d);
|
||||||
printf ("binary 0b%s\n", out);
|
printf ("binary 0b%s\n", out);
|
||||||
|
|
||||||
/* ternary */
|
|
||||||
r_num_to_ternary (out, n);
|
|
||||||
printf ("ternary 0t%s\n", out);
|
|
||||||
|
|
||||||
// base36
|
// base36
|
||||||
char b36str[16];
|
char b36str[16];
|
||||||
b36_fromnum (b36str, n);
|
b36_fromnum (b36str, n);
|
||||||
printf ("base36 %s\n", b36str);
|
printf ("base36 %s\n", b36str);
|
||||||
|
|
||||||
|
/* ternary */
|
||||||
|
r_num_to_ternary (out, n);
|
||||||
|
printf ("ternary 0t%s\n", out);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if (flags & RAX2_FLAG_JSONBASES) {
|
||||||
|
r_strf_buffer (256);
|
||||||
|
char unit[8];
|
||||||
|
char out[128];
|
||||||
|
ut32 n32, s, a;
|
||||||
|
double d;
|
||||||
|
float f;
|
||||||
|
const char *errstr = NULL;
|
||||||
|
ut64 n = r_num_calc (num, str, &errstr);
|
||||||
|
if (errstr) {
|
||||||
|
R_LOG_ERROR (errstr);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (num->dbz) { // XXX should be done in errstr already
|
||||||
|
R_LOG_ERROR ("division by zero");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
n32 = (ut32) (n & UT32_MAX);
|
||||||
|
|
||||||
|
if (!*pj) {
|
||||||
|
*pj = pj_new ();
|
||||||
|
pj_o (*pj);
|
||||||
|
}
|
||||||
|
|
||||||
|
pj_ks (*pj, "int32", r_strf ("%d", (st32)(n & UT32_MAX)));
|
||||||
|
pj_ks (*pj, "uint32", r_strf ("%u", (ut32)n));
|
||||||
|
pj_ks (*pj, "int64", r_strf ("%"PFMT64d, (st64)n));
|
||||||
|
pj_ks (*pj, "uint64", r_strf ("%"PFMT64u, (ut64)n));
|
||||||
|
pj_ks (*pj, "hex", r_strf ("0x%08"PFMT64x, n));
|
||||||
|
pj_ks (*pj, "octal", r_strf ("0%"PFMT64o, n));
|
||||||
|
|
||||||
|
/* decimal, hexa, octal */
|
||||||
|
s = n >> 16 << 12;
|
||||||
|
a = n & 0x0fff;
|
||||||
|
r_num_units (unit, sizeof (unit), n);
|
||||||
|
|
||||||
|
pj_ks (*pj, "unit", unit);
|
||||||
|
pj_ks (*pj, "segment", r_strf ("%04x:%04x", s, a));
|
||||||
|
|
||||||
|
/* binary and floating point */
|
||||||
|
r_str_bits64 (out, n);
|
||||||
|
memcpy (&f, &n32, sizeof (f));
|
||||||
|
memcpy (&d, &n, sizeof (d));
|
||||||
|
|
||||||
|
pj_ks (*pj, "fvalue", r_strf ("%.1lf", num->fvalue));
|
||||||
|
pj_ks (*pj, "float", r_strf ("%ff", f));
|
||||||
|
pj_ks (*pj, "double", r_strf ("%lf", d));
|
||||||
|
pj_ks (*pj, "binary", r_strf ("0b%s", out));
|
||||||
|
char b36str[16];
|
||||||
|
b36_fromnum (b36str, n);
|
||||||
|
pj_ks (*pj, "base36", b36str);
|
||||||
|
r_num_to_ternary (out, n);
|
||||||
|
pj_ks (*pj, "ternary", r_strf ("0t%s", out));
|
||||||
|
|
||||||
|
if (last) {
|
||||||
|
pj_end (*pj);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (flags & RAX2_FLAG_BINSTR2HEX) { // -L
|
if (flags & RAX2_FLAG_BINSTR2HEX) { // -L
|
||||||
@ -726,16 +790,21 @@ R_API int r_main_rax2(int argc, const char **argv) {
|
|||||||
} else {
|
} else {
|
||||||
RNum *num = r_num_new (NULL, NULL, NULL);
|
RNum *num = r_num_new (NULL, NULL, NULL);
|
||||||
ut64 flags = 0;
|
ut64 flags = 0;
|
||||||
|
PJ *pj = NULL;
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
char *argv_i = strdup (argv[i]);
|
char *argv_i = strdup (argv[i]);
|
||||||
if (argv_i) {
|
if (argv_i) {
|
||||||
len = r_str_unescape (argv_i);
|
len = r_str_unescape (argv_i);
|
||||||
if (!rax (num, argv_i, len, i == argc - 1, &flags, &fm)) {
|
if (!rax (num, argv_i, len, i == argc - 1, &flags, &fm, &pj)) {
|
||||||
rc = 1;
|
rc = 1;
|
||||||
}
|
}
|
||||||
free (argv_i);
|
free (argv_i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (pj) {
|
||||||
|
printf ("%s\n", pj_string (pj));
|
||||||
|
pj_free (pj);
|
||||||
|
}
|
||||||
r_num_free (num);
|
r_num_free (num);
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -51,6 +51,8 @@ Show randomart key asciiart for values or hexpairs
|
|||||||
Dump stdin to C array in stdout (xxd replacement)
|
Dump stdin to C array in stdout (xxd replacement)
|
||||||
.It Fl I
|
.It Fl I
|
||||||
Convert LONG to/from IP ADDRESS
|
Convert LONG to/from IP ADDRESS
|
||||||
|
.It Fl j
|
||||||
|
Show the output in json format, the same as the r2 `?j 0x804` command.
|
||||||
.It Fl L
|
.It Fl L
|
||||||
Convert a bit stream (an arbitrary sequence of 0 and 1 of any length) to
|
Convert a bit stream (an arbitrary sequence of 0 and 1 of any length) to
|
||||||
hexadecimal. The result can be larger than 64bits
|
hexadecimal. The result can be larger than 64bits
|
||||||
|
@ -593,6 +593,14 @@ EXPECT=<<EOF
|
|||||||
EOF
|
EOF
|
||||||
RUN
|
RUN
|
||||||
|
|
||||||
|
NAME=rax2 -j 0x1234
|
||||||
|
FILE=-
|
||||||
|
CMDS=!rax2 -j 0x1234
|
||||||
|
EXPECT=<<EOF
|
||||||
|
{"int32":"4660","uint32":"4660","int64":"4660","uint64":"4660","hex":"0x00001234","octal":"011064","unit":"4.6K","segment":"0000:0234","fvalue":"4660.0","float":"0.000000f","double":"0.000000","binary":"0b0001001000110100","base36":"0_3lg","ternary":"0t20101121"}
|
||||||
|
EOF
|
||||||
|
RUN
|
||||||
|
|
||||||
NAME=rax2 -v
|
NAME=rax2 -v
|
||||||
FILE=-
|
FILE=-
|
||||||
CMDS=!rax2 -v | grep -c birth
|
CMDS=!rax2 -v | grep -c birth
|
||||||
|
Loading…
Reference in New Issue
Block a user