Skip to content

Commit 3d12d29

Browse files
authored
Check esil references on flags in 'aae' ##analysis
1 parent 08e6e2b commit 3d12d29

File tree

2 files changed

+50
-11
lines changed

2 files changed

+50
-11
lines changed

libr/core/canal.c

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5266,7 +5266,14 @@ static void cccb(void *u) {
52665266
}
52675267

52685268
// dup with isValidAddress wtf
5269-
static bool myvalid(RIO *io, ut64 addr) {
5269+
static bool myvalid(RCore *core, ut64 addr) {
5270+
RIO *io = core->io;
5271+
#if 1
5272+
RFlagItem *fi = r_flag_get_i (core->flags, addr);
5273+
if (fi && strchr (fi->name, '.')) {
5274+
return true;
5275+
}
5276+
#endif
52705277
if (addr < 0x100) {
52715278
return false;
52725279
}
@@ -5363,7 +5370,7 @@ static bool esilbreak_mem_write(REsil *esil, ut64 addr, const ut8 *buf, int len)
53635370
RCore *core = esil->anal->coreb.core;
53645371
handle_var_stack_access (esil, addr, R_PERM_W, len);
53655372
// ignore writes in stack
5366-
if (myvalid (core->io, addr) && r_io_read_at (core->io, addr, (ut8*)buf, len)) {
5373+
if (myvalid (core, addr) && r_io_read_at (core->io, addr, (ut8*)buf, len)) {
53675374
if (!is_stack (core->io, addr)) {
53685375
r_anal_xrefs_set (core->anal, esil->addr, addr, R_ANAL_REF_TYPE_DATA | R_ANAL_REF_TYPE_WRITE);
53695376
/** resolve ptr */
@@ -5388,7 +5395,7 @@ static bool esilbreak_mem_read(REsil *esil, ut64 addr, ut8 *buf, int len) {
53885395
esilbreak_last_read = addr;
53895396
}
53905397
handle_var_stack_access (esil, addr, R_PERM_R, len);
5391-
if (myvalid (core->io, addr) && r_io_read_at (core->io, addr, (ut8*)buf, len)) {
5398+
if (myvalid (core, addr) && r_io_read_at (core->io, addr, (ut8*)buf, len)) {
53925399
ut64 refptr = UT64_MAX;
53935400
bool trace = true;
53945401
switch (len) {
@@ -5410,7 +5417,7 @@ static bool esilbreak_mem_read(REsil *esil, ut64 addr, ut8 *buf, int len) {
54105417
break;
54115418
}
54125419
// TODO incorrect
5413-
if (trace && myvalid (core->io, refptr)) {
5420+
if (trace && myvalid (core, refptr)) {
54145421
if (ntarget == UT64_MAX || ntarget == refptr) {
54155422
str[0] = 0;
54165423
if (r_io_read_at (core->io, refptr, str, sizeof (str)) < 1) {
@@ -5424,7 +5431,7 @@ static bool esilbreak_mem_read(REsil *esil, ut64 addr, ut8 *buf, int len) {
54245431
}
54255432
}
54265433
}
5427-
if (myvalid (core->io, addr) && r_io_read_at (core->io, addr, (ut8*)buf, len)) {
5434+
if (myvalid (core, addr) && r_io_read_at (core->io, addr, (ut8*)buf, len)) {
54285435
if (!is_stack (core->io, addr)) {
54295436
r_anal_xrefs_set (core->anal, esil->addr, addr, R_ANAL_REF_TYPE_DATA | R_ANAL_REF_TYPE_READ);
54305437
}
@@ -6024,6 +6031,37 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char *
60246031
if (CHECKREF (ESIL->cur)) {
60256032
r_anal_xrefs_set (core->anal, cur, ESIL->cur, R_ANAL_REF_TYPE_STRN | R_ANAL_REF_TYPE_READ);
60266033
}
6034+
#if 0
6035+
ut64 dst = esilbreak_last_read;
6036+
if (dst != UT64_MAX && CHECKREF (dst)) {
6037+
if (myvalid (core, dst)) {
6038+
r_anal_xrefs_set (core->anal, cur, dst, R_ANAL_REF_TYPE_DATA | R_ANAL_REF_TYPE_READ);
6039+
if (cfg_anal_strings) {
6040+
add_string_ref (core, op.addr, dst);
6041+
}
6042+
}
6043+
}
6044+
#if 0
6045+
dst = r_reg_getv (core->anal->reg, "tmp");
6046+
if (dst != UT64_MAX && CHECKREF (dst)) {
6047+
if (myvalid (core, dst)) {
6048+
r_anal_xrefs_set (core->anal, cur, dst, R_ANAL_REF_TYPE_DATA | R_ANAL_REF_TYPE_READ);
6049+
if (cfg_anal_strings) {
6050+
add_string_ref (core, op.addr, dst);
6051+
}
6052+
}
6053+
}
6054+
#endif
6055+
dst = esilbreak_last_data;
6056+
if (dst != UT64_MAX && CHECKREF (dst)) {
6057+
if (myvalid (core, dst)) {
6058+
r_anal_xrefs_set (core->anal, cur, dst, R_ANAL_REF_TYPE_DATA | R_ANAL_REF_TYPE_READ);
6059+
if (cfg_anal_strings) {
6060+
add_string_ref (core, op.addr, dst);
6061+
}
6062+
}
6063+
}
6064+
#endif
60276065
} else if ((target && op.ptr == ntarget) || !target) {
60286066
if (CHECKREF (ESIL->cur)) {
60296067
if (op.ptr && r_io_is_valid_offset (core->io, op.ptr, !core->anal->opt.noncode)) {
@@ -6073,7 +6111,7 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char *
60736111
break;
60746112
}
60756113
if ((target && dst == ntarget) || !target) {
6076-
if (dst > 0xffff && opsrc1 && (dst & 0xffff) == (opsrc1->imm & 0xffff) && myvalid (core->io, dst)) {
6114+
if (dst > 0xffff && opsrc1 && (dst & 0xffff) == (opsrc1->imm & 0xffff) && myvalid (core, dst)) {
60776115
RFlagItem *f;
60786116
char *str;
60796117
if (CHECKREF (dst) || CHECKREF (cur)) {
@@ -6109,7 +6147,7 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char *
61096147
{
61106148
ut64 dst = esilbreak_last_read;
61116149
if (dst != UT64_MAX && CHECKREF (dst)) {
6112-
if (myvalid (core->io, dst)) {
6150+
if (myvalid (core, dst)) {
61136151
r_anal_xrefs_set (core->anal, cur, dst, R_ANAL_REF_TYPE_DATA | R_ANAL_REF_TYPE_READ);
61146152
if (cfg_anal_strings) {
61156153
add_string_ref (core, op.addr, dst);
@@ -6118,7 +6156,7 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char *
61186156
}
61196157
dst = esilbreak_last_data;
61206158
if (dst != UT64_MAX && CHECKREF (dst)) {
6121-
if (myvalid (core->io, dst)) {
6159+
if (myvalid (core, dst)) {
61226160
r_anal_xrefs_set (core->anal, cur, dst, R_ANAL_REF_TYPE_DATA | R_ANAL_REF_TYPE_READ);
61236161
if (cfg_anal_strings) {
61246162
add_string_ref (core, op.addr, dst);
@@ -6131,7 +6169,7 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char *
61316169
{
61326170
ut64 dst = op.jump;
61336171
if (CHECKREF (dst)) {
6134-
if (myvalid (core->io, dst)) {
6172+
if (myvalid (core, dst)) {
61356173
r_anal_xrefs_set (core->anal, cur, dst, R_ANAL_REF_TYPE_CODE | R_ANAL_REF_TYPE_EXEC);
61366174
}
61376175
}
@@ -6141,7 +6179,7 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char *
61416179
{
61426180
ut64 dst = op.jump;
61436181
if (CHECKREF (dst) || (target && dst == ntarget)) {
6144-
if (myvalid (core->io, dst)) {
6182+
if (myvalid (core, dst)) {
61456183
r_anal_xrefs_set (core->anal, cur, dst, R_ANAL_REF_TYPE_CALL | R_ANAL_REF_TYPE_EXEC);
61466184
}
61476185
ESIL->old = cur + op.size;
@@ -6161,7 +6199,7 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char *
61616199
dst = r_reg_getv (core->anal->reg, pcname);
61626200
}
61636201
if (CHECKREF (dst)) {
6164-
if (myvalid (core->io, dst)) {
6202+
if (myvalid (core, dst)) {
61656203
RAnalRefType ref =
61666204
(op.type & R_ANAL_OP_TYPE_MASK) == R_ANAL_OP_TYPE_UCALL
61676205
? R_ANAL_REF_TYPE_CALL

libr/flag/flag.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,7 @@ R_API RFlagItem *r_flag_get(RFlag *f, const char *name) {
509509
}
510510

511511
/* return the first flag item that can be found at offset "off", or NULL otherwise */
512+
// R2_600 - rename to r_flag_get_at and r_flag_get_in ??
512513
R_API RFlagItem *r_flag_get_i(RFlag *f, ut64 off) {
513514
R_RETURN_VAL_IF_FAIL (f, NULL);
514515
if (f->mask) {

0 commit comments

Comments
 (0)