macos — all_image_infos от pid в OS X Переполнение стека

В настоящее время я пытаюсь получить базовые адреса из внешнего процесса
используя C ++ в Xcode!
Это то, что я получил так далеко:

 if (task_info(this->_pmach_port, TASK_DYLD_INFO, (task_info_t)&dyld_info, &count) == KERN_SUCCESS)
{
this->Read(this->dyld_info.all_image_info_addr, sizeof(dyld_all_image_infos), &this->all_image_infos);
printf("Got Task info!\nall_image offset: 0x%llx\ninfo array count: %i",this->dyld_info.all_image_info_addr,this->all_image_infos.infoArrayCount);
printf("Version: %i\n",this->all_image_infos.version);

for(int i=0;i< this->all_image_infos.infoArrayCount;i++) {
printf("image: %s %d\n",
this->all_image_infos.infoArray[i].imageFilePath,
this->all_image_infos.infoArray[i].imageLoadAddress
);
}
}

Нет проблем, и мой вывод следующий:

    Process To open: hl2_osx
Got Task info!
all_image offset: 0x8feb052c
info array count: 303 Version: 14

Моя главная проблема заключается в том, что Xcode останавливается на той строке, где я хочу вывести информацию о моём модуле.
с причиной:

EXC_BAD_ACCESS (код = EXC_I368_GPFLT)

Что я делаю не так?

Поскольку я только что перешел от использования функций WINApi в Windows для написания программ на Mac,

Я надеюсь, что кто-то может помочь мне!

0

Решение

Для любого указателя в структуре вы не можете получить прямой доступ к указанным данным. Вы должны прочитать это из другого процесса, так же, как вы читаете all_image_infos структура. info_array Указатель имеет эту проблему. Так же как и imageFilePath это внутри. И т.п.


struct dyld_image_info *infoArray;
size_t size = sizeof(*infoArray) * this->all_image_infos.infoArrayCount;
infoArray = malloc(size);
this->Read(this->all_image_infos.infoArray, size, infoArray);
for(int i=0;i< this->all_image_infos.infoArrayCount;i++) {
char path[PATH_MAX];
this->Read(infoArray[i].imageFilePath, sizeof(path), path);
path[sizeof(path) - 1] = 0;
// Alternatively, you could use memchr() to see if path is null-terminated. If not, print what you have and read more, in a loop.
printf("image: %s %d\n",
path,
infoArray[i].imageLoadAddress
);
}
1

Другие решения


По вопросам рекламы [email protected]