diff --git a/libr/core/anal.c b/libr/core/anal.c index 69ce3cea48..d70006036f 100644 --- a/libr/core/anal.c +++ b/libr/core/anal.c @@ -89,6 +89,41 @@ R_API ut64 r_core_anal_address (RCore *core, ut64 addr) { } } } + + // check if it's ascii + int not_ascii = 0; + if (addr != 0) { + int i, failed_sequence, dir, on; + for (i=0; i<8; i++) { + ut8 n = (addr>> (i*8)) & 0xff; + if (n && !IS_PRINTABLE (n)) + not_ascii = 1; + } + if (!not_ascii) + types |= R_ANAL_ADDR_TYPE_ASCII; + + failed_sequence = 0; + dir = on = -1; + for (i=0; i<8; i++) { + ut8 n = (addr>> (i*8)) & 0xff; + if (on != -1) { + if (dir == -1) + dir = (n>on)? 1: -1; + if (n == on+dir) { + // ok + } else { + failed_sequence = 1; + break; + } + } + on = n; + } + if (!failed_sequence) + types |= R_ANAL_ADDR_TYPE_SEQUENCE; + } + + + return types; } diff --git a/libr/core/cmd_anal.c b/libr/core/cmd_anal.c index efa357e1da..47352caa07 100644 --- a/libr/core/cmd_anal.c +++ b/libr/core/cmd_anal.c @@ -1094,6 +1094,10 @@ static void cmd_address_info(RCore *core, const char *addrstr, int fmt) { r_cons_printf ("%s\"heap\":true", COMMA); if (type & R_ANAL_ADDR_TYPE_REG) r_cons_printf ("%s\"reg\":true", COMMA); + if (type & R_ANAL_ADDR_TYPE_ASCII) + r_cons_printf ("%s\"ascii\":true", COMMA); + if (type & R_ANAL_ADDR_TYPE_SEQUENCE) + r_cons_printf ("%s\"sequence\":true", COMMA); r_cons_printf ("}"); break; default: @@ -1117,6 +1121,10 @@ static void cmd_address_info(RCore *core, const char *addrstr, int fmt) { r_cons_printf ("heap\n"); if (type & R_ANAL_ADDR_TYPE_REG) r_cons_printf ("reg\n"); + if (type & R_ANAL_ADDR_TYPE_ASCII) + r_cons_printf ("ascii\n"); + if (type & R_ANAL_ADDR_TYPE_SEQUENCE) + r_cons_printf ("sequence\n"); } } diff --git a/libr/core/core.c b/libr/core/core.c index 4637ee4182..bd60e55a9e 100644 --- a/libr/core/core.c +++ b/libr/core/core.c @@ -559,6 +559,22 @@ static char *getbitfield(void *_core, const char *name, ut64 val) { return ret; } +R_API const char *__colorfor(RCore *core, ut64 addr) { + ut64 type = r_core_anal_address (core, addr); +// same colors as PEDA + if (type & R_ANAL_ADDR_TYPE_EXEC) + return Color_RED; + if (type & R_ANAL_ADDR_TYPE_WRITE) + return Color_BLUE; + if (type & R_ANAL_ADDR_TYPE_READ) + return Color_GREEN; + if (type & R_ANAL_ADDR_TYPE_SEQUENCE) + return Color_MAGENTA; + if (type & R_ANAL_ADDR_TYPE_ASCII) + return Color_YELLOW; + return NULL; +} + R_API int r_core_init(RCore *core) { static int singleton = R_TRUE; core->cmd_depth = R_CORE_CMD_DEPTH+1; @@ -575,6 +591,7 @@ R_API int r_core_init(RCore *core) { core->print->printf = (void *)r_cons_printf; core->print->write = (void *)r_cons_memcat; core->print->disasm = __disasm; + core->print->colorfor = __colorfor; core->rtr_n = 0; core->blocksize_max = R_CORE_BLOCKSIZE_MAX; core->watchers = r_list_new (); diff --git a/libr/include/r_anal.h b/libr/include/r_anal.h index c54728d538..1bdc6d1298 100644 --- a/libr/include/r_anal.h +++ b/libr/include/r_anal.h @@ -70,16 +70,18 @@ enum { }; // used from core/anal.c -#define R_ANAL_ADDR_TYPE_EXEC 1 -#define R_ANAL_ADDR_TYPE_READ 2 -#define R_ANAL_ADDR_TYPE_WRITE 4 -#define R_ANAL_ADDR_TYPE_FLAG 8 -#define R_ANAL_ADDR_TYPE_FUNC 16 -#define R_ANAL_ADDR_TYPE_HEAP 32 -#define R_ANAL_ADDR_TYPE_STACK 64 -#define R_ANAL_ADDR_TYPE_REG 128 -#define R_ANAL_ADDR_TYPE_PROGRAM 256 -#define R_ANAL_ADDR_TYPE_LIBRARY 512 +#define R_ANAL_ADDR_TYPE_EXEC 1 +#define R_ANAL_ADDR_TYPE_READ 1<<1 +#define R_ANAL_ADDR_TYPE_WRITE 1<<2 +#define R_ANAL_ADDR_TYPE_FLAG 1<<3 +#define R_ANAL_ADDR_TYPE_FUNC 1<<4 +#define R_ANAL_ADDR_TYPE_HEAP 1<<5 +#define R_ANAL_ADDR_TYPE_STACK 1<<6 +#define R_ANAL_ADDR_TYPE_REG 1<<7 +#define R_ANAL_ADDR_TYPE_PROGRAM 1<<8 +#define R_ANAL_ADDR_TYPE_LIBRARY 1<<9 +#define R_ANAL_ADDR_TYPE_ASCII 1<<10 +#define R_ANAL_ADDR_TYPE_SEQUENCE 1<<11 /* type = (R_ANAL_VAR_TYPE_BYTE & R_ANAL_VAR_TYPE_SIZE_MASK) | * ( RANAL_VAR_TYPE_SIGNED & RANAL_VAR_TYPE_SIGN_MASK) | diff --git a/libr/include/r_print.h b/libr/include/r_print.h index dbe5c4f3e6..99caf37fcd 100644 --- a/libr/include/r_print.h +++ b/libr/include/r_print.h @@ -20,6 +20,7 @@ extern "C" { typedef int (*RPrintZoomCallback)(void *user, int mode, ut64 addr, ut8 *bufz, ut64 size); typedef const char *(*RPrintNameCallback)(void *user, ut64 addr); +typedef const char *(*RPrintColorFor)(void *user, ut64 addr); typedef struct r_print_zoom_t { ut8 *buf; @@ -56,6 +57,7 @@ typedef struct r_print_t { int pairs; RPrintZoom *zoom; RPrintNameCallback offname; + RPrintColorFor colorfor; RStrHT *formats; RCons *cons; } RPrint; diff --git a/libr/util/print.c b/libr/util/print.c index 13865e7fc3..b5b49f97ea 100644 --- a/libr/util/print.c +++ b/libr/util/print.c @@ -428,6 +428,7 @@ R_API void r_print_hexdump(RPrint *p, ut64 addr, const ut8 *buf, int len, int ba const char *fmt = "%02x"; const char *pre = ""; int last_sparse = 0; + const char *a, *b; if (p) { pairs = p->pairs; @@ -521,7 +522,14 @@ R_API void r_print_hexdump(RPrint *p, ut64 addr, const ut8 *buf, int len, int ba ut32 n = 0; r_mem_copyendian ((ut8*)&n, buf+j, sizeof (n), !p->big_endian); r_print_cursor (p, j, 1); - printfmt ("0x%08x ", n); + + // stub for colors + if (p && p->colorfor) { + a = p->colorfor (p->user, n); + if (a && *a) { b = Color_RESET; } else { a = b = ""; } + } else { a = b = ""; } + + printfmt ("%s0x%08x%s ", a, n, b); r_print_cursor (p, j, 0); j += 3; } else @@ -531,7 +539,12 @@ R_API void r_print_hexdump(RPrint *p, ut64 addr, const ut8 *buf, int len, int ba * a multiple of 4 for base == 64. */ r_mem_copyendian ((ut8*)&x, buf+j, sizeof (x), !p->big_endian); r_print_cursor (p, j, 1); - printfmt ("0x%016"PFMT64x" ", x); + // stub for colors + if (p && p->colorfor) { + a = p->colorfor (p->user, x); + if (a && *a) { b = Color_RESET; } else { a = b = ""; } + } else { a = b = ""; } + printfmt ("%s0x%016"PFMT64x"%s ", a, x, b); r_print_cursor (p, j, 0); j += 7; } else {