mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-08 06:47:33 +00:00
* 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:
parent
9587e5ac9a
commit
56baae7e6e
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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))
|
||||
|
@ -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 }
|
||||
};
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user