gpt4 book ai didi

cocoa - 在运行时确定程序段(HEADER、TEXT、CONST 等)

转载 作者:行者123 更新时间:2023-12-03 16:24:05 27 4
gpt4 key购买 nike

所以我意识到我可以在 IDA Pro 中打开二进制文件并确定段的开始/停止位置。是否可以在 Cocoa 运行时确定这一点?

我假设有一些 C 级库函数可以实现此功能,我在 mach 头中查找但找不到太多:/

提前致谢!

最佳答案

Cocoa 不包含用于处理 Mach-O 文件的类。需要使用系统提供的Mach-O函数。您读对了 Mach-O header 。

我编写了一个小程序,它接受 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.

如果您想了解更多有关如何读取 Mach-O 文件的示例,cctools on Apple’s Open Source Web site可能是你最好的选择。您还需要阅读Mac OS X ABI Mach-O File Format Reference也是如此。

关于cocoa - 在运行时确定程序段(HEADER、TEXT、CONST 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5433369/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com