在iOS可执行文件中无法获得Mach-O文本段大小

问题描述 投票:3回答:1

我试图得到我的iOS应用程序的Mach-O可执行文件的.text段大小。

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

我从main调用此函数

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 - 结果相同

在iPhone 6上运行iOS 12.我需要获取可执行文件的.text段以进行反向工程保护功能。

似乎我的** mach_header *标题**是由dladdr函数错误的字段。

有什么想法有什么不对?

ios executable reverse-engineering segment mach-o
1个回答
2
投票

罪魁祸首是在struct mach_header *header。 用struct mach_header_64 *header替换它。 继续使用LC_SEGMENT_64作为现代二进制文件。

© www.soinside.com 2019 - 2024. All rights reserved.