Пример #1
0
static
int extract_baddr(struct bin_info_data *bin_data)
{
	int ret = 0;
	struct lttng_ust_dl_node *e;

	if (!bin_data->vdso) {
		ret = get_elf_info(bin_data);
		if (ret) {
			goto end;
		}
	} else {
		bin_data->memsz = 0;
		bin_data->has_build_id = 0;
		bin_data->has_debug_link = 0;
	}

	e = find_or_create_dl_node(bin_data);
	if (!e) {
		ret = -1;
		goto end;
	}
	e->marked = true;
end:
	free(bin_data->build_id);
	bin_data->build_id = NULL;
	free(bin_data->dbg_file);
	bin_data->dbg_file = NULL;
	return ret;
}
Пример #2
0
bool replace_certain_rels(char *libpath, char* fucation_name[], u4 newFun_ptr[], int size) {
    LOGV("get into replace_all_rels");
    FILE *m = NULL;
    char maps[80];
    char line[200];
    char soaddrs[20];
    char soaddr[10];
    char soname[60];
    char prop[10];
    long soaddval;
    long base;
    int result = false;
    memset(maps, 0, sizeof(maps));
    memset(soaddrs, 0, sizeof(soaddrs));
    memset(soaddr, 0, sizeof(soaddr));
    sprintf(maps, "/proc/self/maps", 1);
    m = fopen(maps, "r");
    if (!m) {
        LOGE("open maps error");
        return result;
    }
    while (fgets(line, sizeof(line), m)) {
        int found = 0;
        struct elf_info einfo;
        long tmpaddr = 0;

        if (strstr(line, ".so") == NULL)
            continue;
        if (strstr(line, "r-xp") == NULL)
            continue;
        if (strstr(line, libpath) != NULL) {
            found = 1;
        }
        if (!found) {
            continue;
        }
        sscanf(line, "%s %s %*s %*s %*s %s", soaddrs, prop, soname);
        sscanf(soaddrs, "%[^-]", soaddr);
        LOGV("#### %s %s %s\n", soaddr, prop, soname);
        base = strtoul(soaddr, NULL, 16);
        puint(base);
        get_elf_info(1, base, &einfo);
        int i =0;
        for(i=0; i<size; i++) {
            tmpaddr = find_sym_in_rel(&einfo, fucation_name[i]);
            if (tmpaddr != 0) {
                memcpy((void*)tmpaddr, (void*)newFun_ptr[i], 4);
                LOGV(" the function %s is hook sucessfully",fucation_name[i]);
            } else {
                return result;
                LOGV(" the function %s is hook fail",fucation_name[i]);
            }
        }
        result = true;
        return result;
    }
}
Пример #3
0
static jobject getSyslinkSnapshot(JNIEnv* env, jclass obj) {

    jclass  hashmap_class = (*env)->FindClass(env,"java/util/HashMap"); 
    jmethodID init_hashmap_Method = (*env)->GetMethodID(env,hashmap_class,"<init>","()V");  
	jmethodID put_method =  (*env)->GetMethodID(env,hashmap_class,"put","(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
	jobject hashmap_obj = (*env)->NewObject(env,hashmap_class,init_hashmap_Method); 
	jclass  long_class = (*env)->FindClass(env,"java/lang/Integer"); 
    jmethodID init_long_Method = (*env)->GetMethodID(env,long_class,"<init>","(I)V"); 
	
    FILE *m = NULL;
	char maps[80];
	char line[200];
	char soaddrs[20];
	char soaddr[10];
	char soname[60];
	char prop[10];
	long soaddval;
	long base;
	memset(maps, 0, sizeof(maps));
	memset(soaddrs, 0, sizeof(soaddrs));
	memset(soaddr, 0, sizeof(soaddr));
	sprintf(maps, "/proc/self/maps", 1);
	m = fopen(maps, "r");
	if (!m) {
		LOGE("open maps error");
		return hashmap_obj;
	}
	while (fgets(line, sizeof(line), m)) {
		int found = 0;
		struct elf_info einfo;
		long tmpaddr = 0;

		if (strstr(line, ".so") == NULL)
			continue;
		if (strstr(line, "r-xp") == NULL)
			continue;
		sscanf(line, "%s %s %*s %*s %*s %s", soaddrs, prop, soname);
		sscanf(soaddrs, "%[^-]", soaddr);
		
		jstring so_name_jstr = (*env)->NewStringUTF(env,soname);
		jobject syslist_obj = (*env)->NewObject(env,hashmap_class,init_hashmap_Method);
		(*env)->CallObjectMethod(env,hashmap_obj,put_method,so_name_jstr,syslist_obj);
		
		base = strtoul(soaddr, NULL, 16);
		get_elf_info(1, base, &einfo);
		
		Elf32_Rel rel;
	    Elf32_Sym sym;
	    unsigned int i;
	    char *sym_name = NULL;
	    unsigned int fuction_point;
	    struct dyn_info dinfo;
	    get_dyn_info(&einfo, &dinfo);
	    for (i = 0; i < dinfo.nrels; i++) {
		     memcpy((void*)&rel, (void*)((unsigned int) (dinfo.jmprel + i * sizeof(Elf32_Rel))),
				sizeof(Elf32_Rel));
		     if (ELF32_R_SYM(rel.r_info)) {
			     memcpy((void*)&sym,
					(void*)(dinfo.symtab + ELF32_R_SYM(rel.r_info) * sizeof(Elf32_Sym)),
					sizeof(Elf32_Sym));
			     sym_name = readstr(einfo.pid, dinfo.strtab + sym.st_name);
				 jstring sym_name_jstr = (*env)->NewStringUTF(env,sym_name);
				 fuction_point = ((einfo.ehdr.e_type == ET_DYN) ? einfo.base : 0) + rel.r_offset;
				 jobject long_obj = (*env)->NewObject(env,long_class,init_long_Method,fuction_point);
				 (*env)->CallObjectMethod(env,syslist_obj,put_method,sym_name_jstr,long_obj);
				 (*env)->ReleaseStringUTFChars(env,sym_name_jstr,sym_name);
				 (*env)->DeleteLocalRef(env,sym_name_jstr);
				 (*env)->DeleteLocalRef(env,long_obj);
		    }
	    }
		(*env)->ReleaseStringUTFChars(env,so_name_jstr,soname);
		(*env)->DeleteLocalRef(env,so_name_jstr);
		(*env)->DeleteLocalRef(env,syslist_obj);
	}
	return hashmap_obj;
}