* 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:
Nibble 2010-10-06 18:04:47 +02:00
parent b21584e06c
commit 124aa07a96
13 changed files with 111 additions and 31 deletions

6
TODO
View File

@ -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

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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() {

View File

@ -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]

View File

@ -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

View File

@ -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

View File

@ -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);
}

View 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);
}

View File

@ -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();