More a subcommand refactorings

This commit is contained in:
pancake 2024-09-25 18:06:00 +02:00 committed by GitHub
parent 2578ff0ac5
commit f21ec14ed0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -4349,7 +4349,7 @@ static void emulate_block(RCore *core, RVecBlocks *blocks, BlockItem *b0) {
}
} else {
// root node, assume initial regstate
eprintf ("# root node 0x%"PFMT64x"\n", b0->from);
R_LOG_INFO ("# root node 0x%"PFMT64x, b0->from);
char *regstate = r_core_cmd_str (core, "dre");
r_str_trim (regstate);
r_core_cmdf (core, "abe %s @0x%"PFMT64x, regstate, b0->from);
@ -7548,7 +7548,7 @@ static void showmem_json(RList *list, PJ *pj) {
pj_end (pj);
}
static bool cmd_aea(RCore* core, int mode, ut64 addr, int length, const char *esilexpr) {
static bool cmd_aea_stuff(RCore* core, int mode, ut64 addr, int length, const char *esilexpr) {
int ptr, ops, ops_end = 0, len, buf_sz;
ut64 addr_end;
AeaStats stats;
@ -8270,9 +8270,11 @@ static void cmd_aeg(RCore *core, int argc, char *argv[]) {
break;
#endif
case '?': // "aeg?"
default:
r_core_cmd_help (core, help_msg_aeg);
break;
default:
r_core_return_invalid_command (core, "aeg", argv[0][1]);
break;
}
}
@ -8297,45 +8299,25 @@ static void esil_compile(RCore *core, const char *input) {
r_esil_compiler_free (ec);
}
static void cmd_anal_esil(RCore *core, const char *input, bool verbose) {
REsil *esil = core->anal->esil;
static void cmd_aep(RCore *core, const char *input) {
ut64 addr = core->offset;
ut64 adr ;
char *n, *n1;
int off;
ut64 until_addr = UT64_MAX;
const char *until_expr = NULL;
RAnalOp *op = NULL;
switch (input[0]) {
case '!': // "ae!"
esil_compile (core, input + 1);
break;
case 'v': // "aev"
r_core_visual_esil (core, r_str_trim_head_ro (input + 1));
break;
case 'p': // "aep"
switch (input[1]) {
case 'a': // "aepa"
{
ut64 at = core->offset;
if (input[2] == ' ') {
at = r_num_math (core->num, input + 2);
addr = r_num_math (core->num, input + 2);
}
// get flag in current offset
// find a pin named like the flag, skip dots if any
RFlagItem *f = r_flag_get_by_spaces (core->flags, at, R_FLAGS_FS_SYMBOLS, R_FLAGS_FS_IMPORTS, NULL);
RFlagItem *f = r_flag_get_by_spaces (core->flags, addr, R_FLAGS_FS_SYMBOLS, R_FLAGS_FS_IMPORTS, NULL);
if (!f) {
f = r_flag_get_i (core->flags, at);
f = r_flag_get_i (core->flags, addr);
}
if (f) {
const char *last = r_str_rchr (f->name, NULL, '.');
const char *pin_name = last? last + 1: f->name;
const char *havepin = r_anal_pin_get (core->anal, pin_name);
if (havepin) {
r_core_cmdf (core, "aep %s @ 0x%08" PFMT64x, pin_name, at);
}
r_core_cmdf (core, "aep %s @ 0x%08" PFMT64x, pin_name, addr);
}
}
break;
@ -8382,30 +8364,23 @@ static void cmd_anal_esil(RCore *core, const char *input, bool verbose) {
case ' ':
r_anal_pin (core->anal, addr, input + 2);
break;
default:
case '?':
r_core_cmd_help (core, help_msg_aep);
break;
default:
r_core_return_invalid_command (core, "aep", input[1]);
break;
}
break;
case 'r': // "aer"
// 'aer' is an alias for 'ar'
cmd_anal_reg (core, input + 1);
break;
case '*': // "aeq"
// XXX: this is wip, not working atm
r_cons_printf ("trap: %d\n", core->anal->esil->trap);
r_cons_printf ("trap-code: %d\n", core->anal->esil->trap_code);
break;
case ' ':
case 'q': // "aeq"
r_esil_set_pc (esil, core->offset);
r_esil_parse (esil, r_str_trim_head_ro (input + 1));
if (verbose && *input != 'q') {
r_esil_dumpstack (esil);
}
r_esil_stack_free (esil);
break;
case 's': // "aes" "aeso" "aesu" "aesue"
}
static void cmd_aes(RCore *core, const char *input) {
ut64 until_addr = UT64_MAX;
ut64 adr;
int off;
char *n, *n1;
const char *until_expr = NULL;
RAnalOp *op = NULL;
REsil *esil = core->anal->esil;
#if 0
r_core_cmd0 (core, "ae `aoe@r:PC`");
r_core_cmd0 (core, ".ar*");
@ -8539,6 +8514,229 @@ static void cmd_anal_esil(RCore *core, const char *input, bool verbose) {
r_core_cmd0 (core, ".ar*");
break;
}
}
static void cmd_aet(RCore *core, const char *input) {
REsil *esil = core->anal->esil;
switch (input[1]) {
case '?':
r_core_cmd_help_contains (core, help_msg_ae, "aet");
break;
case 's': // "aets"
switch (input[2]) {
case '+': // "aets+"
#if 0
if (!esil) {
R_LOG_ERROR ("ESIL is not initialized. Use `aeim` first");
break;
}
#endif
if (esil->trace) {
R_LOG_INFO ("ESIL trace already started");
break;
}
esil->trace = r_esil_trace_new (esil);
if (!esil->trace) {
break;
}
r_config_set_b (core->config, "dbg.trace", true);
break;
case '-': // "aets-"
if (!esil) {
R_LOG_ERROR ("ESIL is not initialized. Use `aeim` first");
break;
}
if (!esil->trace) {
R_LOG_ERROR ("No ESIL trace started");
break;
}
r_esil_trace_free (esil->trace);
esil->trace = NULL;
r_config_set_b (core->config, "dbg.trace", false);
break;
case '?':
r_core_cmd_help (core, help_msg_aets);
break;
default:
r_core_return_invalid_command (core, "aets", input[2]);
break;
}
break;
case 0: // "aet"
r_esil_trace_list (core->anal->esil, 0);
break;
default:
r_core_return_invalid_command (core, "aet", input[1]);
break;
}
}
// XXX same as aea but with bytes
static void cmd_aeA(RCore *core, const char *input) {
switch (input[1]) {
case '?':
r_core_cmd_help (core, help_msg_aea);
break;
case 'r':
cmd_aea_stuff (core, 1 + (1<<1), core->offset, r_num_math (core->num, input+2), NULL);
break;
case 'w':
cmd_aea_stuff (core, 1 + (1<<2), core->offset, r_num_math (core->num, input+2), NULL);
break;
case 'n':
cmd_aea_stuff (core, 1 + (1<<3), core->offset, r_num_math (core->num, input+2), NULL);
break;
case 'j':
cmd_aea_stuff (core, 1 + (1<<4), core->offset, r_num_math (core->num, input+2), NULL);
break;
case '*':
cmd_aea_stuff (core, 1 + (1<<5), core->offset, r_num_math (core->num, input+2), NULL);
break;
case 'f': {
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, core->offset, -1);
if (fcn) {
cmd_aea_stuff (core, 1, r_anal_function_min_addr (fcn), r_anal_function_linear_size (fcn), NULL);
}
break;
}
case 0:
case ' ':
cmd_aea_stuff (core, 1, core->offset, (int)r_num_math (core->num, input[1]? input + 2:input + 1), NULL);
break;
default:
r_core_return_invalid_command (core, "aeA", input[1]);
break;
}
}
// XXX same as aeA but with nops
static void cmd_aea(RCore *core, const char *input) {
RReg *reg = core->anal->reg;
ut64 pc = r_reg_getv (reg, "PC");
RAnalOp *op = r_core_anal_op (core, pc, 0);
if (!op) {
return;
}
ut64 newPC = core->offset + op->size;
r_reg_setv (reg, "PC", newPC);
switch (input[1]) {
case '?': // "aea?"
r_core_cmd_help (core, help_msg_aea);
break;
case 'e': // "aeae"
cmd_aea_stuff (core, 0, core->offset, -1, r_str_trim_head_ro (input + 2));
break;
case 'r': // "aear"
cmd_aea_stuff (core, 1<<1, core->offset, r_num_math (core->num, input + 2), NULL);
break;
case 'w': // "aeaw"
cmd_aea_stuff (core, 1<<2, core->offset, r_num_math (core->num, input + 2), NULL);
break;
case 'n': // "aean"
cmd_aea_stuff (core, 1<<3, core->offset, r_num_math (core->num, input + 2), NULL);
break;
case 'j': // "aeaj"
cmd_aea_stuff (core, 1<<4, core->offset, r_num_math (core->num, input + 2), NULL);
break;
case '*': // "aea*"
cmd_aea_stuff (core, 1<<5, core->offset, r_num_math (core->num, input + 2), NULL);
break;
case 'B': { // "aeaB"
bool json = input[2] == 'j';
int a = json? 3: 2;
ut64 addr = (input[a] == ' ')? r_num_math (core->num, input + a): core->offset;
RList *l = r_anal_get_blocks_in (core->anal, addr);
RAnalBlock *b;
RListIter *iter;
r_list_foreach (l, iter, b) {
const int mode = json? (1<<4): 1;
cmd_aea_stuff (core, mode, b->addr, b->size, NULL);
break;
}
break;
}
case 'f': { // "aeaf"
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, core->offset, -1);
if (fcn) {
switch (input[2]) {
case 'j': // "aeafj"
cmd_aea_stuff (core, 1<<4, r_anal_function_min_addr (fcn), r_anal_function_linear_size (fcn), NULL);
break;
default:
cmd_aea_stuff (core, 1, r_anal_function_min_addr (fcn), r_anal_function_linear_size (fcn), NULL);
break;
}
break;
}
}
break;
case 'b': { // "aeab"
RAnalBlock *bb = r_anal_bb_from_offset (core->anal, core->offset);
if (bb) {
switch (input[2]) {
case 'j': // "aeabj"
cmd_aea_stuff (core, 1 | (1<<4), bb->addr, bb->size, NULL);
break;
default:
cmd_aea_stuff (core, 1, bb->addr, bb->size, NULL);
break;
}
}
}
break;
case 0:
case ' ':
{
const char *arg = input[1]? input + 2: "";
ut64 len = r_num_math (core->num, arg);
cmd_aea_stuff (core, 0, core->offset, len, NULL);
}
break;
default:
r_core_return_invalid_command (core, "aea", input[1]);
break;
}
r_reg_setv (reg, "PC", pc);
}
static void cmd_anal_esil(RCore *core, const char *input, bool verbose) {
REsil *esil = core->anal->esil;
ut64 addr = core->offset;
ut64 until_addr = UT64_MAX;
const char *until_expr = NULL;
RAnalOp *op = NULL;
switch (input[0]) {
case '!': // "ae!"
esil_compile (core, input + 1);
break;
case 'v': // "aev"
r_core_visual_esil (core, r_str_trim_head_ro (input + 1));
break;
case 'p': // "aep"
cmd_aep (core, input);
break;
case 'r': // "aer"
// 'aer' is an alias for 'ar'
cmd_anal_reg (core, input + 1);
break;
case '*': // "aeq"
// XXX: this is wip, not working atm
r_cons_printf ("trap: %d\n", core->anal->esil->trap);
r_cons_printf ("trap-code: %d\n", core->anal->esil->trap_code);
break;
case ' ':
case 'q': // "aeq"
r_esil_set_pc (esil, core->offset);
r_esil_parse (esil, r_str_trim_head_ro (input + 1));
if (verbose && *input != 'q') {
r_esil_dumpstack (esil);
}
r_esil_stack_free (esil);
break;
case 's': // "aes" "aeso" "aesu" "aesue"
cmd_aes (core, input);
break;
case 'C': // "aeC"
if (input[1] == '?') { // "aec?"
@ -8763,7 +8961,6 @@ static void cmd_anal_esil(RCore *core, const char *input, bool verbose) {
} else {
R_LOG_ERROR ("No function in this address");
}
// ab~ninstr[1]
}
break;
case 'f': // "aef"
@ -8774,170 +8971,14 @@ static void cmd_anal_esil(RCore *core, const char *input, bool verbose) {
__anal_esil_function (core, core->offset);
} break;
case 't': // "aet"
switch (input[1]) {
case '?':
r_core_cmd_help_contains (core, help_msg_ae, "aet");
break;
case 's': // "aets"
switch (input[2]) {
case '+': // "aets+"
#if 0
if (!esil) {
R_LOG_ERROR ("ESIL is not initialized. Use `aeim` first");
break;
}
#endif
if (esil->trace) {
R_LOG_INFO ("ESIL trace already started");
break;
}
esil->trace = r_esil_trace_new (esil);
if (!esil->trace) {
break;
}
r_config_set_b (core->config, "dbg.trace", true);
break;
case '-': // "aets-"
if (!esil) {
R_LOG_ERROR ("ESIL is not initialized. Use `aeim` first");
break;
}
if (!esil->trace) {
R_LOG_ERROR ("No ESIL trace started");
break;
}
r_esil_trace_free (esil->trace);
esil->trace = NULL;
r_config_set_b (core->config, "dbg.trace", false);
break;
default:
r_core_cmd_help (core, help_msg_aets);
break;
}
break;
case 0: // "aet"
r_esil_trace_list (core->anal->esil, 0);
break;
default:
R_LOG_ERROR ("Unknown command");
break;
}
cmd_aet (core, input);
break;
case 'A': // "aeA"
switch (input[1]) {
case '?':
r_core_cmd_help (core, help_msg_aea);
cmd_aeA (core, input);
break;
case 'r':
cmd_aea (core, 1 + (1<<1), core->offset, r_num_math (core->num, input+2), NULL);
case 'a': // "aea"
cmd_aea (core, input);
break;
case 'w':
cmd_aea (core, 1 + (1<<2), core->offset, r_num_math (core->num, input+2), NULL);
break;
case 'n':
cmd_aea (core, 1 + (1<<3), core->offset, r_num_math (core->num, input+2), NULL);
break;
case 'j':
cmd_aea (core, 1 + (1<<4), core->offset, r_num_math (core->num, input+2), NULL);
break;
case '*':
cmd_aea (core, 1 + (1<<5), core->offset, r_num_math (core->num, input+2), NULL);
break;
case 'f': {
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, core->offset, -1);
if (fcn) {
cmd_aea (core, 1, r_anal_function_min_addr (fcn), r_anal_function_linear_size (fcn), NULL);
}
break;
}
default:
cmd_aea (core, 1, core->offset, (int)r_num_math (core->num, input[1]? input + 2:input + 1), NULL);
}
break;
case 'a': { // "aea"
RReg *reg = core->anal->reg;
ut64 pc = r_reg_getv (reg, "PC");
RAnalOp *op = r_core_anal_op (core, pc, 0);
if (!op) {
break;
}
ut64 newPC = core->offset + op->size;
r_reg_setv (reg, "PC", newPC);
switch (input[1]) {
case '?': // "aea?"
r_core_cmd_help (core, help_msg_aea);
break;
case 'e': // "aeae"
cmd_aea (core, 0, core->offset, -1, r_str_trim_head_ro (input + 2));
break;
case 'r': // "aear"
cmd_aea (core, 1<<1, core->offset, r_num_math (core->num, input + 2), NULL);
break;
case 'w': // "aeaw"
cmd_aea (core, 1<<2, core->offset, r_num_math (core->num, input + 2), NULL);
break;
case 'n': // "aean"
cmd_aea (core, 1<<3, core->offset, r_num_math (core->num, input + 2), NULL);
break;
case 'j': // "aeaj"
cmd_aea (core, 1<<4, core->offset, r_num_math (core->num, input + 2), NULL);
break;
case '*': // "aea*"
cmd_aea (core, 1<<5, core->offset, r_num_math (core->num, input + 2), NULL);
break;
case 'B': { // "aeaB"
bool json = input[2] == 'j';
int a = json? 3: 2;
ut64 addr = (input[a] == ' ')? r_num_math (core->num, input + a): core->offset;
RList *l = r_anal_get_blocks_in (core->anal, addr);
RAnalBlock *b;
RListIter *iter;
r_list_foreach (l, iter, b) {
int mode = json? (1<<4): 1;
cmd_aea (core, mode, b->addr, b->size, NULL);
break;
}
break;
}
case 'f': { // "aeaf"
RAnalFunction *fcn = r_anal_get_fcn_in (core->anal, core->offset, -1);
if (fcn) {
switch (input[2]) {
case 'j': // "aeafj"
cmd_aea (core, 1<<4, r_anal_function_min_addr (fcn), r_anal_function_linear_size (fcn), NULL);
break;
default:
cmd_aea (core, 1, r_anal_function_min_addr (fcn), r_anal_function_linear_size (fcn), NULL);
break;
}
break;
}
}
break;
case 'b': { // "aeab"
RAnalBlock *bb = r_anal_bb_from_offset (core->anal, core->offset);
if (bb) {
switch (input[2]) {
case 'j': // "aeabj"
cmd_aea (core, 1 | (1<<4), bb->addr, bb->size, NULL);
break;
default:
cmd_aea (core, 1, bb->addr, bb->size, NULL);
break;
}
}
}
break;
default: {
const char *arg = input[1]? input + 2: "";
ut64 len = r_num_math (core->num, arg);
cmd_aea (core, 0, core->offset, len, NULL);
}
break;
}
r_reg_setv (reg, "PC", pc);
break;
}
case 'x':
if (input[1] == ' ') { // "aex"
char *hex;
@ -14150,16 +14191,26 @@ static int cmd_anal_all(RCore *core, const char *input) {
}
break;
case 'r': // "aar"
if (input[1] == '?') {
r_core_cmd_help (core, help_msg_aar);
} else if (input[1] == 'r') { // "aarr"
anal_aarr (core);
} else {
switch (input[1]) {
case 0:
case ' ':
case '*':
case 'j':
(void)r_core_anal_refs (core, input + 1);
break;
case 'r':
anal_aarr (core);
break;
case '?':
r_core_cmd_help (core, help_msg_aar);
break;
default:
r_core_return_invalid_command (core, "aar", input[1]);
break;
}
break;
default:
r_core_cmd_help (core, help_msg_aa);
r_core_return_invalid_command (core, "aa", input[0]);
break;
}
@ -15251,9 +15302,15 @@ static int cmd_anal(void *data, const char *input) {
case 'C': // "aC"
cmd_anal_aC (core, input + 1);
break;
case 'i': cmd_anal_info (core, input + 1); break; // "ai"
case 'r': cmd_anal_reg (core, input + 1); break; // "ar"
case 'e': cmd_anal_esil (core, input + 1, true); break; // "ae"
case 'i': // "ai"
cmd_anal_info (core, input + 1);
break;
case 'r': // "ar"
cmd_anal_reg (core, input + 1);
break;
case 'e': // "ae"
cmd_anal_esil (core, input + 1, true);
break;
case 'L':
switch (input[1]) {
case 'j':