mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-25 16:51:30 +00:00
* Add r_core_asm_bwdisassemble for backward disassemble resolution
* Add example using bwdisassemble in swig/vapi/t/bwdisassemble.vala * Add field len to RCoreAsmHit * Update vapi's * Fix memory leak in r_core_asm_strsearch() * Fix several vala examples * Fix r_list_iterator warning in vala
This commit is contained in:
parent
b21584e06c
commit
124aa07a96
6
TODO
6
TODO
@ -29,9 +29,9 @@ TODO nibble
|
||||
-----------
|
||||
* r_anal
|
||||
- use r_anal_value everywhere
|
||||
* x86im
|
||||
- make x86_x86im the default backend for x86 analysis
|
||||
- implement analysis for more instructions
|
||||
- x86im
|
||||
- make x86_x86im the default backend for x86 analysis
|
||||
- implement analysis for more instructions
|
||||
* r_bin
|
||||
- Better way to fix got_offset issue?
|
||||
* diff code analysis
|
||||
|
@ -13,7 +13,6 @@
|
||||
static int disassemble(struct r_asm_t *a, struct r_asm_aop_t *aop, ut8 *buf, ut64 len) {
|
||||
t_disasm disasm_obj;
|
||||
|
||||
//lowercase=1;
|
||||
aop->inst_len = Disasm_olly(buf, len, a->pc, &disasm_obj, DISASM_FILE);
|
||||
snprintf(aop->buf_asm, R_ASM_BUFSIZE, "%s", disasm_obj.result);
|
||||
|
||||
|
@ -9,6 +9,7 @@ R_API RCoreAsmHit *r_core_asm_hit_new() {
|
||||
RCoreAsmHit *hit = R_NEW (RCoreAsmHit);
|
||||
if (hit) {
|
||||
hit->code = NULL;
|
||||
hit->len = 0;
|
||||
hit->addr = -1;
|
||||
}
|
||||
return hit;
|
||||
@ -51,10 +52,22 @@ R_API RList *r_core_asm_strsearch(RCore *core, const char *input, ut64 from, ut6
|
||||
int idx, tidx, ret, len;
|
||||
int tokcount, matchcount;
|
||||
|
||||
if (!(ptr = strdup (input)))
|
||||
if (core->blocksize<=OPSZ) {
|
||||
eprintf ("error: block size too small\n");
|
||||
return NULL;
|
||||
if (!(hits = r_core_asm_hit_list_new ()))
|
||||
}
|
||||
if (!(buf = (ut8 *)malloc (core->blocksize))){
|
||||
return NULL;
|
||||
}
|
||||
if (!(ptr = strdup (input))) {
|
||||
free (buf);
|
||||
return NULL;
|
||||
}
|
||||
if (!(hits = r_core_asm_hit_list_new ())) {
|
||||
free (buf);
|
||||
free (ptr);
|
||||
return NULL;
|
||||
}
|
||||
for (tokcount=0;;tokcount++) {
|
||||
if (tokcount==0) tok = (char*)strtok (ptr, ";");
|
||||
else tok = (char*)strtok (NULL, ";");
|
||||
@ -62,11 +75,6 @@ R_API RList *r_core_asm_strsearch(RCore *core, const char *input, ut64 from, ut6
|
||||
break;
|
||||
tokens[tokcount] = r_str_trim_head_tail (tok);
|
||||
}
|
||||
if (core->blocksize<=OPSZ) {
|
||||
eprintf ("error: block size too small\n");
|
||||
return R_FALSE;
|
||||
}
|
||||
buf = (ut8 *)malloc (core->blocksize);
|
||||
for (at = from, matchcount = 0; at < to; at += core->blocksize-OPSZ) {
|
||||
if (r_cons_singleton ()->breaked)
|
||||
break;
|
||||
@ -90,9 +98,13 @@ R_API RList *r_core_asm_strsearch(RCore *core, const char *input, ut64 from, ut6
|
||||
tidx = idx;
|
||||
if (!(hit = r_core_asm_hit_new ())) {
|
||||
r_list_destroy (hits);
|
||||
free (buf);
|
||||
free (ptr);
|
||||
free (code);
|
||||
return NULL;
|
||||
}
|
||||
hit->addr = at+tidx;
|
||||
hit->len = idx+len-tidx;
|
||||
hit->code = strdup (code);
|
||||
r_list_append (hits, hit);
|
||||
R_FREE (code);
|
||||
@ -121,3 +133,57 @@ R_API RList *r_core_asm_strsearch(RCore *core, const char *input, ut64 from, ut6
|
||||
free (code);
|
||||
return hits;
|
||||
}
|
||||
|
||||
R_API RList *r_core_asm_bwdisassemble (RCore *core, ut64 addr, int n, int len) {
|
||||
RCoreAsmHit *hit;
|
||||
RAsmAop aop;
|
||||
RList *hits = NULL;
|
||||
ut8 *buf;
|
||||
ut64 at;
|
||||
int instrlen, ni, idx;
|
||||
|
||||
if (!(hits = r_core_asm_hit_list_new ()))
|
||||
return NULL;
|
||||
buf = (ut8 *)malloc (len);
|
||||
if (!buf) {
|
||||
r_list_destroy (hits);
|
||||
return NULL;
|
||||
}
|
||||
if (r_io_read_at (core->io, addr-len, buf, len) != len) {
|
||||
r_list_destroy (hits);
|
||||
free (buf);
|
||||
return NULL;
|
||||
}
|
||||
for (idx = 1; idx < len; idx++) {
|
||||
if (r_cons_singleton ()->breaked)
|
||||
break;
|
||||
at = addr - idx; ni = 1;
|
||||
while (at < addr) {
|
||||
r_asm_set_pc (core->assembler, at);
|
||||
//XXX HACK We need another way to detect invalid disasm!!
|
||||
if (!(instrlen = r_asm_disassemble (core->assembler, &aop, buf+(len-(addr-at)), addr-at)) || strstr (aop.buf_asm, "invalid")) {
|
||||
break;
|
||||
} else {
|
||||
at += instrlen;
|
||||
if (at == addr) {
|
||||
if (ni == n) {
|
||||
if (!(hit = r_core_asm_hit_new ())) {
|
||||
r_list_destroy (hits);
|
||||
free (buf);
|
||||
return NULL;
|
||||
}
|
||||
hit->addr = addr-idx;
|
||||
hit->len = idx;
|
||||
hit->code = NULL;
|
||||
r_list_append (hits, hit);
|
||||
}
|
||||
} else {
|
||||
ni++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
r_asm_set_pc (core->assembler, addr);
|
||||
free (buf);
|
||||
return hits;
|
||||
}
|
||||
|
@ -2641,7 +2641,8 @@ static int cmd_search(void *data, const char *input) {
|
||||
int count = 0;
|
||||
if ((hits = r_core_asm_strsearch (core, input+2, from, to))) {
|
||||
r_list_foreach (hits, iter, hit) {
|
||||
r_cons_printf ("f hit0_%i @ 0x%08"PFMT64x" # %s\n", count, hit->addr, hit->code);
|
||||
r_cons_printf ("f hit0_%i @ 0x%08"PFMT64x" # %s (%i)\n",
|
||||
count, hit->addr, hit->code, hit->len);
|
||||
count++;
|
||||
}
|
||||
r_list_destroy (hits);
|
||||
|
@ -162,6 +162,7 @@ R_API int r_core_anal_ref_list(struct r_core_t *core, int rad);
|
||||
/* asm.c */
|
||||
typedef struct r_core_asm_hit {
|
||||
char *code;
|
||||
int len;
|
||||
ut64 addr;
|
||||
} RCoreAsmHit;
|
||||
|
||||
@ -170,6 +171,7 @@ R_API RList *r_core_asm_hit_list_new();
|
||||
R_API void r_core_asm_hit_free(void *_hit);
|
||||
R_API char* r_core_asm_search(RCore *core, const char *input, ut64 from, ut64 to);
|
||||
R_API RList *r_core_asm_strsearch(RCore *core, const char *input, ut64 from, ut64 to);
|
||||
R_API RList *r_core_asm_bwdisassemble (RCore *core, ut64 addr, int n, int len);
|
||||
|
||||
/* gdiff.c */
|
||||
R_API int r_core_gdiff(struct r_core_t *core, char *file1, char *file2, int va);
|
||||
|
@ -31,7 +31,7 @@ typedef struct r_oflist_t {
|
||||
for (it = list->head; it && (pos = it->data); it = it->n)
|
||||
#define r_list_foreach_prev(list, it, pos) \
|
||||
for (it = list->tail; it && (pos = it->data); it = it->p)
|
||||
#define r_list_iterator(x) x->head
|
||||
#define r_list_iterator(x) (x)->head
|
||||
#define r_list_empty(x) (x->head==NULL && x->tail==NULL)
|
||||
#define r_list_head(x) x->head
|
||||
#define r_list_tail(x) x->tail
|
||||
|
@ -12,8 +12,8 @@ func main() {
|
||||
os.Exit(1)
|
||||
}
|
||||
b := r_bin.NewRBin()
|
||||
b.Load(os.Args[1], "")
|
||||
baddr := b.GetBaddr()
|
||||
b.Load(os.Args[1], false)
|
||||
baddr := b.Get_baddr()
|
||||
fmt.Println("-> Sections")
|
||||
fmt.Printf("baddr=%08x\n", baddr)
|
||||
for _, s:= range b.Get_sections() {
|
||||
|
@ -43,6 +43,7 @@ public class RCore {
|
||||
|
||||
/* asm */
|
||||
public RList<RCore.AsmHit> asm_strsearch(string input, uint64 from, uint64 to);
|
||||
public RList<RCore.AsmHit> asm_bwdisassemble(uint64 addr, int n, int len);
|
||||
|
||||
// XXX mode = Radare.Io.Mode
|
||||
[Compact]
|
||||
|
@ -1,4 +1,4 @@
|
||||
all: plugin.so bin lang core asmsearch regs hash sc socket asm search db io list rgot
|
||||
all: plugin.so bin lang core asmsearch bwdisassemble regs hash sc socket asm search db io list rgot
|
||||
@true
|
||||
|
||||
plugin.so:
|
||||
@ -77,6 +77,9 @@ core:
|
||||
asmsearch:
|
||||
valac --vapidir=.. asmsearch.vala --pkg r_core --pkg r_bin -o asmsearch
|
||||
|
||||
bwdisassemble:
|
||||
valac --vapidir=.. bwdisassemble.vala --pkg r_core --pkg r_bin -o bwdisassemble
|
||||
|
||||
search:
|
||||
valac -C --vapidir=${PWD}/.. search.vala --pkg r_search --pkg r_util
|
||||
gcc search.c `pkg-config gobject-2.0 --libs --cflags` -I../../../libr/include/ \
|
||||
@ -105,4 +108,4 @@ socket:
|
||||
gcc socket.c `pkg-config gobject-2.0 --libs --cflags` -I../../../libr/include/ -lr_socket -Wl,-R../../socket -L../../socket -o socket
|
||||
|
||||
clean:
|
||||
-rm -f *.c hash sc *.o *.h core socket asm search bin io rgot reloc asmsearch
|
||||
-rm -f *.c hash sc *.o *.h core socket asm search bin io rgot reloc asmsearch bwdisassemble
|
||||
|
@ -2,15 +2,15 @@ uses
|
||||
Radare
|
||||
|
||||
init
|
||||
var st = new Asm()
|
||||
st.set("asm_x86_olly")
|
||||
st.set_syntax(Asm.Syntax.INTEL)
|
||||
var st = new RAsm()
|
||||
st.use("x86")
|
||||
st.set_syntax(RAsm.Syntax.INTEL)
|
||||
st.set_bits(32)
|
||||
st.set_big_endian(false)
|
||||
st.set_pc(0x8048000)
|
||||
|
||||
/* Disassembler test */
|
||||
op : Radare.Asm.Aop
|
||||
op : RAsm.Aop
|
||||
var buf = "\x83\xe4\xf0"
|
||||
st.disassemble(out op, buf, 3)
|
||||
print "opcode: %s", op.buf_asm
|
||||
|
@ -4,19 +4,18 @@
|
||||
using Radare;
|
||||
|
||||
void main(string[] args) {
|
||||
var bin = new rBin();
|
||||
var bin = new RBin();
|
||||
|
||||
if (args.length==1)
|
||||
error("No file given");
|
||||
if (bin.open(args[1], false)<0)
|
||||
if (bin.load(args[1], false)<0)
|
||||
error("Cannot open file");
|
||||
|
||||
print("Entrypoint: 0x%08"PFMT64x"\n", bin.get_entry().offset);
|
||||
foreach (rBin.Symbol *f in bin.get_symbols())
|
||||
print(" - 0x%08"PFMT64x" %s\n", f->offset, f->name);
|
||||
foreach (var f in bin.get_entries())
|
||||
print("Entrypoint: 0x%08"+uint64.FORMAT_MODIFIER+"\n", f.offset);
|
||||
foreach (var f in bin.get_symbols())
|
||||
print(" - 0x%08"+uint64.FORMAT_MODIFIER+"x %s\n", f.offset, f.name);
|
||||
|
||||
foreach (rBin.Section *f in bin.get_sections())
|
||||
print(" - 0x%08"PFMT64x" %s\n", f->offset, f->name);
|
||||
|
||||
bin.close();
|
||||
foreach (var f in bin.get_sections())
|
||||
print(" - 0x%08"+uint64.FORMAT_MODIFIER+"x %s\n", f.offset, f.name);
|
||||
}
|
||||
|
9
swig/vapi/t/bwdisassemble.vala
Normal file
9
swig/vapi/t/bwdisassemble.vala
Normal file
@ -0,0 +1,9 @@
|
||||
using Radare;
|
||||
|
||||
public static void main(string[] args)
|
||||
{
|
||||
var c = new RCore();
|
||||
c.file_open("/bin/ls", 0);
|
||||
foreach (var a in c.asm_bwdisassemble(0x67c0, 4, 64))
|
||||
print("BACKWARD DISASM: 0x%08"+uint64.FORMAT_MODIFIER+"x\n", a.addr);
|
||||
}
|
@ -21,7 +21,7 @@ void main(string[] args) {
|
||||
|
||||
string file = args[1];
|
||||
var bin = new RBin ();
|
||||
if (bin.load (file, null) != 1)
|
||||
if (bin.load (file, false) != 1)
|
||||
error ("Cannot open binary file\n");
|
||||
|
||||
uint64 baddr = bin.get_baddr();
|
||||
|
Loading…
x
Reference in New Issue
Block a user