Skip to content

Commit 1c9da97

Browse files
committed
WIP: Move ds_sub_jumps from core to asm.parse ##asm
1 parent f7d9fef commit 1c9da97

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

libr/core/disasm.c

Lines changed: 10 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -6131,42 +6131,6 @@ static char *_find_next_number(char *op) {
61316131
return NULL;
61326132
}
61336133

6134-
#if 0
6135-
static bool set_jump_realname(RDisasmState *ds, ut64 addr, const char **kw, const char **name) {
6136-
return true;
6137-
RFlag *f = ds->core->flags;
6138-
if (!f) {
6139-
return false;
6140-
}
6141-
if (!ds->asm_demangle && !f->realnames) {
6142-
// nothing to do, neither demangled nor regular realnames should be shown
6143-
return false;
6144-
}
6145-
RFlagItem *flag_sym = r_flag_get_by_spaces (f, true, addr, R_FLAGS_FS_SYMBOLS, NULL);
6146-
if (!flag_sym || !flag_sym->realname) {
6147-
// nothing to replace
6148-
return false;
6149-
}
6150-
if (!flag_sym->demangled && !f->realnames) {
6151-
// realname is not demangled and we don't want to show non-demangled realnames
6152-
return false;
6153-
}
6154-
*name = flag_sym->realname;
6155-
RFlagItem *flag_mthd = r_flag_get_by_spaces (f, false, addr, R_FLAGS_FS_CLASSES, NULL);
6156-
if (!f->realnames) {
6157-
#if 1
6158-
// for asm.flags.real, we don't want these prefixes
6159-
if (flag_mthd && flag_mthd->name && r_str_startswith (flag_mthd->name, "method.")) {
6160-
*kw = "method,";
6161-
} else {
6162-
*kw = "sym,";
6163-
}
6164-
#endif
6165-
}
6166-
return true;
6167-
}
6168-
#endif
6169-
61706134
// R2_600 - TODO: this should be moved into r_parse
61716135
static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
61726136
RAnal *anal = ds->core->anal;
@@ -6179,7 +6143,6 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
61796143
return NULL;
61806144
}
61816145
ut64 addr = ds->analop.jump;
6182-
#if 1
61836146
int optype = ds->analop.type & R_ANAL_OP_TYPE_MASK;
61846147
switch (optype) {
61856148
case R_ANAL_OP_TYPE_LEA:
@@ -6205,11 +6168,9 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
62056168
case R_ANAL_OP_TYPE_UJMP:
62066169
case R_ANAL_OP_TYPE_UCALL:
62076170
break;
6208-
// return NULL;
62096171
default:
62106172
return NULL;
62116173
}
6212-
#endif
62136174
RBinReloc *rel = NULL;
62146175
RBinObject *bo = r_bin_cur_object (ds->core->bin);
62156176
if (bo && !bo->is_reloc_patched) {
@@ -6236,9 +6197,7 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
62366197
}
62376198
RAnalFunction *fcn = r_anal_get_function_at (anal, addr);
62386199
if (fcn) {
6239-
// if (!set_jump_realname (ds, addr, &kw, &name)) {
6240-
name = fcn->name;
6241-
// }
6200+
name = fcn->name;
62426201
} else {
62436202
if (rel) {
62446203
if (rel && rel->import && rel->import->name) {
@@ -6258,20 +6217,17 @@ static char *ds_sub_jumps(RDisasmState *ds, const char *str) {
62586217
}
62596218
}
62606219
} else {
6261-
6262-
// if (!set_jump_realname (ds, addr, &kw, &name)) {
6263-
RFlagItem *flag = r_core_flag_get_by_spaces (f, false, addr);
6264-
if (flag) {
6265-
// R2R db/anal/jmptbl
6266-
// adrp x0, segment.DATA //instead-of// adrp x0, section.20.__DATA.__objc_const
6267-
if (!r_str_startswith (flag->name, "section")) {
6268-
name = flag->name;
6269-
if (f->realnames && flag->realname) {
6270-
name = flag->realname;
6271-
}
6220+
RFlagItem *flag = r_core_flag_get_by_spaces (f, false, addr);
6221+
if (flag) {
6222+
// R2R db/anal/jmptbl
6223+
// adrp x0, segment.DATA //instead-of// adrp x0, section.20.__DATA.__objc_const
6224+
if (!r_str_startswith (flag->name, "section")) {
6225+
name = flag->name;
6226+
if (f->realnames && flag->realname) {
6227+
name = flag->realname;
62726228
}
62736229
}
6274-
// }
6230+
}
62756231
}
62766232
}
62776233
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)