diff --git a/TODO b/TODO index e92d0897c8..e3cd53bcc2 100644 --- a/TODO +++ b/TODO @@ -41,7 +41,6 @@ OSX === * Cant set register values in OSX debugger - This is probably because we are using the 32bit binary on 64bit dbg -* Add support for OSX/Lion (PIE bins) * Proper support for MACH-O binaries - rabin2 -f works? i think its used with '-a' - I think symbols are not correct .. (offset+disk) diff --git a/binr/radare2/radare2.c b/binr/radare2/radare2.c index dbbf488a02..0652648aa4 100644 --- a/binr/radare2/radare2.c +++ b/binr/radare2/radare2.c @@ -211,7 +211,9 @@ int main(int argc, char **argv) { } if (fh == NULL) { - eprintf ("Cannot open file.\n"); + if (perms & R_IO_WRITE) + eprintf ("Cannot open file for writing.\n"); + else eprintf ("Cannot open file.\n"); return 1; } if (r.file == NULL) // no given file diff --git a/libr/Makefile b/libr/Makefile index 157612580f..88966f171d 100644 --- a/libr/Makefile +++ b/libr/Makefile @@ -8,8 +8,8 @@ IFX=${DESTDIR}/${INCLUDEDIR} PWD=`pwd` # Libraries -LIBLIST=util socket cons line lib io lang flags bin hash config syscall cmd -LIBLIST+=reg asm diff anal print parse search egg bp sign debug fs core +LIBLIST=util socket db cons line lib io lang flags bin hash config syscall +LIBLIST+=cmd reg asm diff anal print parse search egg bp sign debug fs core #DEPRECATED APIS : LIBLIST+=th crypto # sysproxy ... common wat du? diff --git a/libr/core/cmd.c b/libr/core/cmd.c index 82a7b4ff14..d91d3e2f63 100644 --- a/libr/core/cmd.c +++ b/libr/core/cmd.c @@ -68,10 +68,11 @@ static int checkbpcallback(RCore *core) { } static int bypassbp(RCore *core) { + RBreakpointItem *bpi; ut64 addr; r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE); addr = r_debug_reg_get (core->dbg, "pc"); - RBreakpointItem *bpi = r_bp_get (core->dbg->bp, addr); + bpi = r_bp_get (core->dbg->bp, addr); if (!bpi) return R_FALSE; /* XXX 2 if libr/debug/debug.c:226 is enabled */ r_debug_step (core->dbg, 1); @@ -156,9 +157,8 @@ static int cmd_zign(void *data, const char *input) { name = flag->name; r_cons_printf ("zb %s ", name); len = (fcni->size>sizeof (buf))?sizeof (buf):fcni->size; - for (i=0; iaddr); } else eprintf ("Cannot read at 0x%08"PFMT64x"\n", fcni->addr); @@ -253,7 +253,7 @@ static int cmd_zign(void *data, const char *input) { break; case '\0': case '*': - r_sign_list (core->sign, (input[0]=='*')); + r_sign_list (core->sign, (*input=='*')); break; default: case '?': @@ -1688,13 +1688,12 @@ l = len; } break; case '=': - eprintf ("TODO: use zoom.byte to display entropy. like rahash2 -a entropy -b 32 /bin/ls\n"); - for (i=0; iblocksize; i++) { - int pc = (core->block[i]*100)/255; - r_print_addr (core->print, core->offset+i); - r_cons_printf ("%02x", core->block[i]); - r_print_progressbar (core->print, pc, 70); - r_cons_newline (); + /* TODO: Reimplement using API */ { + char *out = r_sys_cmd_strf ("rahash2 -a entropy -b 512 '%s'", core->file->filename); + if (out) { + r_cons_strcat (out); + free (out); + } } break; case 'b': @@ -1916,8 +1915,14 @@ l = len; } else { char *oldzoom = NULL; ut64 maxsize = r_config_get_i (core->config, "zoom.maxsz"); - ut64 from = r_config_get_i (core->config, "zoom.from"); - ut64 to = r_config_get_i (core->config, "zoom.to"); + ut64 from, to; + int oldva = core->io->va; + + from = 0; + core->io->va = 0; + to = r_io_size (core->io); + from = r_config_get_i (core->config, "zoom.from"); + to = r_config_get_i (core->config, "zoom.to"); if (input[1] != '\0' && input[1] != ' ') { oldzoom = strdup (r_config_get (core->config, "zoom.byte")); if (!r_config_set (core->config, "zoom.byte", input+1)) { @@ -1932,12 +1937,14 @@ l = len; r_config_set (core->config, "zoom.byte", oldzoom); free (oldzoom); } + if (oldva) + core->io->va = oldva; } break; default: r_cons_printf ( "Usage: p[fmt] [len]\n" - " p= [len] print byte percentage bars\n" + " p= show entropy bars of full file\n" " p6[de] [len] base64 decode/encode\n" " p8 [len] 8bit hexpair list of bytes\n" " pb [len] bitstream of N bytes\n" diff --git a/libr/core/core.c b/libr/core/core.c index ebac63ca86..f7b5a4c1df 100644 --- a/libr/core/core.c +++ b/libr/core/core.c @@ -50,7 +50,7 @@ static ut64 num_callback(RNum *userptr, const char *str, int *ok) { case 'o': return core->io->off; } } - if (str[0]>'A') { + if (*str>'A') { if ((flag = r_flag_get (core->flags, str))) { ret = flag->offset; *ok = R_TRUE; @@ -76,7 +76,7 @@ static const char *radare_argv[] = { "#sha1", "#crc32", "#pcprint", "#sha256", "#sha512", "#md4", "#md5", "#!python", "#!perl", "#!vala", "V", - "aa", "ab", "af", "ar", "ag", "at", "av", "a?", + "aa", "ab", "af", "ar", "ag", "at", "a?", "aga", "agc", "agd", "agl", "agfl", "e", "e-", "e*", "e!", "i", "ii", "iI", "is", "iS", "iz", @@ -128,7 +128,7 @@ static int autocomplete(RLine *line) { int n, i = 0; int sdelta = 2; //(line->buffer.data[1]==' ')?2:3; if (!line->buffer.data[sdelta]) { - path = r_sys_getcwd (); + path = r_sys_getdir (); } else { path = strdup (line->buffer.data+sdelta); } @@ -380,6 +380,7 @@ R_API RCore *r_core_free(RCore *c) { free (c); return NULL; } + R_API void r_core_prompt_loop(RCore *r) { int ret; do { diff --git a/libr/core/disasm.c b/libr/core/disasm.c index 762fc3a575..b6cc17369c 100644 --- a/libr/core/disasm.c +++ b/libr/core/disasm.c @@ -147,11 +147,16 @@ R_API int r_core_print_disasm(RPrint *p, RCore *core, ut64 addr, ut8 *buf, int l //eprintf ("** invalid opcode at 0x%08"PFMT64x" **\n", // core->assembler->pc + ret); lastfail = 1; - continue; + strcpy (asmop.buf_asm, "invalid"); + sprintf (asmop.buf_hex, "%02x", buf[idx]); + //continue; } else lastfail = 0; if (core->inc == 0) core->inc = ret; - r_anal_op (core->anal, &analop, at, buf+idx, (int)(len-idx)); + + if (lastfail) + memset (&analop, 0, sizeof (analop)); + else r_anal_op (core->anal, &analop, at, buf+idx, (int)(len-idx)); { RAnalValue *src; switch (analop.type) { diff --git a/libr/core/visual.c b/libr/core/visual.c index 7c2d2f1b03..298fc6d008 100644 --- a/libr/core/visual.c +++ b/libr/core/visual.c @@ -169,6 +169,7 @@ R_API int r_core_visual_cmd(RCore *core, int ch) { r_cons_flush (); r_cons_set_raw (0); strcpy (buf, "wx "); + r_line_set_prompt ("hex: "); if (r_cons_fgets (buf+3, 1000, 0, NULL) <0) buf[0]='\0'; if (*buf) { if (curset) r_core_seek (core, core->offset + cursor, 0); @@ -200,13 +201,25 @@ R_API int r_core_visual_cmd(RCore *core, int ch) { r_io_sundo_push (core->io); break; case 'G': +{ + int ret = 0; if (core->io->va) { - ut64 offset = r_io_section_get_vaddr (core->io, core->file->size-core->blocksize); - r_core_seek (core, offset, 1); - } else - r_core_seek (core, core->file->size-core->blocksize, 1); + ut64 offset = r_io_section_get_vaddr (core->io, 0); + //ut64 offset = r_io_section_get_vaddr (core->io, + // core->file->size-core->blocksize); + if (offset == UT64_MAX) { + ret = r_core_seek (core, offset, 1); + memset (core->block, 0xff, core->blocksize); + } else { + offset += core->file->size - core->blocksize; + ret = r_core_seek (core, offset, 1); + memset (core->block, 0xff, core->blocksize); + } + } else { + ret = r_core_seek (core, core->file->size-core->blocksize, 1); + } r_io_sundo_push (core->io); - //r_core_cmd(core, "s 0", 0); +} break; case 'h': if (curset) { @@ -369,10 +382,10 @@ R_API int r_core_visual_cmd(RCore *core, int ch) { core->printidx = (core->printidx-1)%NPF; break; case 'm': - r_core_visual_mark (core, r_cons_readchar()); + r_core_visual_mark (core, r_cons_readchar ()); break; case '\'': - r_core_visual_mark_seek (core, r_cons_readchar()); + r_core_visual_mark_seek (core, r_cons_readchar ()); break; case 'y': if (ocursor==-1) r_core_yank (core, core->offset+cursor, 1); diff --git a/libr/db/pair.c b/libr/db/pair.c index eb70024129..9417dae78c 100644 --- a/libr/db/pair.c +++ b/libr/db/pair.c @@ -12,9 +12,9 @@ p.set ("foo", "bar") var out = p.get ("foo") */ - R_API RPair *r_pair_new () { RPair *p = R_NEW0 (RPair); + p->ht = r_hashtable_new (); p->dbs = r_list_new (); p->dbs->free = (RListFree)sdb_free; return p; @@ -44,22 +44,45 @@ R_API void r_pair_delete (RPair *p, const char *name) { sdb_delete (sdb, key); } +static Sdb *pair_sdb_new(RPair *p, const char *dom, ut32 hdom) { + Sdb *sdb; + char *old = NULL; + if (p->dir) { + old = r_sys_getdir (); + r_sys_rmkdir (p->dir); + r_sys_chdir (p->dir); + } + + sdb = sdb_new (dom, 0); + if (old) { + r_sys_chdir (old); + free (old); + } + r_list_append (p->dbs, sdb); + r_hashtable_insert (p->ht, hdom, sdb); + return sdb; +} + R_API char *r_pair_get (RPair *p, const char *name) { Sdb *sdb; ut32 hdom; - char *dom, *key = strdup (name); + char *dom, *key, *okey = strdup (name); - dom = r_str_lchr (key, '.'); + key = okey; + dom = r_str_lchr (okey, '.'); if (dom) { - key = dom+1; + char *tmp = okey; *dom = 0; - dom = 0; + key = dom+1; + dom = tmp; } else dom = ""; hdom = r_str_hash (dom); sdb = r_hashtable_lookup (p->ht, hdom); - if (sdb) - return sdb_get (sdb, key); - return strdup (""); + if (!sdb) + sdb = pair_sdb_new (p, dom, hdom); + dom = sdb_get (sdb, key); + free (okey); + return dom; } R_API void r_pair_set (RPair *p, const char *name, const char *value) { @@ -69,38 +92,76 @@ R_API void r_pair_set (RPair *p, const char *name, const char *value) { dom = r_str_lchr (key, '.'); if (dom) { - key = dom+1; + char *okey = key; *dom = 0; - dom = 0; + key = dom+1; + dom = okey; } else dom = ""; hdom = r_str_hash (dom); sdb = r_hashtable_lookup (p->ht, hdom); - if (!sdb) { - sdb = sdb_new (dom, 0); - r_hashtable_insert (p->ht, hdom, sdb); - } + if (!sdb) + sdb = pair_sdb_new (p, dom, hdom); sdb_set (sdb, key, value); } R_API RList *r_pair_list (RPair *p, const char *domain) { + ut32 hdom = r_str_hash (domain); + Sdb *s = r_hashtable_lookup (p->ht, hdom); + if (s) { + RList *list = r_list_new (); + char key[SDB_KEYSIZE]; + char val[SDB_VALUESIZE]; + list->free = (RListFree)r_pair_item_free; + sdb_dump_begin (s); + while (sdb_dump_next (s, key, val)) + r_list_append (list, r_pair_item_new (key, val)); + return list; + } return NULL; } +RPairItem *r_pair_item_new (const char *k, const char *v) { + RPairItem *i = R_NEW (RPairItem); + i->k = strdup (k); + i->v = strdup (v); + return i; +} + +R_API void r_pair_item_free (RPairItem *i) { + free (i->k); + free (i->v); + free (i); +} + R_API void r_pair_set_sync_dir (RPair *p, const char *dir) { free (p->dir); p->dir = strdup (dir); } // use sync dir -R_API void r_pair_load (RPair *p) { - // TODO +//R_API void r_pair_load (RPair *p) { /* TODO */ } + +R_API void r_pair_reset (RPair *p) { + Sdb *s; + RListIter *iter; + r_list_foreach (p->dbs, iter, s) + sdb_reset (s); } R_API void r_pair_sync (RPair *p) { Sdb *s; + char *old = NULL; RListIter *iter; - // chdir + if (p->dir) { + old = r_sys_getdir (); + r_sys_rmkdir (p->dir); + r_sys_chdir (p->dir); + } r_list_foreach (p->dbs, iter, s) { sdb_sync (s); } + if (old) { + r_sys_chdir (old); + free (old); + } } diff --git a/libr/db/sdb/src/lock.c b/libr/db/sdb/src/lock.c index 707d21a8ad..bb97c0c8c9 100644 --- a/libr/db/sdb/src/lock.c +++ b/libr/db/sdb/src/lock.c @@ -6,7 +6,10 @@ static char buf[128]; const char *sdb_lockfile(const char *f) { - int len = strlen (f); + int len; + if (!f || !*f) + return NULL; + len = strlen (f); if (len+10>sizeof buf) return NULL; memcpy (buf, f, len); diff --git a/libr/db/sdb/src/sdb.c b/libr/db/sdb/src/sdb.c index c6ab7ccb77..4f9f5392b9 100644 --- a/libr/db/sdb/src/sdb.c +++ b/libr/db/sdb/src/sdb.c @@ -15,7 +15,7 @@ Sdb* sdb_new (const char *dir, int lock) { if (lock && !sdb_lock (sdb_lockfile (dir))) return NULL; s = malloc (sizeof (Sdb)); - if (dir) { + if (dir && *dir) { s->dir = strdup (dir); s->fd = open (dir, O_RDONLY); } else { @@ -31,6 +31,17 @@ Sdb* sdb_new (const char *dir, int lock) { return s; } +void sdb_file (Sdb* s, const char *dir) { + if (s->lock) + sdb_unlock (sdb_lockfile (s->dir)); + free (s->dir); + if (dir && *dir) + s->dir = strdup (dir); + else s->dir = NULL; + if (s->lock) + sdb_lock (sdb_lockfile (s->dir)); +} + void sdb_free (Sdb* s) { if (!s) return; cdb_free (&s->db); @@ -97,6 +108,11 @@ int sdb_exists (Sdb* s, const char *key) { return 0; } +void sdb_reset (Sdb *s) { + ht_free (s->ht); + s->ht = ht_new (); +} + struct sdb_kv* sdb_kv_new (const char *k, const char *v) { struct sdb_kv *kv = R_NEW (struct sdb_kv); strncpy (kv->key, k, sizeof (kv->key)-1); diff --git a/libr/db/sdb/src/sdb.h b/libr/db/sdb/src/sdb.h index b07ba62e00..514c79967a 100644 --- a/libr/db/sdb/src/sdb.h +++ b/libr/db/sdb/src/sdb.h @@ -28,6 +28,8 @@ typedef struct sdb_kv { Sdb* sdb_new (const char *dir, int lock); void sdb_free (Sdb* s); +void sdb_file (Sdb* s, const char *dir); +void sdb_reset (Sdb *s); int sdb_exists (Sdb*, const char *key); int sdb_nexists (Sdb*, const char *key); diff --git a/libr/db/t/Makefile b/libr/db/t/Makefile index 10108c4b39..ebbea14c9b 100644 --- a/libr/db/t/Makefile +++ b/libr/db/t/Makefile @@ -4,7 +4,10 @@ include ../../config.mk all: test${EXT_EXE} -test${EXT_EXE}: +test.o: test.c + @echo nothing + +test${EXT_EXE}: test.o ${CC} -g -I ../../include test.c -L.. -lr_db -lr_util -L../../util -o test${EXT_EXE} clean: diff --git a/libr/db/t/test.c b/libr/db/t/test.c index ce571019bc..c6eaa74edb 100644 --- a/libr/db/t/test.c +++ b/libr/db/t/test.c @@ -1,6 +1,9 @@ /* radare - LGPL - Copyright 2009-2010 pancake */ + #include "r_db.h" +void test_pair (); +void test_db(); struct item_t { char city[10]; @@ -12,7 +15,39 @@ struct item_t { #define K_CITY R_DB_INDEXOF(struct item_t, city) int main(int argc, char **argv) { - struct r_db_t *db = r_db_new(); + test_pair (); + test_db (); + return 0; +} + +void test_pair () { + char *s; + RPair *p = r_pair_new (); + r_pair_set_sync_dir (p, "sdb-db-test"); + + r_pair_set (p, "root", "clown"); + r_pair_set (p, ".branch", "clown"); + r_pair_set (p, "user.name", "pancake"); + r_pair_set (p, "user.pass", "password"); + + s = r_pair_get (p, "user.name"); + printf ("user.name=%s\n", s); + + { + RPairItem *o; + RListIter *iter; + RList *list = r_pair_list (p, "user"); + printf ("DUMP:\n"); + r_list_foreach (list, iter, o) { + printf (" %s = %s\n", o->k, o->v); + } + r_list_destroy (list); + } + r_pair_sync (p); +} + +void test_db() { + RDatabase *db = r_db_new (); void **siter; struct item_t *it, tmp; @@ -71,6 +106,4 @@ int main(int argc, char **argv) { printf("--> free db\n"); r_db_free(db); - - return 0; } diff --git a/libr/include/r_db.h b/libr/include/r_db.h index 04dbfb6740..a2c20a3954 100644 --- a/libr/include/r_db.h +++ b/libr/include/r_db.h @@ -56,8 +56,25 @@ while (r_db_iter_next(it)) { } #endif +typedef struct r_pair_item_t { + char *k, *v; +} RPairItem; + #ifdef R_API +R_API RPairItem *r_pair_item_new (); +R_API void r_pair_item_free (RPairItem*); + +R_API RPair *r_pair_new (); +R_API void r_pair_free (RPair *p); +R_API void r_pair_delete (RPair *p, const char *name); +R_API char *r_pair_get (RPair *p, const char *name); +R_API void r_pair_set (RPair *p, const char *name, const char *value); +R_API RList *r_pair_list (RPair *p, const char *domain); +R_API void r_pair_set_sync_dir (RPair *p, const char *dir); +R_API void r_pair_load (RPair *p); +R_API void r_pair_sync (RPair *p); +/* */ R_API struct r_db_t *r_db_new(); R_API struct r_db_block_t *r_db_block_new(); R_API int r_db_add_id(struct r_db_t *db, int off, int size); diff --git a/libr/include/r_util.h b/libr/include/r_util.h index 6d1b740514..49b4645b7e 100644 --- a/libr/include/r_util.h +++ b/libr/include/r_util.h @@ -356,7 +356,8 @@ R_API int r_sys_sleep(int secs); R_API int r_sys_usleep(int usecs); R_API char *r_sys_getenv(const char *key); R_API int r_sys_setenv(const char *key, const char *value); -R_API char *r_sys_getcwd(); +R_API char *r_sys_getdir(); +R_API int r_sys_chdir(const char *s); R_API char *r_sys_cmd_str_full(const char *cmd, const char *input, int *len, char **sterr); #if __WINDOWS__ R_API char *r_sys_cmd_str_w32(const char *cmd); diff --git a/libr/print/print.c b/libr/print/print.c index c3b093529d..1d391dc08f 100644 --- a/libr/print/print.c +++ b/libr/print/print.c @@ -178,7 +178,7 @@ R_API int r_print_string(RPrint *p, ut64 seek, const ut8 *buf, int len, int wide // TODO: some ascii can be bypassed here p->printf ("%%%02x", buf[i]); } else { - if (IS_PRINTABLE (buf[i])) + if (buf[i]=='\n' || IS_PRINTABLE (buf[i])) p->printf ("%c", buf[i]); else p->printf ("\\x%02x", buf[i]); } diff --git a/libr/util/file.c b/libr/util/file.c index 1a391c1d51..e0ee9dbbcf 100644 --- a/libr/util/file.c +++ b/libr/util/file.c @@ -27,14 +27,17 @@ R_API boolt r_file_exist(const char *str) { } R_API char *r_file_abspath(const char *file) { + char *ret = NULL; + char *cwd = r_sys_getdir (); #if __UNIX__ - if (file[0] != '/') - return r_str_dup_printf ("%s/%s", r_sys_getcwd (), file); + if (cwd && *file != '/') + ret = r_str_dup_printf ("%s/%s", cwd, file); #elif __WINDOWS__ - if (!strchr (file, ':')) - return r_str_dup_printf ("%s/%s", r_sys_getcwd (), file); + if (cwd && !strchr (file, ':')) + ret = r_str_dup_printf ("%s/%s", cwd, file); #endif - return strdup (file); + free (cwd); + return ret? ret: strdup (file); } R_API char *r_file_path(const char *bin) { diff --git a/libr/util/str.c b/libr/util/str.c index dd57f5b808..2eab938f72 100644 --- a/libr/util/str.c +++ b/libr/util/str.c @@ -203,6 +203,7 @@ R_API ut64 r_str_hash64(const char *str) { R_API ut32 r_str_hash(const char *str) { ut32 ret = 0; + if (str) for (; *str; str++) ret ^= (ret<<7 | *str); return ret; diff --git a/libr/util/sys.c b/libr/util/sys.c index 7da5f22a7c..56a9d4420b 100644 --- a/libr/util/sys.c +++ b/libr/util/sys.c @@ -181,30 +181,30 @@ R_API int r_sys_crash_handler(const char *cmd) { #endif } -#if __WINDOWS__ R_API char *r_sys_getenv(const char *key) { +#if __WINDOWS__ static char envbuf[1024]; envbuf[0] = 0; GetEnvironmentVariable (key, (LPSTR)&envbuf, sizeof (envbuf)); // TODO: handle return value of GEV - return strdup (envbuf); -} + return *envbuf? strdup (envbuf): NULL; #else -R_API char *r_sys_getenv(const char *key) { char *b = getenv (key); - if (b) return strdup (b); - return NULL; + return b? strdup (b): NULL; +#endif } -#endif -R_API char *r_sys_getcwd(void) { -#if __UNIX__ - return getcwd (NULL, 0); -#elif __WINDOWS__ - return _getcwd (NULL, 0); +R_API char *r_sys_getdir(void) { +#if __WINDOWS__ + char *cwd = _getcwd (NULL, 0); #else -#warning TODO: r_sys_getcwd + char *cwd = getcwd (NULL, 0); #endif + return cwd? strdup (cwd): NULL; +} + +R_API int r_sys_chdir(const char *s) { + return chdir (s)==0; } #if __UNIX__ @@ -288,9 +288,9 @@ R_API char *r_sys_cmd_str_full(const char *cmd, const char *input, int *len, cha close (sh_out[0]); close (sh_err[0]); close (sh_in[1]); - waitpid(pid, &status, 0); + waitpid (pid, &status, 0); if (status != 0) { - eprintf("%s: command returned !0\n", __func__); + eprintf ("%s: command returned !0\n", __func__); return (NULL); }