mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-28 01:56:12 +00:00
* Fix AT&T X86 disassembler when facing invalid instructions
- This bug was reported by @hteso * Apply @earada patch hiding cursor in visual mode * Honor asm.size config variable
This commit is contained in:
parent
3f72bede22
commit
07620cd50c
@ -279,7 +279,7 @@ R_API int r_asm_disassemble(RAsm *a, struct r_asm_op_t *op, const ut8 *buf, ut64
|
||||
r_parse_parse (a->ofilter, op->buf_asm, op->buf_asm);
|
||||
else memcpy (op->buf, buf, ret);
|
||||
r_hex_bin2str (buf, ret, op->buf_hex);
|
||||
}
|
||||
} else ret = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,6 @@ static int modify(RAsm *a, ut8 *buf, int field, ut64 val) {
|
||||
|
||||
static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, ut64 len) {
|
||||
static ud_t disasm_obj;
|
||||
|
||||
ud_init (&disasm_obj);
|
||||
ud_set_syntax (&disasm_obj,
|
||||
a->syntax==R_ASM_SYNTAX_ATT?
|
||||
@ -56,9 +55,10 @@ static int disassemble(RAsm *a, RAsmOp *op, const ut8 *buf, ut64 len) {
|
||||
op->inst_len = ud_disassemble (&disasm_obj);
|
||||
//op->inst_len = ud_insn_len (&disasm_obj);
|
||||
snprintf (op->buf_asm, R_ASM_BUFSIZE, "%s", ud_insn_asm (&disasm_obj));
|
||||
if (!op->inst_len || !strcmp (op->buf_asm, "invalid"))
|
||||
if (!op->inst_len || strstr (op->buf_asm, "invalid"))
|
||||
op->inst_len = -1;
|
||||
if (op->inst_len<1)
|
||||
op->inst_len = -1;
|
||||
|
||||
return op->inst_len;
|
||||
}
|
||||
|
||||
|
@ -421,6 +421,15 @@ R_API int r_cons_get_size(int *rows) {
|
||||
return I.columns;
|
||||
}
|
||||
|
||||
R_API void r_cons_show_cursor (int cursor) {
|
||||
#if __WINDOWS__
|
||||
// TODO
|
||||
#else
|
||||
if (cursor) write (1, "\x1b[?25h", 6);
|
||||
else write(1, "\x1b[?25l", 6);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* void r_cons_set_raw( [0,1] )
|
||||
*
|
||||
|
@ -4287,7 +4287,10 @@ static int cmd_hash(void *data, const char *input) {
|
||||
}
|
||||
|
||||
static int cmd_visual(void *data, const char *input) {
|
||||
return r_core_visual ((RCore *)data, input);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
int ret = r_core_visual ((RCore *)data, input);
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cmd_system(void *data, const char *input) {
|
||||
|
@ -56,6 +56,7 @@ R_API int r_core_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int l
|
||||
#warning asm.dwarf is now marked as experimental and disabled
|
||||
int show_dwarf = 0; // r_config_get_i (core->config, "asm.dwarf");
|
||||
int show_linescall = r_config_get_i (core->config, "asm.linescall");
|
||||
int show_size = r_config_get_i (core->config, "asm.size");
|
||||
int show_trace = r_config_get_i (core->config, "asm.trace");
|
||||
int linesout = r_config_get_i (core->config, "asm.linesout");
|
||||
int adistrick = r_config_get_i (core->config, "asm.middle"); // TODO: find better name
|
||||
@ -190,8 +191,9 @@ R_API int r_core_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int l
|
||||
}
|
||||
// TODO : line analysis must respect data types! shouldnt be interpreted as code
|
||||
ret = r_asm_disassemble (core->assembler, &asmop, buf+idx, len-idx);
|
||||
if (ret<1) {
|
||||
if (ret<1) { // XXX: move to r_asm_disassemble ()
|
||||
ret = 1;
|
||||
asmop.inst_len = 1;
|
||||
//eprintf ("** invalid opcode at 0x%08"PFMT64x" **\n",
|
||||
// core->assembler->pc + ret);
|
||||
lastfail = 1;
|
||||
@ -314,11 +316,12 @@ R_API int r_core_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int l
|
||||
else r_cons_printf ("%s:\n", flag->name);
|
||||
}
|
||||
}
|
||||
if (show_lines && line) {
|
||||
if (show_lines && line)
|
||||
r_cons_strcat (line);
|
||||
}
|
||||
if (show_offset)
|
||||
printoffset (at, show_color, (at==dest));
|
||||
if (show_size)
|
||||
r_cons_printf ("%d ", analop.length);
|
||||
if (show_trace) {
|
||||
RDebugTracepoint *tp = r_debug_trace_get (core->dbg, at);
|
||||
r_cons_printf ("%02x:%04x ", tp?tp->times:0, tp?tp->count:0);
|
||||
@ -517,7 +520,7 @@ R_API int r_core_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int l
|
||||
RAsmOp ao; /* disassemble for the vm .. */
|
||||
int os = core->assembler->syntax;
|
||||
r_asm_set_syntax (core->assembler, R_ASM_SYNTAX_INTEL);
|
||||
ret = r_asm_disassemble (core->assembler, &ao, buf+idx, len-idx);
|
||||
r_asm_disassemble (core->assembler, &ao, buf+idx, len-idx);
|
||||
r_asm_set_syntax (core->assembler, os);
|
||||
}
|
||||
|
||||
|
@ -43,9 +43,11 @@ R_API void r_core_visual_prompt (RCore *core) {
|
||||
char buf[1024];
|
||||
ut64 oseek = core->offset;
|
||||
r_line_set_prompt (":> ");
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_fgets (buf, sizeof (buf), 0, NULL);
|
||||
r_core_cmd (core, buf, 0);
|
||||
r_cons_any_key ();
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
if (curset) r_core_seek (core, oseek, 1);
|
||||
}
|
||||
|
||||
@ -151,6 +153,7 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
break;
|
||||
case 'a':
|
||||
r_cons_printf ("Enter assembler opcodes separated with ';':\n");
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_flush ();
|
||||
r_cons_set_raw (R_FALSE);
|
||||
strcpy (buf, "wa ");
|
||||
@ -161,10 +164,12 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
r_core_cmd (core, buf, R_TRUE);
|
||||
if (curset) r_core_seek (core, core->offset - cursor, 1);
|
||||
}
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
r_cons_set_raw (R_TRUE);
|
||||
break;
|
||||
case 'w':
|
||||
r_cons_printf ("Enter hexpair string to write:\n");
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_flush ();
|
||||
r_cons_set_raw (0);
|
||||
strcpy (buf, "wx ");
|
||||
@ -176,6 +181,7 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
if (curset) r_core_seek (core, core->offset - cursor, 1);
|
||||
}
|
||||
r_cons_set_raw (1);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
break;
|
||||
case 'e':
|
||||
r_core_visual_config (core);
|
||||
@ -503,6 +509,7 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
break;
|
||||
case ';':
|
||||
r_cons_printf ("Enter a comment: ('-' to remove, '!' to use $EDITOR)\n");
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_flush ();
|
||||
r_cons_set_raw (R_FALSE);
|
||||
strcpy (buf, "CC ");
|
||||
@ -527,6 +534,7 @@ R_API int r_core_visual_cmd(RCore *core, int ch) {
|
||||
if (curset) r_core_seek (core, orig, 1);
|
||||
}
|
||||
r_cons_set_raw (R_TRUE);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
break;
|
||||
case 'B':
|
||||
autoblocksize = !autoblocksize;
|
||||
|
@ -120,19 +120,23 @@ R_API int r_core_visual_trackflags(RCore *core) {
|
||||
case 'a':
|
||||
switch (menu) {
|
||||
case 0: // new flag space
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_line_set_prompt ("add flagspace: ");
|
||||
strcpy (cmd, "fs ");
|
||||
if (r_cons_fgets (cmd+3, sizeof (cmd)-4, 0, NULL) > 0) {
|
||||
r_core_cmd (core, cmd, 0);
|
||||
r_cons_set_raw (1);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
}
|
||||
break;
|
||||
case 1: // new flag
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_line_set_prompt ("add flag: ");
|
||||
strcpy (cmd, "f ");
|
||||
if (r_cons_fgets (cmd+2, sizeof (cmd)-3, 0, NULL) > 0) {
|
||||
r_core_cmd (core, cmd, 0);
|
||||
r_cons_set_raw (1);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -163,6 +167,7 @@ R_API int r_core_visual_trackflags(RCore *core) {
|
||||
case 'r':
|
||||
if (menu == 1) {
|
||||
int len;
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_set_raw (0);
|
||||
// TODO: use r_flag_rename or wtf?..fr doesnt uses this..
|
||||
snprintf (cmd, sizeof (cmd), "fr %s ", fs2);
|
||||
@ -173,6 +178,7 @@ R_API int r_core_visual_trackflags(RCore *core) {
|
||||
cmd[0]='\0';
|
||||
r_core_cmd (core, cmd, 0);
|
||||
r_cons_set_raw (1);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
}
|
||||
break;
|
||||
case 'P':
|
||||
@ -215,6 +221,7 @@ R_API int r_core_visual_trackflags(RCore *core) {
|
||||
r_cons_any_key ();
|
||||
break;
|
||||
case ':':
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_set_raw (0);
|
||||
cmd[0]='\0';
|
||||
r_line_set_prompt (":> ");
|
||||
@ -223,6 +230,7 @@ R_API int r_core_visual_trackflags(RCore *core) {
|
||||
//line[strlen(line)-1]='\0';
|
||||
r_core_cmd (core, cmd, 1);
|
||||
r_cons_set_raw (1);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
if (cmd[0])
|
||||
r_cons_any_key ();
|
||||
//cons_gotoxy(0,0);
|
||||
@ -401,11 +409,13 @@ static void config_visual_hit(RCore *core, const char *name, int editor) {
|
||||
} else {
|
||||
// FGETS AND SO
|
||||
r_cons_printf ("New value (old=%s): \n", node->value);
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_flush ();
|
||||
r_cons_set_raw (0);
|
||||
r_line_set_prompt (":> ");
|
||||
r_cons_fgets (buf, sizeof (buf)-1, 0, 0);
|
||||
r_cons_set_raw (1);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
node->value = r_str_dup (node->value, buf);
|
||||
}
|
||||
}
|
||||
@ -553,6 +563,7 @@ R_API void r_core_visual_config(RCore *core) {
|
||||
r_cons_any_key ();
|
||||
break;
|
||||
case ':':
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_set_raw(0);
|
||||
/* WTF READLINE?? WE DONT USE THAT!! */
|
||||
#if HAVE_LIB_READLINE
|
||||
@ -572,6 +583,7 @@ R_API void r_core_visual_config(RCore *core) {
|
||||
r_core_cmd (core, cmd, 1);
|
||||
#endif
|
||||
r_cons_set_raw (1);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
if (cmd[0])
|
||||
r_cons_any_key ();
|
||||
//r_cons_gotoxy(0,0);
|
||||
@ -784,10 +796,12 @@ R_API void r_core_visual_mounts (RCore *core) {
|
||||
file = r_fs_open (core->fs, path);
|
||||
if (file) {
|
||||
r_fs_read (core->fs, file, 0, file->size);
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_set_raw (0);
|
||||
r_line_set_prompt ("Dump path (ej: /tmp/file): ");
|
||||
r_cons_fgets (buf, sizeof (buf)-1, 0, 0);
|
||||
r_cons_set_raw (1);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
r_file_dump (buf, file->data, file->size);
|
||||
r_fs_close (core->fs, file);
|
||||
r_cons_printf ("Done\n");
|
||||
@ -816,10 +830,12 @@ R_API void r_core_visual_mounts (RCore *core) {
|
||||
r_cons_any_key ();
|
||||
break;
|
||||
case ':':
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_set_raw (0);
|
||||
r_line_set_prompt (":> ");
|
||||
r_cons_fgets (buf, sizeof (buf)-1, 0, 0);
|
||||
r_cons_set_raw (1);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
r_core_cmd (core, buf, 1);
|
||||
r_cons_any_key ();
|
||||
break;
|
||||
@ -970,6 +986,7 @@ R_API void r_core_visual_anal(RCore *core) {
|
||||
case 0:
|
||||
eprintf ("TODO: Add new function manually\n");
|
||||
/*
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_set_raw (R_FALSE);
|
||||
r_line_set_prompt ("Address: ");
|
||||
if (!r_cons_fgets (old, sizeof (old), 0, NULL)) break;
|
||||
@ -988,6 +1005,7 @@ eprintf ("TODO: Add new function manually\n");
|
||||
//XXX sprintf(cmd, "CF %lld @ 0x%08llx", size, addr);
|
||||
// XXX r_core_cmd0(core, cmd);
|
||||
r_cons_set_raw (R_TRUE);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
*/
|
||||
break;
|
||||
case 1:
|
||||
@ -995,6 +1013,7 @@ eprintf ("TODO: Add new function manually\n");
|
||||
}
|
||||
break;
|
||||
case 'm':
|
||||
r_cons_show_cursor (R_TRUE);
|
||||
r_cons_set_raw (R_FALSE);
|
||||
r_line_set_prompt ("New name: ");
|
||||
if (!r_cons_fgets (old, sizeof (old), 0, NULL)) break;
|
||||
@ -1002,6 +1021,7 @@ eprintf ("TODO: Add new function manually\n");
|
||||
function_rename (core, addr, old);
|
||||
|
||||
r_cons_set_raw (R_TRUE);
|
||||
r_cons_show_cursor (R_FALSE);
|
||||
break;
|
||||
case 'd':
|
||||
switch (level) {
|
||||
|
@ -182,6 +182,7 @@ R_API void r_cons_clear_line();
|
||||
R_API void r_cons_stdout_open(const char *file, int append);
|
||||
R_API int r_cons_stdout_set_fd(int fd);
|
||||
R_API void r_cons_gotoxy(int x, int y);
|
||||
R_API void r_cons_show_cursor (int cursor);
|
||||
R_API void r_cons_set_raw(int b);
|
||||
|
||||
/* output */
|
||||
|
Loading…
x
Reference in New Issue
Block a user