Skip to content

Commit 7dc6108

Browse files
committed
WIP: Move ds_sub_jumps from core to asm.parse ##asm
1 parent 4145057 commit 7dc6108

File tree

3 files changed

+150
-55
lines changed

3 files changed

+150
-55
lines changed

libr/asm/parse.c

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,142 @@ R_API char *r_asm_parse_patch(RAsm *a, RAnalOp *aop, const char *op) {
7979
}
8080
return NULL;
8181
}
82+
83+
// TODO: R2_600 - finish reimplementing libr/core/disasm.c: ds_sub_jumps
84+
R_API char *r_asm_parse_subjmp(RAsm *a, RAnalOp *aop, const char *op) {
85+
R_RETURN_VAL_IF_FAIL (a, false);
86+
const char* arch = R_UNWRAP3 (a, config, arch);
87+
const bool x86 = arch && r_str_startswith (arch, "x86");
88+
const char *name = NULL;
89+
const char *kw = "";
90+
ut64 addr = aop->jump;
91+
int optype = aop->type & R_ANAL_OP_TYPE_MASK;
92+
switch (optype) {
93+
case R_ANAL_OP_TYPE_LEA:
94+
if (x86) {
95+
// let the pseudo plugin trim the '[]'
96+
return NULL;
97+
}
98+
// for ARM adrp, section is better than adrp, segment
99+
break;
100+
case R_ANAL_OP_TYPE_JMP:
101+
case R_ANAL_OP_TYPE_CJMP:
102+
case R_ANAL_OP_TYPE_MOV:
103+
case R_ANAL_OP_TYPE_MJMP:
104+
break;
105+
case R_ANAL_OP_TYPE_PUSH:
106+
addr = aop->val;
107+
if (addr < 10) {
108+
// ignore push 0
109+
return NULL;
110+
}
111+
break;
112+
case R_ANAL_OP_TYPE_CALL:
113+
case R_ANAL_OP_TYPE_UJMP:
114+
case R_ANAL_OP_TYPE_UCALL:
115+
break;
116+
default:
117+
return NULL;
118+
}
119+
#if 0
120+
RFlag *f = ds->core->flags;
121+
RAnal *anal = ds->core->anal;
122+
RBinReloc *rel = NULL;
123+
RBinObject *bo = r_bin_cur_object (ds->core->bin);
124+
if (bo && !bo->is_reloc_patched) {
125+
rel = r_core_getreloc (ds->core, ds->analop.addr, ds->analop.size);
126+
}
127+
if (!rel) {
128+
rel = r_core_getreloc (ds->core, addr, ds->analop.size);
129+
if (!rel) {
130+
// some jmp 0 are actually relocs, so we can just ignore it
131+
if (!addr || addr == UT64_MAX) {
132+
rel = r_core_getreloc (ds->core, ds->analop.ptr, ds->analop.size);
133+
if (rel) {
134+
addr = ds->analop.ptr;
135+
}
136+
}
137+
}
138+
}
139+
if (addr == UT64_MAX) {
140+
if (rel) {
141+
addr = 0;
142+
} else {
143+
addr = ds->analop.ptr;
144+
}
145+
}
146+
RAnalFunction *fcn = r_anal_get_function_at (anal, addr);
147+
if (fcn) {
148+
name = fcn->name;
149+
} else {
150+
if (rel) {
151+
if (rel && rel->import && rel->import->name) {
152+
name = r_bin_name_tostring (rel->import->name);
153+
} else if (rel && rel->symbol && rel->symbol->name) {
154+
name = r_bin_name_tostring (rel->symbol->name);
155+
}
156+
if (addr) { // && *name == '.') {
157+
RFlagItem *flag = r_core_flag_get_by_spaces (f, false, addr);
158+
if (flag) {
159+
if (!r_str_startswith (flag->name, "section")) {
160+
name = flag->name;
161+
if (f->realnames && flag->realname) {
162+
name = flag->realname;
163+
}
164+
}
165+
}
166+
}
167+
} else {
168+
RFlagItem *flag = r_core_flag_get_by_spaces (f, false, addr);
169+
if (flag) {
170+
// R2R db/anal/jmptbl
171+
// adrp x0, segment.DATA //instead-of// adrp x0, section.20.__DATA.__objc_const
172+
if (!r_str_startswith (flag->name, "section")) {
173+
name = flag->name;
174+
if (f->realnames && flag->realname) {
175+
name = flag->realname;
176+
}
177+
}
178+
}
179+
}
180+
}
181+
if (name) {
182+
char *nptr;
183+
ut64 numval;
184+
char *hstr = strdup (str);
185+
char *ptr = hstr;
186+
const int bits = ds->core->rasm->config->bits;
187+
const int seggrn = ds->core->rasm->config->seggrn;
188+
while ((nptr = _find_next_number (ptr))) {
189+
ptr = nptr;
190+
char* colon = strchr (ptr, ':');
191+
if (x86 && bits == 16 && colon) {
192+
*colon = '\0';
193+
ut64 seg = r_num_get (NULL, ptr);
194+
ut64 off = r_num_get (NULL, colon + 1);
195+
*colon = ':';
196+
numval = (seg << seggrn) + off;
197+
} else {
198+
numval = r_num_get (NULL, ptr);
199+
}
200+
if (numval == addr) {
201+
while ((*nptr && !IS_SEPARATOR (*nptr) && *nptr != 0x1b) || (x86 && bits == 16 && colon && *nptr == ':')) {
202+
nptr++;
203+
}
204+
char *kwname = r_str_newf ("%s%s", kw, name);
205+
if (kwname) {
206+
char* numstr = r_str_ndup (ptr, nptr - ptr);
207+
if (numstr) {
208+
hstr = r_str_replace (hstr, numstr, kwname, 0);
209+
free (numstr);
210+
}
211+
free (kwname);
212+
}
213+
break;
214+
}
215+
}
216+
return hstr;
217+
}
218+
#endif
219+
return NULL;
220+
}

