Не удается получить размер сегмента текста Mach-O в исполняемом файле iOS - PullRequest
3 голосов
/ 28 марта 2019

Я пытаюсь получить размер сегмента .text исполняемого файла Mach-O моего приложения для iOS.

size_t size_of_image(struct mach_header *header) {
size_t sz = sizeof(*header); // Size of the header
sz += header->sizeofcmds;    // Size of the load commands

struct load_command *lc = (struct load_command *) (header + 1);
for (uint32_t i = 0; i < header->ncmds; i++) {
    if (lc->cmd == LC_SEGMENT_64) {
        sz += ((struct segment_command *) lc)->vmsize; // Size of segments
    }
    lc = (struct load_command *) ((char *) lc + lc->cmdsize);
}
return sz;
}

и я вызываю эту функцию из основного

int main(int argc, char * argv[]) {
const struct mach_header * header;
Dl_info dlinfo;
//
if (dladdr(main, &dlinfo) == 0 || dlinfo.dli_fbase == NULL)
    return 0; // Can't find symbol for main
//
header = dlinfo.dli_fbase;  // Pointer on the Mach-O header
size_of_image(header);
@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

Проблема в том, что lc-> cmd всегда равно 0, и я никогда не получаю команду LC_SEGMENT_64 .

Я пробовал LC_SEGMENT - тот же результат

Запуск iOS 12 на iPhone 6. Мне нужно получить .text сегмент исполняемого файла для функций обратной инженерии защиты.

Кажется, мой ** заголовок mach_header * ** ошибочно указан в функции dladdr .

Есть идеи, что не так?

1 Ответ

2 голосов
/ 28 марта 2019

Преступник в struct mach_header *header.
Замените его на struct mach_header_64 *header.
Продолжайте использовать LC_SEGMENT_64 для современных двоичных файлов.

...