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