This commit is contained in:
Nibble 2011-09-04 02:45:29 +02:00
commit fd49310812
19 changed files with 242 additions and 75 deletions

1
TODO
View File

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

View File

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

View File

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

View File

@ -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; i<len; i++) {
for (i=0; i<len; i++)
r_cons_printf ("%02x", buf[i]);
}
r_cons_newline ();
} else eprintf ("Unnamed function at 0x%08"PFMT64x"\n", fcni->addr);
} 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; i<core->blocksize; 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"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,9 @@
/* radare - LGPL - Copyright 2009-2010 pancake<nopcode.org> */
#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;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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