* Display some string references on x86

* In 'pd' display strings as text, not opcodes
* Added 'Vdu' command to undefine metadata and flags on cursor
* Better support for visual cursor
* Added f-@ command to undefine flags at given address
* Fix parse of C* commands
* Added C- and C[xXsSm..]- to unset metadata
* Disable cursor when quitting visual mode
This commit is contained in:
pancake 2010-06-21 01:58:45 +02:00
parent ace71e8be4
commit ade05c9aeb
7 changed files with 104 additions and 36 deletions

View File

@ -405,6 +405,7 @@ static int aop(RAnal *anal, RAnalOp *aop, ut64 addr, const ut8 *data, int len) {
break;
case 0x04:
// c7042496850408 dword [esp] = 0x8048596 ; LOL
aop->refptr = 4;
aop->ref = (st64)(((int)(buf[3]+(buf[4]<<8)+(buf[5]<<16)+(buf[6]<<24))));
break;
}

View File

@ -127,13 +127,10 @@ R_API int r_core_anal_bb(RCore *core, ut64 at, int depth, int head) {
return R_FALSE;
if (!(bb = r_anal_bb_new()))
return R_FALSE;
if (split)
ret = r_anal_bb_split (core->anal, bb, core->anal->bbs, at);
else {
r_list_foreach (core->anal->bbs, iter, bbi)
if (at == bbi->addr)
ret = R_ANAL_RET_DUP;
}
if (split) ret = r_anal_bb_split (core->anal, bb, core->anal->bbs, at);
else r_list_foreach (core->anal->bbs, iter, bbi)
if (at == bbi->addr)
ret = R_ANAL_RET_DUP;
if (ret == R_ANAL_RET_DUP) { /* Dupped bb */
r_anal_bb_free (bb);
return R_FALSE;

View File

@ -28,6 +28,7 @@ static void r_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int len,
RAnalOp analop;
RFlagItem *flag;
int counter = 0;
RMetaItem *mi;
// TODO: All those options must be print flags
int show_color = r_config_get_i (core->config, "scr.color");
@ -90,7 +91,9 @@ static void r_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int len,
r_cons_strcat (comment);
free (comment);
}
// TODO : line analysis must respect data types! shouldnt be interpreted as code
line = r_anal_reflines_str (core->anal, core->reflines, addr, linesopts);
mi = r_meta_find (core->meta, (ut64)core->offset+idx, R_META_ANY, R_META_WHERE_HERE);
ret = r_asm_disassemble (core->assembler, &asmop, buf+idx, len-idx);
if (ret<1) {
ret = 1;
@ -162,6 +165,15 @@ static void r_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int len,
ostackptr = stackptr;
stackptr += analop.stackptr;
}
if (mi)
switch (mi->type) {
case R_META_STRING:
// TODO: filter string (r_str_unscape)
r_cons_printf ("string(%lld): \"%s\"\n", mi->size, mi->str);
ret = (int)mi->size;
free (line);
continue;
}
if (show_bytes) {
char *str, pad[64];
const char *extra = " ";
@ -269,15 +281,24 @@ static void r_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int len,
ut32 word = 0;
int ret = r_io_read_at (core->io, analop.ref, (void *)&word, sizeof (word));
if (ret == sizeof (word)) {
RMetaItem *mi = r_meta_find (core->meta, word,
RMetaItem *mi2 = r_meta_find (core->meta, (ut64)word,
R_META_ANY, R_META_WHERE_HERE);
if (mi) {
if (mi->type == R_META_STRING) {
char *str = r_str_unscape (mi->str);
r_cons_printf (" (at=0x%08x) (len=%lld) \"%s\" ", word, mi->size, str);
if (!mi2) {
mi2 = r_meta_find (core->meta, (ut64)analop.ref,
R_META_ANY, R_META_WHERE_HERE);
if (mi2) {
char *str = r_str_unscape (mi2->str);
r_cons_printf (" (at=0x%08llx) (len=%lld) \"%s\" ", analop.ref, mi2->size, str);
free (str);
} else r_cons_printf ("unknown type '%c'\n", mi->type);
} else r_cons_printf ("; => 0x%08x ", word);
} else r_cons_printf ("; => 0x%08x ", word);
} else {
if (mi2->type == R_META_STRING) {
char *str = r_str_unscape (mi2->str);
r_cons_printf (" (at=0x%08x) (len=%lld) \"%s\" ", word, mi2->size, str);
free (str);
} else r_cons_printf ("unknown type '%c'\n", mi2->type);
}
} else r_cons_printf ("; err [0x%"PFMT64x"]", analop.ref);
}
r_cons_newline ();
@ -387,9 +408,9 @@ static int cmd_zign(void *data, const char *input) {
r_cons_printf ("f sign.%s @ 0x%08"PFMT64x"\n", item->name, core->offset);
break;
case '-':
if (input[1] == '*') {
if (input[1] == '*')
r_sign_reset (core->sign);
} else eprintf ("TODO\n");
else eprintf ("TODO\n");
break;
case '/':
{
@ -1291,15 +1312,17 @@ static int cmd_flag(void *data, const char *input) {
RCore *core = (RCore *)data;
int len = strlen (input)+1;
char *str = alloca (len);
ut64 off = core->offset;
if (core->print->cur_enabled)
off += core->print->cur;
memcpy (str, input+1, len);
switch (input[0]) {
case '+':
r_flag_set (core->flags, str, core->offset, core->blocksize, 1);
r_flag_set (core->flags, str, off, core->blocksize, 1);
break;
case ' ': {
char *s = NULL, *s2 = NULL;
ut64 seek = core->offset;
ut32 bsze = core->blocksize;
s = strchr (str, ' ');
if (s) {
@ -1308,17 +1331,18 @@ static int cmd_flag(void *data, const char *input) {
if (s2) {
*s2 = '\0';
if (s2[1]&&s2[2])
seek = r_num_math (core->num, s2+1);
off = r_num_math (core->num, s2+1);
}
bsze = r_num_math (core->num, s+1);
}
r_flag_set (core->flags, str, seek, bsze, 0);
r_flag_set (core->flags, str, off, bsze, 0);
if (s) *s=' ';
if (s2) *s2=' ';
}
break;
case '-':
r_flag_unset (core->flags, input+1);
if (input[1]) r_flag_unset (core->flags, input+1);
else r_flag_unset_i (core->flags, off);
break;
case 'S':
r_flag_sort (core->flags, (input[1]=='n'));
@ -1350,6 +1374,7 @@ static int cmd_flag(void *data, const char *input) {
" f name 12 33 ; same as above\n"
" f+name 12 @ 33 ; like above but creates new one if doesnt exist\n"
" f-name ; remove flag 'name'\n"
" f-@addr ; remove flag at address expression\n"
" f ; list flags\n"
" f* ; list flags in r commands\n"
" fs functions ; set flagspace\n"
@ -2248,6 +2273,7 @@ static int cmd_open(void *data, const char *input) {
static int cmd_meta(void *data, const char *input) {
RCore *core = (RCore*)data;
int i, ret, line = 0;
ut64 addr = core->offset;
char file[1024];
switch (input[0]) {
case '*':
@ -2279,10 +2305,14 @@ static int cmd_meta(void *data, const char *input) {
case 'x': /* code xref */
case 'X': /* data xref */
case 'F': /* add function */
if (input[1]=='-') {
if (input[2]==' ')
addr = r_num_math (core->num, input+3);
r_meta_del (core->meta, input[0], addr, 1, "");
} else
if (input[1]=='\0'||input[1]=='*') {
r_meta_list (core->meta, input[0]);
} else {
ut64 addr = core->offset;
char fun_name[128];
int size = atoi (input+1);
int type = input[0];
@ -2317,18 +2347,24 @@ static int cmd_meta(void *data, const char *input) {
r_meta_add (core->meta, type, addr, size, fun_name);
}
break;
case '-':
if (input[1]==' ')
addr = r_num_math (core->num, input+2);
r_meta_del (core->meta, R_META_ANY, addr, 1, "");
break;
case '\0':
case '?':
eprintf (
"Usage: C[CDFsSmxX?] [arg]\n"
" CL [addr] ; show 'code line' information (bininfo)\n"
"Usage: C[-LCFsSmxX?] [...]\n"
" C-[@][ addr] ; delete metadata at given address\n"
" CL[-] [addr] ; show 'code line' information (bininfo)\n"
" CF [size] [name] [addr] [name] ; register function size here\n"
" CC [string] ; add comment\n"
" Cs [size] [[addr]] ; add string\n"
" CS ; ...\n"
" Cm [fmt] [args] ; string\n"
" Cx [...] ; add code xref\n"
" CX [...] ; add data xref\n");
" CC [string] ; add comment\n"
" Cs[-] [size] [[addr]] ; add string\n"
" CS[-] [size] ; ...\n"
" Cm[-] [fmt] [args] ; string\n"
" Cx[-] [...] ; add code xref\n"
" CX[-] [...] ; add data xref\n");
}
return R_TRUE;
}

View File

@ -451,16 +451,24 @@ R_API void r_core_visual_config(RCore *core) {
R_API void r_core_visual_define (RCore *core) {
int ch;
r_cons_printf ("Define current block as:\n");
r_cons_printf (" f - analyze function\n");
r_cons_printf (" q - quit/cancel operation\n");
r_cons_printf ("TODO: add support for data, string, code ..\n");
ut64 off = core->offset;
if (core->print->cur_enabled)
off += core->print->cur;
r_cons_printf ("Define current block as:\n"
" u - undefine metadata here\n"
" f - analyze function\n"
" q - quit/cancel operation\n"
"TODO: add support for data, string, code ..\n");
r_cons_flush ();
ch = r_cons_readchar();
ch = r_cons_arrow_to_hjkl(ch); // get ESC+char, return 'hjkl' char
ch = r_cons_readchar ();
ch = r_cons_arrow_to_hjkl (ch); // get ESC+char, return 'hjkl' char
switch(ch) {
case 'u':
r_meta_del (core->meta, R_META_ANY, off, 1, "");
r_flag_unset_i (core->flags, off);
break;
case 'f':
r_core_cmd (core, "af", 0);
r_core_cmd (core, "ab", 0);
@ -732,6 +740,7 @@ R_API int r_core_visual(RCore *core, const char *input) {
ut64 scrseek;
int ch;
core->print->cur_enabled = R_FALSE;
vi = r_config_get (core->config, "cmd.vprompt");
if (vi) r_core_cmd (core, vi, 0);
@ -770,6 +779,7 @@ R_API int r_core_visual(RCore *core, const char *input) {
if (color)
r_cons_printf (Color_RESET);
core->print->cur_enabled = R_FALSE;
return 0;
}

View File

@ -155,6 +155,28 @@ R_API RFlagItem *r_flag_get_i(RFlag *f, ut64 off) {
#endif
}
R_API int r_flag_unset_i(RFlag *f, ut64 addr) {
RFlagItem *item;
struct list_head *pos, *tmp;
list_for_each_safe (pos, tmp, &f->flags) {
item = list_entry (pos, RFlagItem, list);
if (item->offset == addr) {
// TODO: free item!!
list_del (&item->list);
//TODO: segfaults !! r_flag_item_free (item);
return R_TRUE;
}
}
return R_FALSE;
#if USE_BTREE
/* XXX */
btree_del (f->tree, item, cmp, NULL);
btree_del (f->ntree, item, ncmp, NULL);
#endif
return 0;
}
R_API int r_flag_unset(RFlag *f, const char *name) {
RFlagItem *item;
struct list_head *pos, *tmp;

View File

@ -83,6 +83,7 @@ R_API struct r_core_t *r_core_free(struct r_core_t *c);
R_API int r_core_config_init(struct r_core_t *core);
R_API int r_core_prompt(struct r_core_t *r);
R_API int r_core_cmd(struct r_core_t *r, const char *cmd, int log);
// XXX void*?? must be RCore !
R_API int r_core_cmdf(void *user, const char *fmt, ...);
R_API int r_core_cmd0(void *user, const char *cmd);
R_API void r_core_cmd_init(struct r_core_t *core);

View File

@ -44,6 +44,7 @@ R_API void r_flag_list(struct r_flag_t *f, int rad);
R_API RFlagItem *r_flag_get(RFlag *f, const char *name);
R_API RFlagItem *r_flag_get_i(RFlag *f, ut64 off);
R_API int r_flag_unset(struct r_flag_t *f, const char *name);
R_API int r_flag_unset_i(struct r_flag_t *f, ut64 addr);
R_API int r_flag_set(struct r_flag_t *fo, const char *name, ut64 addr, ut32 size, int dup);
R_API int r_flag_sort(RFlag *f, int namesort);
R_API int r_flag_name_check(const char *name);