Use HtUP instead of SdbHt in bin_xnu_kernelcache.c (#4480)

This commit is contained in:
pelijah 2024-05-08 02:31:31 +03:00 committed by GitHub
parent 02990d7291
commit d78fee37f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -104,7 +104,7 @@ static void handle_data_sections(RzBinSection *sect);
static void symbols_from_mach0(RzPVector /*<RzBinSymbol *>*/ *ret, struct MACH0_(obj_t) * mach0, RzBinFile *bf, ut64 paddr, int ordinal); static void symbols_from_mach0(RzPVector /*<RzBinSymbol *>*/ *ret, struct MACH0_(obj_t) * mach0, RzBinFile *bf, ut64 paddr, int ordinal);
static RzList /*<RzBinSymbol *>*/ *resolve_syscalls(RzXNUKernelCacheObj *obj, ut64 enosys_addr); static RzList /*<RzBinSymbol *>*/ *resolve_syscalls(RzXNUKernelCacheObj *obj, ut64 enosys_addr);
static RzList /*<RzBinSymbol *>*/ *resolve_mig_subsystem(RzXNUKernelCacheObj *obj); static RzList /*<RzBinSymbol *>*/ *resolve_mig_subsystem(RzXNUKernelCacheObj *obj);
static void symbols_from_stubs(RzPVector /*<RzBinSymbol *>*/ *ret, HtSS *kernel_syms_by_addr, RzXNUKernelCacheObj *obj, RzBinFile *bf, RKext *kext, int ordinal); static void symbols_from_stubs(RzPVector /*<RzBinSymbol *>*/ *ret, HtUP /*<ut64, char *>*/ *kernel_syms_by_addr, RzXNUKernelCacheObj *obj, RzBinFile *bf, RKext *kext, int ordinal);
static RStubsInfo *get_stubs_info(struct MACH0_(obj_t) * mach0, ut64 paddr, RzXNUKernelCacheObj *obj); static RStubsInfo *get_stubs_info(struct MACH0_(obj_t) * mach0, ut64 paddr, RzXNUKernelCacheObj *obj);
static int prot2perm(int x); static int prot2perm(int x);
@ -1177,21 +1177,19 @@ static RzPVector /*<RzBinSymbol *>*/ *symbols(RzBinFile *bf) {
symbols_from_mach0(ret, obj->mach0, bf, 0, 0); symbols_from_mach0(ret, obj->mach0, bf, 0, 0);
HtSS *kernel_syms_by_addr = sdb_ht_new(); HtUP *kernel_syms_by_addr = ht_up_new((HtUPDupValue)strdup, free);
if (!kernel_syms_by_addr) { if (!kernel_syms_by_addr) {
rz_pvector_free(ret); rz_pvector_free(ret);
return NULL; return NULL;
} }
char tmpbuf[32];
RzListIter *iter; RzListIter *iter;
void **it; void **it;
RzBinSymbol *sym; RzBinSymbol *sym;
ut64 enosys_addr = 0; ut64 enosys_addr = 0;
rz_pvector_foreach (ret, it) { rz_pvector_foreach (ret, it) {
sym = *it; sym = *it;
const char *key = rz_strf(tmpbuf, "%" PFMT64x, sym->vaddr); ht_up_insert(kernel_syms_by_addr, sym->vaddr, sym->dname ? sym->dname : sym->name);
sdb_ht_insert(kernel_syms_by_addr, key, sym->dname ? sym->dname : sym->name);
if (!enosys_addr && strstr(sym->name, "enosys")) { if (!enosys_addr && strstr(sym->name, "enosys")) {
enosys_addr = sym->vaddr; enosys_addr = sym->vaddr;
} }
@ -1200,8 +1198,7 @@ static RzPVector /*<RzBinSymbol *>*/ *symbols(RzBinFile *bf) {
RzList *syscalls = resolve_syscalls(obj, enosys_addr); RzList *syscalls = resolve_syscalls(obj, enosys_addr);
if (syscalls) { if (syscalls) {
rz_list_foreach (syscalls, iter, sym) { rz_list_foreach (syscalls, iter, sym) {
const char *key = rz_strf(tmpbuf, "%" PFMT64x, sym->vaddr); ht_up_insert(kernel_syms_by_addr, sym->vaddr, sym->name);
sdb_ht_insert(kernel_syms_by_addr, key, sym->name);
rz_pvector_push(ret, sym); rz_pvector_push(ret, sym);
} }
syscalls->free = NULL; syscalls->free = NULL;
@ -1211,8 +1208,7 @@ static RzPVector /*<RzBinSymbol *>*/ *symbols(RzBinFile *bf) {
RzList *subsystem = resolve_mig_subsystem(obj); RzList *subsystem = resolve_mig_subsystem(obj);
if (subsystem) { if (subsystem) {
rz_list_foreach (subsystem, iter, sym) { rz_list_foreach (subsystem, iter, sym) {
const char *key = rz_strf(tmpbuf, "%" PFMT64x, sym->vaddr); ht_up_insert(kernel_syms_by_addr, sym->vaddr, sym->name);
sdb_ht_insert(kernel_syms_by_addr, key, sym->name);
rz_pvector_push(ret, sym); rz_pvector_push(ret, sym);
} }
subsystem->free = NULL; subsystem->free = NULL;
@ -1243,10 +1239,9 @@ static RzPVector /*<RzBinSymbol *>*/ *symbols(RzBinFile *bf) {
} }
} }
RZ_FREE(inits); free(inits);
RZ_FREE(terms); free(terms);
ht_up_free(kernel_syms_by_addr);
sdb_ht_free(kernel_syms_by_addr);
return ret; return ret;
} }
@ -1433,17 +1428,16 @@ beach:
#define K_MIG_ROUTINE_SIZE (5 * 8) #define K_MIG_ROUTINE_SIZE (5 * 8)
#define K_MIG_MAX_ROUTINES 100 #define K_MIG_MAX_ROUTINES 100
static HtSS *mig_hash_new(void) { static HtUP /*<ut64, const char *>*/ *mig_hash_new(void) {
HtSS *hash = sdb_ht_new(); HtUP *hash = ht_up_new(NULL, NULL);
if (!hash) { if (!hash) {
return NULL; return NULL;
} }
int i; for (size_t i = 0; i < RZ_MIG_INDEX_LEN; i += 2) {
for (i = 0; i < RZ_MIG_INDEX_LEN; i += 2) { ut64 num = strtoull(mig_index[i], NULL, 10);
const char *num = mig_index[i];
const char *name = mig_index[i + 1]; const char *name = mig_index[i + 1];
sdb_ht_insert(hash, num, name); ht_up_insert(hash, num, (void *)name);
} }
return hash; return hash;
@ -1455,7 +1449,7 @@ static RzList /*<RzBinSymbol *>*/ *resolve_mig_subsystem(RzXNUKernelCacheObj *ob
return NULL; return NULL;
} }
HtSS *mig_hash = NULL; HtUP *mig_hash = NULL;
RzList *subsystem = NULL; RzList *subsystem = NULL;
ut8 *data_const = NULL; ut8 *data_const = NULL;
ut64 data_const_offset = 0, data_const_size = 0, data_const_vaddr = 0; ut64 data_const_offset = 0, data_const_size = 0, data_const_vaddr = 0;
@ -1500,7 +1494,6 @@ static RzList /*<RzBinSymbol *>*/ *resolve_mig_subsystem(RzXNUKernelCacheObj *ob
goto beach; goto beach;
} }
char tmpbuf[32];
ut8 *cursor = data_const; ut8 *cursor = data_const;
ut8 *end = data_const + data_const_size; ut8 *end = data_const + data_const_size;
while (cursor + sizeof(ut64) * 2 <= end) { while (cursor + sizeof(ut64) * 2 <= end) {
@ -1560,10 +1553,8 @@ static RzList /*<RzBinSymbol *>*/ *resolve_mig_subsystem(RzXNUKernelCacheObj *ob
} }
int num = idx + subs_min_idx; int num = idx + subs_min_idx;
bool found = false; const char *name = ht_up_find(mig_hash, (ut64)num, NULL);
const char *key = rz_strf(tmpbuf, "%d", num); if (RZ_STR_ISNOTEMPTY(name)) {
const char *name = sdb_ht_find(mig_hash, key, &found);
if (found && name && *name) {
sym->name = rz_str_newf("mig.%d.%s", num, name); sym->name = rz_str_newf("mig.%d.%s", num, name);
} else { } else {
sym->name = rz_str_newf("mig.%d", num); sym->name = rz_str_newf("mig.%d", num);
@ -1586,20 +1577,16 @@ static RzList /*<RzBinSymbol *>*/ *resolve_mig_subsystem(RzXNUKernelCacheObj *ob
RZ_FREE(routines); RZ_FREE(routines);
} }
sdb_ht_free(mig_hash); ht_up_free(mig_hash);
RZ_FREE(data_const); free(data_const);
RZ_FREE(sections); free(sections);
return subsystem; return subsystem;
beach: beach:
if (subsystem) { rz_list_free(subsystem);
rz_list_free(subsystem); ht_up_free(mig_hash);
} free(data_const);
if (mig_hash) { free(sections);
sdb_ht_free(mig_hash);
}
RZ_FREE(data_const);
RZ_FREE(sections);
return NULL; return NULL;
} }
@ -1616,12 +1603,11 @@ static ut64 extract_addr_from_code(ut8 *arm64_code, ut64 vaddr) {
return addr; return addr;
} }
static void symbols_from_stubs(RzPVector /*<RzBinSymbol *>*/ *ret, HtSS *kernel_syms_by_addr, RzXNUKernelCacheObj *obj, RzBinFile *bf, RKext *kext, int ordinal) { static void symbols_from_stubs(RzPVector /*<RzBinSymbol *>*/ *ret, HtUP /*<ut64, char *>*/ *kernel_syms_by_addr, RzXNUKernelCacheObj *obj, RzBinFile *bf, RKext *kext, int ordinal) {
RStubsInfo *stubs_info = get_stubs_info(kext->mach0, kext->range.offset, obj); RStubsInfo *stubs_info = get_stubs_info(kext->mach0, kext->range.offset, obj);
if (!stubs_info) { if (!stubs_info) {
return; return;
} }
char tmpbuf[32];
ut64 stubs_cursor = stubs_info->stubs.offset; ut64 stubs_cursor = stubs_info->stubs.offset;
ut64 stubs_end = stubs_cursor + stubs_info->stubs.size; ut64 stubs_end = stubs_cursor + stubs_info->stubs.size;
@ -1654,8 +1640,7 @@ static void symbols_from_stubs(RzPVector /*<RzBinSymbol *>*/ *ret, HtSS *kernel_
target_addr = addr; target_addr = addr;
} }
const char *key = rz_strf(tmpbuf, "%" PFMT64x, addr); const char *name = ht_up_find(kernel_syms_by_addr, addr, &found);
const char *name = sdb_ht_find(kernel_syms_by_addr, key, &found);
if (found) { if (found) {
RzBinSymbol *sym = RZ_NEW0(RzBinSymbol); RzBinSymbol *sym = RZ_NEW0(RzBinSymbol);