* Use RList in r_sign (Thanks edu for the patch!)

* Implement dummy darwin-arm syscall table to disable warnings in iphoneos
This commit is contained in:
pancake 2010-07-16 00:40:28 +02:00
parent 9587e5ac9a
commit 56baae7e6e
5 changed files with 35 additions and 23 deletions

View File

@ -309,11 +309,11 @@ static int MACH0_(r_bin_mach0_init_items)(struct MACH0_(r_bin_mach0_obj_t)* bin)
static int MACH0_(r_bin_mach0_init)(struct MACH0_(r_bin_mach0_obj_t)* bin)
{
if (!MACH0_(r_bin_mach0_init_hdr)(bin)) {
eprintf("Warning: File is not MACH0\n");
eprintf ("Warning: File is not MACH0\n");
return R_FALSE;
}
if (!MACH0_(r_bin_mach0_init_items)(bin))
eprintf("Warning: Cannot initalize items\n");
eprintf ("Warning: Cannot initalize items\n");
return R_TRUE;
}

View File

@ -4,7 +4,7 @@
#include <r_types.h>
#include <r_anal.h>
#include <r_util.h>
#include "list.h"
#include <r_list.h>
enum {
R_SIGN_BYTE = 'b',
@ -21,7 +21,7 @@ typedef struct r_sign_item_t {
ut64 addr;
ut8 *bytes;
ut8 *mask;
struct list_head list;
RList *list;
} RSignItem;
typedef struct r_sign_t {
@ -31,7 +31,7 @@ typedef struct r_sign_t {
int s_func; // TODO: this must be an array count[N]
char prefix[32];
PrintfCallback printf;
struct list_head items;
RList *items;
} RSign;
typedef int (*RSignCallback)(RSignItem *si, void *user);
@ -44,6 +44,7 @@ R_API RSign *r_sign_free(RSign *sig);
R_API void r_sign_prefix(RSign *sig, const char *str);
R_API void r_sign_list(RSign *sig, int rad);
R_API void r_sign_reset(RSign *sig);
R_API void r_sign_item_free(void *_item);
// old api
R_API int r_sign_generate(RSign *sig, const char *file, FILE *fd);

View File

@ -9,7 +9,8 @@ R_API RSign *r_sign_new() {
sig->s_byte = sig->s_anal = 0;
sig->prefix[0] = '\0';
sig->printf = (PrintfCallback) printf;
INIT_LIST_HEAD (&(sig->items));
sig->items = r_list_new ();
sig->items->free = r_sign_item_free;
}
return sig;
}
@ -42,7 +43,7 @@ R_API int r_sign_add(RSign *sig, RAnal *anal, int type, const char *name, const
// TODO. matching must be done by sym/flag/function name
// sig->addr =
}
list_add_tail (&(si->list), &(sig->items));
r_list_append (sig->items, si);
break;
case R_SIGN_HEAD: // function prefix (push ebp..)
case R_SIGN_BYTE: // function mask
@ -69,7 +70,7 @@ R_API int r_sign_add(RSign *sig, RAnal *anal, int type, const char *name, const
free (si->bytes);
free (si->mask);
free (si);
} else list_add_tail (&(si->list), &(sig->items));
} else r_list_append (sig->items, si);
free (data);
break;
default:
@ -82,12 +83,11 @@ R_API int r_sign_add(RSign *sig, RAnal *anal, int type, const char *name, const
R_API void r_sign_list(RSign *sig, int rad) {
if (rad) {
struct list_head *pos;
RListIter *iter;
RSignItem *si;
sig->printf ("zp-");
list_for_each (pos, &sig->items) {
RSignItem *si = list_entry (pos, RSignItem, list);
r_list_foreach (sig->items, iter, si)
sig->printf ("z%c %s ...\n", si->type, si->name); // TODO : show bytes
}
} else {
sig->printf ("Loaded %d signatures\n", sig->s_byte + sig->s_anal);
sig->printf (" %d byte signatures\n", sig->s_byte);
@ -97,25 +97,28 @@ R_API void r_sign_list(RSign *sig, int rad) {
}
R_API void r_sign_reset(RSign *sig) {
struct list_head *pos, *n;
list_for_each_safe (pos, n, &sig->items) {
RSignItem *i = list_entry (pos, RSignItem, list);
free (i->bytes);
free (i);
}
INIT_LIST_HEAD (&(sig->items));
r_list_free (sig->items);
sig->items = r_list_new ();
}
R_API RSign *r_sign_free(RSign *sig) {
r_sign_reset (sig);
r_list_free (sig->items);
free (sig);
return NULL;
}
R_API void r_sign_item_free(void *_item) {
RSignItem *item = _item;
free (item->bytes);
free (item->mask);
free (item);
}
R_API RSignItem *r_sign_check(RSign *sig, const ut8 *buf, int len) {
struct list_head *pos;
list_for_each (pos, &sig->items) {
RSignItem *si = list_entry (pos, RSignItem, list);
RListIter *iter;
RSignItem *si;
r_list_foreach (sig->items, iter, si) {
if (si->type == R_SIGN_BYTE) {
int l = (len>si->size)?si->size:len;
if (!r_mem_cmp_mask (buf, si->bytes, si->mask, l))

View File

@ -114,3 +114,8 @@ RSyscallItem syscalls_darwin_x86[] = {
{ "iokit_user_client_trap", 0x81, 100 ,1},
{ NULL, 0x81, 0, 0 }
};
/* XXX */
RSyscallItem syscalls_darwin_arm[] = {
{ NULL, 0x81, 0, 0 }
};

View File

@ -12,6 +12,7 @@ extern RSyscallItem syscalls_linux_mips[];
extern RSyscallItem syscalls_linux_arm[];
extern RSyscallItem syscalls_freebsd_x86[];
extern RSyscallItem syscalls_darwin_x86[];
extern RSyscallItem syscalls_darwin_arm[];
extern RSyscallItem syscalls_win7_x86[];
R_API RSyscall* r_syscall_new() {
@ -45,6 +46,8 @@ R_API int r_syscall_setup(RSyscall *ctx, const char *arch, const char *os) {
if (!strcmp (arch, "arm")) {
if (!strcmp (os, "linux"))
ctx->sysptr = syscalls_linux_arm;
if (!strcmp (os, "darwin"))
ctx->sysptr = syscalls_darwin_arm;
else {
eprintf ("r_syscall_setup: Unknown arch '%s'\n", arch);
return R_FALSE;