mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-03 20:22:38 +00:00
* Implement r_anal_cond_eval() and r_anal_value_to_ut64() functions
- Code seems to work and basicblock conditionals can be evaluated - Show 'match' result in 'abl' command - Wrong namespace
This commit is contained in:
parent
4812bb5877
commit
123faacd3c
@ -23,10 +23,40 @@ static inline const char *condstring(RAnalCond *cond) {
|
||||
condstr_single [cond->type%sizeof (condstr_single)];
|
||||
}
|
||||
|
||||
R_API int r_anal_cond_eval(RAnalCond *cond) {
|
||||
ut64 arg0 = 0;
|
||||
ut64 arg1 = 0;
|
||||
// TODO: collect register values and return true if matching
|
||||
R_API int r_anal_cond_eval(RAnal *anal, RAnalCond *cond) {
|
||||
ut64 arg0 = r_anal_value_to_ut64 (anal, cond->arg[0]);
|
||||
if (cond->arg[1]) {
|
||||
ut64 arg1 = r_anal_value_to_ut64 (anal, cond->arg[1]);
|
||||
switch (cond->type) {
|
||||
case R_ANAL_COND_EQ:
|
||||
return arg0 == arg1;
|
||||
case R_ANAL_COND_NE:
|
||||
return arg0 != arg1;
|
||||
case R_ANAL_COND_GE:
|
||||
return arg0 >= arg1;
|
||||
case R_ANAL_COND_GT:
|
||||
return arg0 > arg1;
|
||||
case R_ANAL_COND_LE:
|
||||
return arg0 <= arg1;
|
||||
case R_ANAL_COND_LT:
|
||||
return arg0 < arg1;
|
||||
}
|
||||
} else {
|
||||
switch (cond->type) {
|
||||
case R_ANAL_COND_EQ:
|
||||
return !arg0;
|
||||
case R_ANAL_COND_NE:
|
||||
return arg0;
|
||||
case R_ANAL_COND_GT:
|
||||
return arg0>0;
|
||||
case R_ANAL_COND_GE:
|
||||
return arg0>=0;
|
||||
case R_ANAL_COND_LT:
|
||||
return arg0<0;
|
||||
case R_ANAL_COND_LE:
|
||||
return arg0<=0;
|
||||
}
|
||||
}
|
||||
return R_FALSE;
|
||||
}
|
||||
|
||||
|
@ -19,11 +19,25 @@ R_API void r_anal_value_free(RAnalValue *value) {
|
||||
free (value);
|
||||
}
|
||||
|
||||
R_API st64 r_anal_value_eval(RAnalValue *value) {
|
||||
/* OMFG TODO.. this is done by r_num_shit */
|
||||
// r_num_math (anal->num, ...);
|
||||
#warning TODO r_anal_value_eval
|
||||
return 0LL;
|
||||
R_API ut64 r_anal_value_to_ut64(RAnal *anal, RAnalValue *val) {
|
||||
ut64 num;
|
||||
if (val==NULL)
|
||||
return 0LL;
|
||||
num = val->base + (val->delta*(val->mul?val->mul:1));
|
||||
if (val->reg)
|
||||
num += r_reg_get_value (anal->reg, val->reg);
|
||||
if (val->regdelta)
|
||||
num += r_reg_get_value (anal->reg, val->regdelta);
|
||||
switch (val->memref) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 4:
|
||||
case 8:
|
||||
//anal->bio ...
|
||||
eprintf ("TODO: memref for to_ut64 not supported\n");
|
||||
break;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
R_API char *r_anal_value_to_string (RAnalValue *value) {
|
||||
|
@ -1,4 +1,6 @@
|
||||
/* radare - LGPL - Copyright 2009-2010 nibble<.ds@gmail.com> */
|
||||
/* radare - LGPL - Copyright 2009-2010 */
|
||||
/* pancake<nopcode.org> */
|
||||
/* nibble<.ds@gmail.com> */
|
||||
|
||||
#include <r_types.h>
|
||||
#include <r_list.h>
|
||||
@ -216,8 +218,11 @@ R_API int r_core_anal_bb_list(RCore *core, int rad) {
|
||||
r_cons_printf ("unmatch");
|
||||
else r_cons_printf ("new");
|
||||
|
||||
r_cons_printf (" cond=\"%s\"\n", bbi->cond?
|
||||
r_anal_cond_to_string (bbi->cond):"none");
|
||||
if (bbi->cond)
|
||||
r_cons_printf (" cond=\"%s\" match=%d\n",
|
||||
r_anal_cond_to_string (bbi->cond),
|
||||
r_anal_cond_eval (core->anal, bbi->cond));
|
||||
else r_cons_newline();
|
||||
}
|
||||
}
|
||||
r_cons_flush ();
|
||||
|
@ -328,14 +328,14 @@ R_API RAnalValue *r_anal_value_new();
|
||||
R_API RAnalValue *r_anal_value_new_from_string(const char *str);
|
||||
R_API st64 r_anal_value_eval(RAnalValue *value);
|
||||
R_API char *r_anal_value_to_string (RAnalValue *value);
|
||||
R_API ut64 r_anal_value_to_ut64(RAnal *anal, RAnalValue *val);
|
||||
R_API void r_anal_value_free(RAnalValue *value);
|
||||
|
||||
R_API RAnalCond *r_anal_cond_new();
|
||||
R_API RAnalCond *r_anal_cond_new_from_aop(RAnalOp *op);
|
||||
#define r_anal_cond_free(x) free(x);
|
||||
R_API int r_anal_cond_eval(RAnalCond *cond);
|
||||
R_API char *r_anal_cond_to_string(RAnalCond *cond);
|
||||
R_API char *r_anal_value_to_string (RAnalValue *value);
|
||||
R_API int r_anal_cond_eval (RAnal *anal, RAnalCond *cond);
|
||||
R_API RAnalCond *r_anal_cond_new_from_string(const char *str);
|
||||
|
||||
/* reflines.c */
|
||||
|
Loading…
x
Reference in New Issue
Block a user