无法在 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 文本段大小的主要内容,如果未能解决你的问题,请参考以下文章

iOS逆向之Mach-O文件(上)

[iOS研习记]聊聊iOS中的Mach-O

通过Mach-O文件结构看iOS堆栈信息

通过Mach-O文件结构看iOS堆栈信息

iOS系统分析Mach-O二进制文件解析

MachO文件详解--逆向开发