* 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:
pancake 2011-12-02 01:58:34 +01:00
parent 3f72bede22
commit 07620cd50c
8 changed files with 53 additions and 9 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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] )
*

View File

@ -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) {

View File

@ -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);
}

View File

@ -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;

View File

@ -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) {

View File

@ -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 */