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; }
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; } }
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; }