我正在尝试获取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段以进行反向工程保护功能。
dladdr 函数似乎错误地填充了我的** mach_header * header **。
有什么想法吗?
答案 0 :(得分:2)
罪魁祸首在struct mach_header *header
中。
改为用struct mach_header_64 *header
。
继续对现代二进制文件使用LC_SEGMENT_64
。