Skip to content

Commit 019e87c

Browse files
committed
WIP: Move ds_sub_jumps from core to asm.parse ##asm
1 parent a9d3f60 commit 019e87c

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
@@ -6218,42 +6218,6 @@ static char *_find_next_number(char *op) {
62186218
return NULL;
62196219
}
62206220

6221-
#if 0
6222-
static bool set_jump_realname(RDisasmState *ds, ut64 addr, const char **kw, const char **name) {
6223-
return true;
6224-
RFlag *f = ds->core->flags;
6225-
if (!f) {
6226-
return false;
6227-
}
6228-
if (!ds->asm_demangle && !f->realnames) {
6229-
// nothing to do, neither demangled nor regular realnames should be shown
6230-
return false;
6231-
}
6232-
RFlagItem *flag_sym = r_flag_get_by_spaces (f, true, addr, R_FLAGS_FS_SYMBOLS, NULL);
6233-
if (!flag_sym || !flag_sym->realname) {
6234-
// nothing to replace
6235-
return false;
6236-
}
6237-
if (!flag_sym->demangled && !f->realnames) {
6238-
// realname is not demangled and we don't want to show non-demangled realnames
6239-
return false;
6240-
}
6241-
*name = flag_sym->realname;
6242-
RFlagItem *flag_mthd = r_flag_get_by_spaces (f, false, addr, R_FLAGS_FS_CLASSES, NULL);
6243-
if (!f->realnames) {
6244-
#if 1
6245-
// for asm.flags.real, we don't want these prefixes
6246-
if (flag_mthd && flag_mthd->name && r_str_startswith (flag_mthd->name, "method.")) {
6247-
*kw = "method,";
6248-
} else {
6249-
*kw = "sym,";
6250-
}
6251-
#endif
6252-
}
6253-
return true;
6254-
}
6255-
#endif
6256-
62576221
// R2_600 - TODO: this should be moved into r_parse
62586222
static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
62596223
RAnal *anal = ds->core->anal;
@@ -6266,7 +6230,6 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
62666230
return NULL;
62676231
}
62686232
ut64 addr = ds->analop.jump;
6269-
#if 1
62706233
int optype = ds->analop.type & R_ANAL_OP_TYPE_MASK;
62716234
switch (optype) {
62726235
case R_ANAL_OP_TYPE_LEA:
@@ -6292,11 +6255,9 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
62926255
case R_ANAL_OP_TYPE_UJMP:
62936256
case R_ANAL_OP_TYPE_UCALL:
62946257
break;
6295-
// return NULL;
62966258
default:
62976259
return NULL;
62986260
}
6299-
#endif
63006261
RBinReloc *rel = NULL;
63016262
RBinObject *bo = r_bin_cur_object (ds->core->bin);
63026263
if (bo && !bo->is_reloc_patched) {
@@ -6323,9 +6284,7 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
63236284
}
63246285
RAnalFunction *fcn = r_anal_get_function_at (anal, addr);
63256286
if (fcn) {
6326-
// if (!set_jump_realname (ds, addr, &kw, &name)) {
6327-
name = fcn->name;
6328-
// }
6287+
name = fcn->name;
63296288
} else {
63306289
if (rel) {
63316290
if (rel && rel->import && rel->import->name) {
@@ -6345,20 +6304,17 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
63456304
}
63466305
}
63476306
} else {
6348-
6349-
// if (!set_jump_realname (ds, addr, &kw, &name)) {
6350-
RFlagItem *flag = r_core_flag_get_by_spaces (f, false, addr);
6351-
if (flag) {
6352-
// R2R db/anal/jmptbl
6353-
// adrp x0, segment.DATA //instead-of// adrp x0, section.20.__DATA.__objc_const
6354-
if (!r_str_startswith (flag->name, "section")) {
6355-
name = flag->name;
6356-
if (f->realnames && flag->realname) {
6357-
name = flag->realname;
6358-
}
6307+
RFlagItem *flag = r_core_flag_get_by_spaces (f, false, addr);
6308+
if (flag) {
6309+
// R2R db/anal/jmptbl
6310+
// adrp x0, segment.DATA //instead-of// adrp x0, section.20.__DATA.__objc_const
6311+
if (!r_str_startswith (flag->name, "section")) {
6312+
name = flag->name;
6313+
if (f->realnames && flag->realname) {
6314+
name = flag->realname;
63596315
}
63606316
}
6361-
// }
6317+
}
63626318
}
63636319
}
63646320
if (name) {

libr/include/r_asm.h

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

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

0 commit comments

Comments
 (0)