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