Example #1
0
const char *try_demangle_noprefix(const char *mangled)
{
	const char *demangled = try_demangle(mangled);
	
	if (strncmp(demangled, "typeinfo for ", 13) == 0) {
		return demangled + 13;
	} else if (strncmp(demangled, "vtable for ", 11) == 0) {
		return demangled + 11;
	} else {
		return demangled;
	}
}
Example #2
0
func_t *func_register(void *pfunc)
{
	func_t *func;
	
	/* skip if function is already registered */
	for (func = funcs; func != funcs + num_funcs; ++func) {
		if (func->func_addr == (uintptr_t)pfunc) {
			return func;
		}
	}
	
	assert(num_funcs < (sizeof(funcs) / sizeof(*funcs)));
	func = funcs + num_funcs++;
	
	func->func_addr = (uintptr_t)pfunc;
	
	symbol_t sym;
	if (!symtab_func_addr_abs(&sym, (uintptr_t)pfunc)) {
		errx(1, "symtab_func_addr_abs_anylib(0x%08x) failed", func->func_addr);
	}
	
	func->name = sym.name;
	func->name_demangled = try_demangle(sym.name);
	func->func_size = sym.size;
	
	func->has_detour  = false;
	
	void *buf;
	if ((buf = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
		MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
		err(1, "mmap for func '%s' trampoline failed", func->name_demangled);
	}
	func->trampoline_addr = (uintptr_t)buf;
	func->trampoline_size = PAGE_SIZE;
	
	//pr_debug("func_register %s:\n", func->name_demangled);
	//pr_debug("  addr %08x\n  size %08x\n", func->func_addr, func->func_size);
	/*func_dump(func);*/
	
	return func;
}