2015-03-11 5 views
7

UPDATE: ответ ниже в вопросе, благодаря указателю Грег Паркер ...Краш чтение байтов из getsectbyname

Я загрузил пример проекта, но я опишу его, а также: https://github.com/tewha/getsectbyname-crash

Я получаю авария из моего моего (только 64-битного) исполняемого файла, но не при запуске от Xcode. Если я запустил его с Клемма или Приборы, однако он падает.

Это не проблема с отладкой по сравнению с версией; запускает исполняемый файл Debug в терминале также сбой. Запуск исполняемого файла Release из Xcode работает.

Я пытаюсь прочитать секцию заражения от исполняемого файла 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); 

Выход выглядит следующим образом (я упростил это немного, чтобы удалить марки даты/времени, процесс удостоверения личности):

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

У меня возник вопрос о том, как сделать то же самое в Swift: http://stackoverflow.com/questions/39732016/calling-getsectiondata-from-swift. Любая помощь оценивается. –

ответ

8

getsectbyname() не регулирует адрес секции для ASLR. Вместо этого вы должны использовать getsectiondata(), если ваша цель развертывания разрешена (в первую очередь реализована в OS X 10.7, я думаю).