static int esilbreak_check_pc (RDebug *dbg, ut64 pc) { EsilBreak *ew; RListIter *iter; if (!pc) pc = r_debug_reg_get (dbg, dbg->reg->name[R_REG_NAME_PC]); r_list_foreach (EWPS, iter, ew) { if (ew->rwx & R_IO_EXEC) { if (exprmatch (dbg, pc, ew->expr)) return 1; } } return 0; }
static int esilbreak_mem_write(RAnalEsil *esil, ut64 addr, const ut8 *buf, int len) { EsilBreak *ew; RListIter *iter; eprintf (Color_RED"MEM WRTE 0x%"PFMT64x"\n"Color_RESET, addr); r_list_foreach (EWPS, iter, ew) { if (ew->rwx & R_IO_WRITE && ew->dev == 'm') { if (exprmatch (dbg, addr, ew->expr)) { has_match = 1; return 1; } } } return 1; // fallback }
static int esilbreak_mem_read(RAnalEsil *esil, ut64 addr, ut8 *buf, int len) { EsilBreak *ew; RListIter *iter; eprintf (Color_GREEN"MEM READ 0x%llx\n"Color_RESET, addr); r_list_foreach (EWPS, iter, ew) { if (ew->rwx & R_IO_READ && ew->dev == 'm') { if (exprmatch (dbg, addr, ew->expr)) { has_match = 1; return 1; } } } return 0; // fallback }
static int exprmatchreg (RDebug *dbg, const char *regname, const char *expr) { int ret = 0; char *p; char *s = strdup (expr); if (!s) { return 0; } if (!strcmp (regname, s)) { ret = 1; } else { #define CURVAL 0){}r_str_trim_head_tail (s);if (!strcmp(regname,s) && regval ut64 regval = r_debug_reg_get_err (dbg, regname, NULL, NULL); if (exprtoken (dbg, s, ">=", &p)) { if (CURVAL >= r_num_math (dbg->num, p)) ret = 1; } else if (exprtoken (dbg, s, "<=", &p)) { if (CURVAL <= r_num_math (dbg->num, p)) ret = 1; } else if (exprtoken (dbg, s, "==", &p)) { if (CURVAL <= r_num_math (dbg->num, p)) ret = 1; } else if (exprtoken (dbg, s, "<", &p)) { if (CURVAL < r_num_math (dbg->num, p)) ret = 1; } else if (exprtoken (dbg, s, ">", &p)) { if (CURVAL > r_num_math (dbg->num, p)) ret = 1; } else if (exprtoken (dbg, s, " ", &p)) { r_str_trim_head_tail (s); if (!strcmp (regname, s)) { ut64 num = r_num_math (dbg->num, p); ret = exprmatch (dbg, num, s); } } else { if (!strcmp (regname, s)) { ret = 1; } } } free (s); return ret; }