static int trace_hook_reg_read(RAnalEsil *esil, const char *name, ut64 *res, int *size) { int ret = 0; if (*name=='0') { //eprintf ("Register not found in profile\n"); return 0; } if (ocbs.hook_reg_read) { RAnalEsilCallbacks cbs = esil->cb; esil->cb = ocbs; ret = ocbs.hook_reg_read (esil, name, res, size); esil->cb = cbs; } if (!ret && esil->cb.reg_read) { ret = esil->cb.reg_read (esil, name, res, size); } if (ret) { ut64 val = *res; //eprintf ("[ESIL] REG READ %s 0x%08"PFMT64x"\n", name, val); sdb_array_add (DB, KEY ("reg.read"), name, 0); sdb_num_set (DB, KEYREG ("reg.read", name), val, 0); } //else { //eprintf ("[ESIL] REG READ %s FAILED\n", name); //} return ret; }
R_API void r_anal_esil_trace_show(RAnalEsil *esil, int idx) { PrintfCallback p = esil->anal->printf; const char *str2; const char *str; int trace_idx = esil->trace_idx; esil->trace_idx = idx; str2 = sdb_const_get (DB, KEY ("addr"), 0); if (!str2) { return; } p ("dr pc = %s\n", str2); /* registers */ str = sdb_const_get (DB, KEY ("reg.read"), 0); if (str) { char regname[32]; const char *next, *ptr = str; if (ptr && *ptr) { do { const char *ztr = sdb_const_anext (ptr, &next); int len = next? (int)(size_t)(next-ztr)-1 : strlen (ztr); if (len <sizeof(regname)) { memcpy (regname, ztr, len); regname[len] = 0; str2 = sdb_const_get (DB, KEYREG ("reg.read", regname), 0); p ("dr %s = %s\n", regname, str2); } else { eprintf ("Invalid entry in reg.read\n"); } ptr = next; } while (next); } } /* memory */ str = sdb_const_get (DB, KEY ("mem.read"), 0); if (str) { char addr[64]; const char *next, *ptr = str; if (ptr && *ptr) { do { const char *ztr = sdb_const_anext (ptr, &next); int len = next? (int)(size_t)(next-ztr)-1 : strlen (ztr); if (len <sizeof(addr)) { memcpy (addr, ztr, len); addr[len] = 0; str2 = sdb_const_get (DB, KEYAT ("mem.read.data", r_num_get (NULL, addr)), 0); p ("wx %s @ %s\n", str2, addr); } else { eprintf ("Invalid entry in reg.read\n"); } ptr = next; } while (next); } } esil->trace_idx = trace_idx; }
static int trace_hook_reg_write(RAnalEsil *esil, const char *name, ut64 val) { int ret = 0; eprintf ("[ESIL] REG WRITE %s 0x%08"PFMT64x"\n", name, val); sdb_array_add (DB, KEY ("reg.write"), name, 0); sdb_num_set (DB, KEYREG ("reg.write", name), val, 0); if (ocbs.hook_reg_write) { RAnalEsilCallbacks cbs = esil->cb; esil->cb = ocbs; ret = ocbs.hook_reg_write (esil, name, val); esil->cb = cbs; } return ret; }
static int trace_hook_reg_read(RAnalEsil *esil, const char *name, ut64 *res) { int ret = 0; ut64 val = 0LL; if (*name=='0') { eprintf ("Register not found in profile\n"); return 0; } if (esil->cb.reg_read) { (void)esil->cb.reg_read (esil, name, &val); } eprintf ("[ESIL] REG READ %s 0x%08"PFMT64x"\n", name, val); sdb_array_add (DB, KEY ("reg.read"), name, 0); sdb_num_set (DB, KEYREG ("reg.read", name), val, 0); if (ocbs.hook_reg_read) { RAnalEsilCallbacks cbs = esil->cb; esil->cb = ocbs; ret = ocbs.hook_reg_read (esil, name, res); esil->cb = cbs; } return ret; }