从getsectbyname崩溃读取字节

时间:2015-03-11 04:50:28

标签: macos mach-o

更新:感谢Greg Parker的指针,请回答下面的问题......

我在这里上传了一个示例项目,但我也会对其进行描述:https://github.com/tewha/getsectbyname-crash

我从我的(仅限64位)可执行文件中崩溃,但从 Xcode 运行时却没有。但是,如果我从终端乐器运行它,它会崩溃。

这是调试与发布配置问题;在终端中运行Debug可执行文件也崩溃了。从Xcode运行Release可执行文件。

我正在尝试从Mach-O可执行文件中读取一个有效部分,通过CREATE_INFOPLIST_SECTION_IN_BINARY = YES链接到应用程序。

const struct section_64 *plistSection = getsectbyname("__TEXT", "__info_plist");
NSLog(@"Found a section %s, %s", plistSection->segname, plistSection->sectname);
void *ptr = ((void *)plistSection->addr);
uint64_t size = plistSection->size;

NSLog(@"It has %zd bytes at %tx", size, plistSection->addr);
NSLog(@"Allocating %zd bytes", size);
void *buffer = malloc(size);
NSLog(@"Moving %zd bytes", size);
NSLog(@"(Crashes when doing the memmove.)");
memmove(buffer, ptr, size);
NSLog(@"Freeing %zd bytes", size);
free(buffer);

输出看起来像这样(我简化了一下以删除日期/时间戳,进程ID):

bash-4.3$ ./getsectbyname 
getsectbyname Found a section __TEXT, __info_plist
getsectbyname It has 658 bytes at 100000d07
getsectbyname Allocating 658 bytes
getsectbyname Moving 658 bytes
getsectbyname (Crashes when doing the memmove.)
Segmentation fault: 11

有谁能告诉我如何解决这个问题?

答案:

#import <Foundation/Foundation.h>

#include <mach-o/getsect.h>
#include <mach-o/ldsyms.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSError *e;
        unsigned long size;
        void *ptr = getsectiondata(&_mh_execute_header, "__TEXT",
                      "__info_plist", &size);
        NSData *plistData = [NSData dataWithBytesNoCopy:ptr length:size
                      freeWhenDone:NO];
        NSPropertyListFormat format;
        NSDictionary *infoPlistContents =
            [NSPropertyListSerialization propertyListWithData:plistData
             options:NSPropertyListImmutable format:&format error:&e];
        NSLog(@"The value for Key is %@", infoPlistContents[@"Key"]);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:11)

getsectbyname()不会调整ASLR的部分地址。如果部署目标允许,则应使用getsectiondata()(我认为首先在OS X 10.7中实现)。