Closed cjsworld closed 6 years ago
static void inspect_dyld() {
const struct dyld_all_image_infos *aii = _dyld_get_all_image_infos();
const void *dyld_hdr = aii->dyldImageLoadAddress;
const char *names[2] = { "__ZNK16ImageLoaderMachO8getSlideEv",
"__ZNK16ImageLoaderMachO10machHeaderEv" };
void *syms[2];
intptr_t dyld_slide = -1;
find_syms_raw(dyld_hdr, &dyld_slide, names, syms, 2);
if (!syms[0] || !syms[1])
substitute_panic("couldn't find ImageLoader methods\n");
ImageLoaderMachO_getSlide = syms[0];
ImageLoaderMachO_machHeader = syms[1];
}
/* 'dlhandle' keeps the image alive */
EXPORT
struct substitute_image *substitute_open_image(const char *filename) {
pthread_once(&dyld_inspect_once, inspect_dyld);
void *dlhandle = dlopen(filename, RTLD_LAZY | RTLD_LOCAL | RTLD_NOLOAD);
if (!dlhandle)
return NULL;
const void *image_header = ImageLoaderMachO_machHeader(dlhandle); <<-- Crash here!!
intptr_t slide = ImageLoaderMachO_getSlide(dlhandle);
struct substitute_image *im = malloc(sizeof(*im));
if (!im)
return NULL;
im->slide = slide;
im->dlhandle = dlhandle;
im->image_header = image_header;
return im;
}
It seems to be fixed in latest version of substitute.
Crash: