无法在 iOS 可执行文件中获取 Mach-O 文本段大小
Posted
技术标签:
【中文标题】无法在 iOS 可执行文件中获取 Mach-O 文本段大小【英文标题】:Can't get Mach-O text segment size in iOS executable 【发布时间】:2019-08-19 09:37:27 【问题描述】:我正在尝试获取我的 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 *header** 是 dladdr 函数的错误字段。
有什么想法吗?
【问题讨论】:
你好安德鲁,你解决这个问题了吗?我有同样的问题。 见下面的答案。它对我有用@AgustinPazos 【参考方案1】:罪魁祸首在struct mach_header *header
。
将其替换为 struct mach_header_64 *header
。
继续使用 LC_SEGMENT_64
处理现代二进制文件。
【讨论】:
以上是关于无法在 iOS 可执行文件中获取 Mach-O 文本段大小的主要内容,如果未能解决你的问题,请参考以下文章