libr/core/disasm.c

Lines changed: 10 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -6250,42 +6250,6 @@ static char *_find_next_number(char *op) {
62506250
return NULL;
62516251
}
62526252

6253-
#if 0
6254-
static bool set_jump_realname(RDisasmState *ds, ut64 addr, const char **kw, const char **name) {
6255-
return true;
6256-
RFlag *f = ds->core->flags;
6257-
if (!f) {
6258-
return false;
6259-
}
6260-
if (!ds->asm_demangle && !f->realnames) {
6261-
// nothing to do, neither demangled nor regular realnames should be shown
6262-
return false;
6263-
}
6264-
RFlagItem *flag_sym = r_flag_get_by_spaces (f, true, addr, R_FLAGS_FS_SYMBOLS, NULL);
6265-
if (!flag_sym || !flag_sym->realname) {
6266-
// nothing to replace
6267-
return false;
6268-
}
6269-
if (!flag_sym->demangled && !f->realnames) {
6270-
// realname is not demangled and we don't want to show non-demangled realnames
6271-
return false;
6272-
}
6273-
*name = flag_sym->realname;
6274-
RFlagItem *flag_mthd = r_flag_get_by_spaces (f, false, addr, R_FLAGS_FS_CLASSES, NULL);
6275-
if (!f->realnames) {
6276-
#if 1
6277-
// for asm.flags.real, we don't want these prefixes
6278-
if (flag_mthd && flag_mthd->name && r_str_startswith (flag_mthd->name, "method.")) {
6279-
*kw = "method,";
6280-
} else {
6281-
*kw = "sym,";
6282-
}
6283-
#endif
6284-
}
6285-
return true;
6286-
}
6287-
#endif
6288-
62896253
// R2_600 - TODO: this should be moved into r_parse
62906254
static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
62916255
RAnal *anal = ds->core->anal;
@@ -6298,7 +6262,6 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
62986262
return NULL;
62996263
}
63006264
ut64 addr = ds->analop.jump;
6301-
#if 1
63026265
int optype = ds->analop.type & R_ANAL_OP_TYPE_MASK;
63036266
switch (optype) {
63046267
case R_ANAL_OP_TYPE_LEA:
@@ -6324,11 +6287,9 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
63246287
case R_ANAL_OP_TYPE_UJMP:
63256288
case R_ANAL_OP_TYPE_UCALL:
63266289
break;
6327-
// return NULL;
63286290
default:
63296291
return NULL;
63306292
}
6331-
#endif
63326293
RBinReloc *rel = NULL;
63336294
RBinObject *bo = r_bin_cur_object (ds->core->bin);
63346295
if (bo && !bo->is_reloc_patched) {
@@ -6355,9 +6316,7 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
63556316
}
63566317
RAnalFunction *fcn = r_anal_get_function_at (anal, addr);
63576318
if (fcn) {
6358-
// if (!set_jump_realname (ds, addr, &kw, &name)) {
6359-
name = fcn->name;
6360-
// }
6319+
name = fcn->name;
63616320
} else {
63626321
if (rel) {
63636322
if (rel && rel->import && rel->import->name) {
@@ -6377,20 +6336,17 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
63776336
}
63786337
}
63796338
} else {
6380-
6381-
// if (!set_jump_realname (ds, addr, &kw, &name)) {
6382-
RFlagItem *flag = r_core_flag_get_by_spaces (f, false, addr);
6383-
if (flag) {
6384-
// R2R db/anal/jmptbl
6385-
// adrp x0, segment.DATA //instead-of// adrp x0, section.20.__DATA.__objc_const
6386-
if (!r_str_startswith (flag->name, "section")) {
6387-
name = flag->name;
6388-
if (f->realnames && flag->realname) {
6389-
name = flag->realname;
6390-
}
6339+
RFlagItem *flag = r_core_flag_get_by_spaces (f, false, addr);
6340+
if (flag) {
6341+
// R2R db/anal/jmptbl
6342+
// adrp x0, segment.DATA //instead-of// adrp x0, section.20.__DATA.__objc_const
6343+
if (!r_str_startswith (flag->name, "section")) {
6344+
name = flag->name;
6345+
if (f->realnames && flag->realname) {
6346+
name = flag->realname;
63916347
}
63926348
}
6393-
// }
6349+
}
63946350
}
63956351
}
63966352
if (name) {

libr/include/r_asm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ R_API char *r_asm_parse_filter(RAsm *a, ut64 addr, RFlag *f, RAnalHint *hint, co
114114
R_API char *r_asm_parse_subvar(RAsm *a, RAnalFunction *f, ut64 addr, int oplen, const char *data);
115115
R_API char *r_asm_parse_immtrim(RAsm *a, const char *opstr);
116116
R_API char *r_asm_parse_patch(RAsm *a, RAnalOp *aop, const char *newop);
117-
117+
R_API char *r_asm_parse_subjmp(RAsm *a, RAnalOp *aop, const char *op);
118118

119119
/* asm.c */
120120
R_API RAsm *r_asm_new(void);

0 commit comments

Comments
 (0)