1 /* radare - LGPL - Copyright 2015 - pancake, nibble */
2
3 #include <r_anal.h>
4
5 typedef void (*RAnalEsilPin)(RAnal *a);
6
7 #if 0
8 // TODO: those hardcoded functions should go
9 /* default pins from libc */
10 static void pin_strlen(RAnal *a) {
11 // get a0 register
12 // read memory and interpret it as a string
13 // set a0 to the result of strlen;
14 eprintf ("esilpin: strlen\n");
15 }
16
17 static void pin_write(RAnal *a) {
18 // get a0 register for fd
19 // get a1 register for data
20 // get a2 register for len
21 // read len bytes from data and print them to screen + fd
22 // set a0 to the result of write;
23 eprintf ("esilpin: write\n");
24 }
25 #endif
26
27 /* pin api */
28
29 #define DB a->sdb_pins
30
r_anal_pin_init(RAnal * a)31 R_API void r_anal_pin_init(RAnal *a) {
32 sdb_free (DB);
33 DB = sdb_new0();
34 // sdb_ptr_set (DB, "strlen", pin_strlen, 0);
35 // sdb_ptr_set (DB, "write", pin_write, 0);
36 }
37
r_anal_pin_fini(RAnal * a)38 R_API void r_anal_pin_fini(RAnal *a) {
39 if (sdb_free (DB)) {
40 DB = NULL;
41 }
42 }
43
r_anal_pin(RAnal * a,ut64 addr,const char * name)44 R_API void r_anal_pin(RAnal *a, ut64 addr, const char *name) {
45 char buf[64];
46 const char *key = sdb_itoa (addr, buf, 16);
47 sdb_set (DB, key, name, 0);
48 }
49
r_anal_pin_unset(RAnal * a,ut64 addr)50 R_API void r_anal_pin_unset(RAnal *a, ut64 addr) {
51 char buf[64];
52 const char *key = sdb_itoa (addr, buf, 16);
53 sdb_unset (DB, key, 0);
54 }
55
r_anal_pin_call(RAnal * a,ut64 addr)56 R_API const char *r_anal_pin_call(RAnal *a, ut64 addr) {
57 char buf[64];
58 const char *key = sdb_itoa (addr, buf, 16);
59 if (key) {
60 return sdb_const_get (DB, key, NULL);
61 #if 0
62 const char *name;
63 if (name) {
64 RAnalEsilPin fcnptr = (RAnalEsilPin)
65 sdb_ptr_get (DB, name, NULL);
66 if (fcnptr) {
67 fcnptr (a);
68 return true;
69 }
70 }
71 #endif
72 }
73 return NULL;
74 }
75
cb_list(void * user,const char * k,const char * v)76 static bool cb_list(void *user, const char *k, const char *v) {
77 RAnal *a = (RAnal*)user;
78 if (*k == '0') {
79 // bind
80 a->cb_printf ("%s = %s\n", k, v);
81 } else {
82 // ptr
83 a->cb_printf ("PIN %s\n", k);
84 }
85 return true;
86 }
87
r_anal_pin_list(RAnal * a)88 R_API void r_anal_pin_list(RAnal *a) {
89 sdb_foreach (DB, cb_list, a);
90 }
91