그래서 IDA Pro에서 바이너리를 열어 세그먼트 시작/중지 위치를 결정할 수 있습니다. Cocoa에서 이것을 런타임에 결정할 수 있습니까? 내가 믿고있어실행 시간에 프로그램 세그먼트 (헤더, 텍스트, 제약 등 ...) 결정
이, 나는 마하 헤더에 주위를 찌르고이 가능 약간의 C 레벨 라이브러리 함수하지만 많이 찾을 수 없습니다 : 미리/
감사합니다!
그래서 IDA Pro에서 바이너리를 열어 세그먼트 시작/중지 위치를 결정할 수 있습니다. Cocoa에서 이것을 런타임에 결정할 수 있습니까? 내가 믿고있어실행 시간에 프로그램 세그먼트 (헤더, 텍스트, 제약 등 ...) 결정
이, 나는 마하 헤더에 주위를 찌르고이 가능 약간의 C 레벨 라이브러리 함수하지만 많이 찾을 수 없습니다 : 미리/
감사합니다!
코코아에는 Mach-O 파일을 처리하기위한 클래스가 포함되어 있지 않습니다. 시스템에서 제공하는 Mach-O 기능을 사용해야합니다. 당신은 Mach-O 헤더를 읽었습니다.
저는 Mach-O 파일 이름을 입력으로 받아들이고 해당 세그먼트에 대한 정보를 덤프하는 작은 프로그램을 코딩했습니다. 이 프로그램은 x86_64 아키텍처의 경우에만 얇은 파일 (즉, 뚱뚱하지 않은/범용이 아닌 파일)을 처리합니다.
참고 : 또한 모든 작업과 파일이 올바르게 구성된 Mach-O 파일인지 확인하지 않습니다. 적절한 점검을하는 것은 독자에게 연습으로 남겨 둡니다.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mach-o/loader.h>
#include <sys/mman.h>
#include <sys/stat.h>
int main(int argc, char *argv[]) {
int fd;
struct stat stat_buf;
size_t size;
char *addr = NULL;
struct mach_header_64 *mh;
struct load_command *lc;
struct segment_command_64 *sc;
// Open the file and get its size
fd = open(argv[1], O_RDONLY);
fstat(fd, &stat_buf);
size = stat_buf.st_size;
// Map the file to memory
addr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_FILE | MAP_PRIVATE, fd, 0);
// The first bytes of a Mach-O file comprise its header
mh = (struct mach_header_64 *)addr;
// Load commands follow the header
addr += sizeof(struct mach_header_64);
printf("There are %d load commands\n", mh->ncmds);
for (int i = 0; i < mh->ncmds; i++) {
lc = (struct load_command *)addr;
if (lc->cmdsize == 0) continue;
// If the load command is a (64-bit) segment,
// print information about the segment
if (lc->cmd == LC_SEGMENT_64) {
sc = (struct segment_command_64 *)addr;
printf("Segment %s\n\t"
"vmaddr 0x%llx\n\t"
"vmsize 0x%llx\n\t"
"fileoff %llu\n\t"
"filesize %llu\n",
sc->segname,
sc->vmaddr,
sc->vmsize,
sc->fileoff,
sc->filesize);
}
// Advance to the next load command
addr += lc->cmdsize;
}
printf("\nDone.\n");
munmap(addr, size);
close(fd);
return 0;
}
이 프로그램을 x86_64 비트 전용으로 컴파일하고 x86_64 Mach-O 바이너리에 대해 실행해야합니다. 예를 들어, TEST.C로이 프로그램을 저장 한 가정하면
$ clang test.c -arch x86_64 -o test
$ ./test ./test
There are 11 load commands
Segment __PAGEZERO
vmaddr 0x0
vmsize 0x100000000
fileoff 0
filesize 0
Segment __TEXT
vmaddr 0x100000000
vmsize 0x1000
fileoff 0
filesize 4096
Segment __DATA
vmaddr 0x100001000
vmsize 0x1000
fileoff 4096
filesize 4096
Segment __LINKEDIT
vmaddr 0x100002000
vmsize 0x1000
fileoff 8192
filesize 624
Done.
당신이 마하-O 파일을 읽는 방법에 대한 더 많은 예제를 원한다면, cctools on Apple’s Open Source Web site는 아마 당신의 최선의 방법이다. Mac OS X ABI Mach-O File Format Reference도 읽고 싶을 것입니다.
내가 언급 한 프레임 워크에 대한 경험이 없으므로 답변으로 게시하는 것이 좋지만 세그먼트가 실행 파일 자체의 헤더에 의해 결정된다는 것을 알고있는 한. 런타임에 이러한 정보를 찾고 싶다면 파일 읽기에 대한 일반적인 fuctions가 충분해야한다고 생각합니다. 사용중인 실행 파일 형식에 대한 몇 가지 사양을 알아 내면 어떤 바이트 의미인지 알 수 있습니다. – Pyjong