2 Declaration for Linux kernel compatibility
10 #include <sys/ptrace.h>
15 char *victim_exe
= NULL
;
17 #define TRAP_BIT (0x80000000)
19 static struct nlist
*exe_nlist
;
20 static int exe_nlist_n
;
22 void printk(char *fmt
, ...)
27 vfprintf(stderr
, fmt
, ap
);
31 int kallsyms_address_to_symbol(db_expr_t off
,
32 const char * *mod_name
, unsigned long *mod_start
, unsigned long *mod_end
,
33 const char * *sec_name
, unsigned long *sec_start
, unsigned long *sec_end
,
34 const char * *sym_name
, unsigned long *sym_start
, unsigned long *sym_end
)
39 unsigned long btext
, etext
;
40 struct nlist
*below
, *above
;
43 load_nlist(victim_exe
, &btext
, &etext
);
45 for (i
= 0; i
<exe_nlist_n
; i
++)
47 if (exe_nlist
[i
].n_type
!= N_TEXT
)
49 if (exe_nlist
[i
].n_value
<= off
)
51 if (!below
|| exe_nlist
[i
].n_value
> below
->n_value
)
54 if (exe_nlist
[i
].n_value
> off
)
56 if (!above
|| exe_nlist
[i
].n_value
< above
->n_value
)
64 *mod_name
= victim_exe
;
71 assert(below
&& above
);
73 strncpy(name
, below
->n_name
, sizeof(name
)-1);
74 name
[sizeof(name
)-1]= '\0';
77 *sym_start
= below
->n_value
| TRAP_BIT
;
78 *sym_end
= above
->n_value
| TRAP_BIT
;
83 unsigned long text_read_ul(void *addr
)
88 for (i
= 0; i
<sizeof(value
); i
++)
90 ((unsigned char *)&value
)[i
]= text_read_ub((char *)addr
+i
);
95 unsigned char text_read_ub(void *addr
)
100 vaddr
= (unsigned long)addr
;
102 v
= ptrace(T_READB_INS
, victim_pid
, (void *)vaddr
, 0);
106 "text_read_ub: trace T_READB_INS failed on pid %d, addr 0x%lx: %s\n",
107 victim_pid
, vaddr
, strerror(errno
));
113 void text_write_ul(void *addr
, unsigned long value
)
117 for (i
= 0; i
<sizeof(value
); i
++)
119 text_write_ub((char *)addr
+i
, ((unsigned char *)&value
)[i
]);
123 void text_write_ub(void *addr
, unsigned char value
)
128 vaddr
= (unsigned long)addr
;
130 v
= ptrace(T_WRITEB_INS
, victim_pid
, (void *)vaddr
, value
);
134 "text_read_ub: trace T_WRITEB_INS failed on pid %d, addr 0x%lx: %s\n",
135 victim_pid
, vaddr
, strerror(errno
));
140 void load_nlist(exe_name
, btextp
, etextp
)
142 unsigned long *btextp
;
143 unsigned long *etextp
;
146 unsigned long btext
, etext
;
150 exe_nlist_n
= read_nlist(exe_name
, &exe_nlist
);
151 if (exe_nlist_n
<= 0)
153 if (exe_nlist_n
== -1)
156 "error reading name list from '%s': %s\n",
157 exe_name
, strerror(errno
));
160 fprintf(stderr
, "no name list in '%s'\n",
166 if (!btextp
&& !etextp
)
170 btext
= (unsigned long)-1;
171 for (i
= 0; i
<exe_nlist_n
; i
++)
173 if (exe_nlist
[i
].n_type
!= N_TEXT
)
175 if (exe_nlist
[i
].n_value
< btext
)
176 btext
= exe_nlist
[i
].n_value
;
177 if (exe_nlist
[i
].n_value
> etext
)
178 etext
= exe_nlist
[i
].n_value
;
183 fprintf(stderr
, "Bad btext (0x%lx) or etext (0x%lx) in %s\n",
184 btext
, etext
, exe_name
);