mirror of
https://github.com/radareorg/radare2.git
synced 2025-03-04 20:39:46 +00:00
Fix #4080 : remove assumption that functions are contiguous
* anal/p/anal_java: remove function that does nothing * anal/fcn: workaround for java analysis
This commit is contained in:
parent
7ab187841f
commit
c169073c74
@ -597,7 +597,7 @@ repeat:
|
||||
#else
|
||||
// hardcoded jmp size // must be checked at the end wtf?
|
||||
// always fitfcnsz and retend
|
||||
if (op.jump>fcn->addr && op.jump<(fcn->addr+fcn->size)) {
|
||||
if (r_anal_fcn_is_in_offset (op.jump)) {
|
||||
/* jump inside the same function */
|
||||
FITFCNSZ();
|
||||
return R_ANAL_RET_END;
|
||||
@ -857,8 +857,7 @@ R_API void r_anal_trim_jmprefs(RAnalFunction *fcn) {
|
||||
RListIter *iter;
|
||||
RListIter *tmp;
|
||||
r_list_foreach_safe (fcn->refs, iter, tmp, ref) {
|
||||
if (ref->type == R_ANAL_REF_TYPE_CODE &&
|
||||
ref->addr >= fcn->addr && (ref->addr - fcn->addr) < fcn->size) {
|
||||
if (ref->type == R_ANAL_REF_TYPE_CODE && r_anal_fcn_is_in_offset (fcn, ref->addr)) {
|
||||
r_list_delete(fcn->refs, iter);
|
||||
}
|
||||
}
|
||||
@ -1025,11 +1024,9 @@ R_API RAnalFunction *r_anal_get_fcn_in(RAnal *anal, ut64 addr, int type) {
|
||||
}
|
||||
r_list_foreach (anal->fcns, iter, fcn) {
|
||||
if (!type || (fcn && fcn->type & type)) {
|
||||
if (addr == fcn->addr ||
|
||||
(ret == NULL && ((addr > fcn->addr) &&
|
||||
(addr < fcn->addr + fcn->size))))
|
||||
if (fcn->addr == addr || (!ret && r_anal_fcn_is_in_offset (fcn, addr))) {
|
||||
ret = fcn;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@ -1040,8 +1037,9 @@ R_API RAnalFunction *r_anal_fcn_find_name(RAnal *anal, const char *name) {
|
||||
RAnalFunction *fcn = NULL;
|
||||
RListIter *iter;
|
||||
r_list_foreach (anal->fcns, iter, fcn) {
|
||||
if (!strcmp (name, fcn->name))
|
||||
if (!strcmp (name, fcn->name)) {
|
||||
return fcn;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@ -1294,16 +1292,35 @@ R_API RList* r_anal_fcn_get_bbs (RAnalFunction *anal) {
|
||||
}
|
||||
|
||||
R_API int r_anal_fcn_is_in_offset (RAnalFunction *fcn, ut64 addr) {
|
||||
return (addr >= fcn->addr && addr < (fcn->addr+fcn->size));
|
||||
RAnalBlock *bb;
|
||||
RListIter *iter;
|
||||
bool has_bbs = false;
|
||||
|
||||
r_list_foreach (fcn->bbs, iter, bb) {
|
||||
has_bbs = true;
|
||||
if (addr >= bb->addr && addr < bb->addr + bb->size) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!has_bbs) {
|
||||
// hack to make anal_java work, because it doesn't use
|
||||
// basicblocks.
|
||||
// FIXME: anal_java should create basicblocks
|
||||
return addr >= fcn->addr && addr < fcn->addr + fcn->size;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
R_API int r_anal_fcn_count (RAnal *anal, ut64 from, ut64 to) {
|
||||
int n = 0;
|
||||
RAnalFunction *fcni;
|
||||
RListIter *iter;
|
||||
r_list_foreach (anal->fcns, iter, fcni)
|
||||
if (fcni->addr >= from && fcni->addr < to)
|
||||
r_list_foreach (anal->fcns, iter, fcni) {
|
||||
if (fcni->addr >= from && fcni->addr < to) {
|
||||
return n++;
|
||||
}
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
|
@ -51,7 +51,6 @@ ut64 METHOD_START = 0;
|
||||
// report bad blocks. currently is should be easy to ignore these blocks,
|
||||
// in output for the pdj
|
||||
|
||||
//static int java_print_ssa_fcn (RAnal *anal, char *addr);
|
||||
//static int java_print_ssa_bb (RAnal *anal, char *addr);
|
||||
static int java_reset_counter (RAnal *anal, ut64 addr);
|
||||
static int java_new_method (ut64 addr);
|
||||
@ -457,45 +456,7 @@ static int handle_bb_cf_linear_sweep (RAnal *anal, RAnalState *state) {
|
||||
return result;
|
||||
}
|
||||
|
||||
static int java_print_ssa_fcn (RAnal *anal, const char *addrs) {
|
||||
ut64 addr = addrs ? strtoul (addrs, NULL, 16): 0;
|
||||
RList *fcns = anal->fcns; //, *bb_ssa = NULL;
|
||||
RAnalFunction *fcn = NULL, *found_fcn = NULL;
|
||||
RListIter *iter;
|
||||
//char *ssa_str = NULL;
|
||||
//ut32 ssa_idx = 0;
|
||||
RBinJavaObj *bin_obj = (RBinJavaObj * )get_java_bin_obj(anal);
|
||||
|
||||
|
||||
if (!addrs || (*addrs != '0' && addr == 0)) return 0;
|
||||
|
||||
r_list_foreach (fcns, iter, fcn) {
|
||||
if (fcn->addr == addr ||
|
||||
(fcn->addr < addr && addr < (fcn->addr + fcn->size))) {
|
||||
found_fcn = fcn;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_fcn || !bin_obj) return 0;
|
||||
//ssa_java_init ();
|
||||
//bb_ssa = ssa_java_fcn_emit_ssa_to_sdb (anal, bin_obj, fcn->addr, fcn->bbs);
|
||||
//r_list_foreach (bb_ssa, iter, ssa_str) {
|
||||
// eprintf ("%s\n", ssa_str);
|
||||
// //free (ssa_str);
|
||||
//}
|
||||
//r_list_free (bb_ssa);
|
||||
|
||||
/*r_list_foreach (found_fcn->bbs, iter, bb) {
|
||||
char *ssa_str = ssa_java_emit_ssa_to_sdb (anal, bin_obj, bb);
|
||||
eprintf ("%s\n", ssa_str);
|
||||
free (ssa_str);
|
||||
}*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int analyze_from_code_buffer ( RAnal *anal, RAnalFunction *fcn, ut64 addr, const ut8 *code_buf, ut64 code_length ) {
|
||||
|
||||
char gen_name[1025];
|
||||
RListIter *bb_iter;
|
||||
RAnalBlock *bb;
|
||||
@ -932,7 +893,6 @@ static int java_cmd_ext(RAnal *anal, const char* input) {
|
||||
break;
|
||||
case 's':
|
||||
switch (*(input+1)) {
|
||||
case 'f': return java_print_ssa_fcn (anal, input+2);
|
||||
//case 'e': return java_resolve_cp_idx_b64 (anal, input+2);
|
||||
default: break;
|
||||
}
|
||||
|
@ -1126,7 +1126,7 @@ R_API int r_core_anal_fcn(RCore *core, ut64 at, ut64 from, int reftype, int dept
|
||||
fcn = r_anal_get_fcn_in (core->anal, at, 0);
|
||||
if (fcn) {
|
||||
if (fcn->addr == at) return 0; // already analyzed function
|
||||
if (from >= fcn->addr && (from - fcn->addr) < fcn->size) { // inner function
|
||||
if (r_anal_fcn_is_in_offset (fcn, from)) { // inner function
|
||||
RAnalRef *ref;
|
||||
|
||||
// XXX: use r_anal-xrefs api and sdb
|
||||
|
@ -1050,7 +1050,7 @@ static void handle_setup_pre(RCore *core, RDisasmState *ds, bool tail) {
|
||||
}
|
||||
} else if (f->addr + f->size - ds->analop.size == ds->at) {
|
||||
handle_set_pre (ds, core->cons->vline[RDWN_CORNER]);
|
||||
} else if (ds->at > f->addr && ds->at < f->addr+f->size-1) {
|
||||
} else if (r_anal_fcn_is_in_offset (f, ds->at)) {
|
||||
handle_set_pre (ds, core->cons->vline[LINE_VERT]);
|
||||
}
|
||||
|
||||
@ -2711,7 +2711,7 @@ toro:
|
||||
|
||||
f = r_anal_get_fcn_in (core->anal, ds->at, R_ANAL_FCN_TYPE_NULL);
|
||||
ds->fcn = f;
|
||||
if (f && f->folded && ds->at >= f->addr && ds->at < f->addr+f->size) {
|
||||
if (f && f->folded && r_anal_fcn_is_in_offset (f, ds->at)) {
|
||||
int delta = (ds->at <= f->addr)? (ds->at - f->addr + f->size): 0;
|
||||
if (of != f) {
|
||||
char cmt[32];
|
||||
|
@ -1789,7 +1789,7 @@ static int r_cmd_java_handle_list_code_references (RCore *core, const char *inpu
|
||||
fmt = "addr:0x%"PFMT64x" method_name:\"%s\", op:\"%s\" type:\"%s\" info:\"%s\"\n";
|
||||
|
||||
r_list_foreach (anal->fcns, fcn_iter, fcn) {
|
||||
ut8 do_this_one = func_addr == -1 || (fcn->addr <= func_addr && func_addr <= fcn->addr + fcn->size);
|
||||
ut8 do_this_one = func_addr == -1 || r_anal_fcn_is_in_offset (fcn, func_addr);
|
||||
if (!do_this_one) continue;
|
||||
r_list_foreach (fcn->bbs, bb_iter, bb) {
|
||||
char *operation = NULL, *type = NULL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user