好吧,我一直在尝试获取 Loaded OSX Dylibs 在运行时运行 Proccesses 的基本地址。
在使用 task_info 之后,我使用 dyld_all_image_infos 在运行时转储了所有附加的 Dylib,得到了名称和 ImageLoadADDRESS、mach_header 和 segment_command。
但我无法到达那里 Baseaddress On runtime..
一切都很好,除了我对如何在运行时获取所请求图像的实际基地址感到困惑!我在使用 imageLoadAddress 获取 mach_header 后得到的幻数也是 "feedfacf" 。不应该是“馈线”吗?
搜索后我发现“segment_command”中的“fileoff”应该引导我到数据部分。这也行不通。
我的输出看起来很棒,但是当我尝试在作弊引擎中查看这个内存区域时,它是空的!
我的调试输出:
mach object header
magic number feedfacf
cputype 01000007 - x86_64
subcputype 00000003
filetype 00000006
ncmds 00000015
sizeofcmds 00000988
flags 00118085
Segment
File Off 45545f5f
DYLIB: client.dylib
我的代码如下:
// mach_header
mach_msg_type_number_t size4 = sizeof(mach_header);
uint8_t* info_addr2 =
readProcessMemory(this->task, (mach_vm_address_t) info[i].imageLoadAddress, &size4);
mach_header *info2 = (mach_header*) info_addr2;
// segment
mach_msg_type_number_t size5 = sizeof(segment_command);
uint8_t* info_addr3 =
readProcessMemory(this->task, (mach_vm_address_t) info[i].imageLoadAddress + sizeof(info2), &size5);
segment_command *info3 = (segment_command*) info_addr3;
tmp_str = tmp_str.substr(tmp_str.find_last_of("/") + 1, tmp_str.length());
//printf("%i Debug: %s\n", i, tmp_str.c_str());
this->dylibs[cc].Name = tmp_str;
this->dylibs[cc].imgHead = info2;
// this->dylibs[i].tSize = this->size_of_image((mach_header*)info[i].imageLoadAddress);
if(strcmp(tmp_str.c_str(), "client.dylib") == 0){
this->client = cc;
printf("mach object header\n");
printf("magic number\t%08x\n", info2->magic);
printf("cputype\t\t%08x - %s\n", info2->cputype,cpu_type_name(info2->cputype));//cputype_to_string(info2->filetype)
printf("subcputype\t%08x\n", info2->cpusubtype);
printf("filetype\t%08x\n", info2->filetype);// filetype_to_string(info2->filetype)
printf("ncmds\t\t%08x\n", info2->ncmds);
printf("sizeofcmds\t%08x\n", info2->sizeofcmds);
printf("flags\t\t%08x\n", info2->flags);
printf("Segment\n");
printf("File Off\t%x\n", info3->fileoff );
任何人都可以帮助我吗?将不胜感激!( ps:代码有点混乱,但我从几天以来一直在工作,无法让它工作,所以我现在不想用更好的风格来写它!)