Joh*_*iss 8 macos mach-o shared-libraries dyld
我需要在OS X上的共享库中找到本地符号的偏移量.本地符号与非导出符号中的一样.因此dyld("symbol_name")不会起作用.
但是,我可以用它nm来找到这些偏移量
$ nm /System/Library/PrivateFrameworks/DesktopServicesPriv.framework/DesktopServicesPriv | grep -e ChildSetLabel -e NodeVolumeEject
000000000006cccd T _NodeVolumeEject
000000000009dbd7 t __ChildSetLabel
Run Code Online (Sandbox Code Playgroud)
在那里我们看到导出的(T)符号NodeVolumeEject,0x6cccd我可以轻松地使用它来显示偏移量dyld("NodeVolumeEject").dyld()将显示当前地址空间中的地址,但我对共享库中的偏移量或地址空间中的绝对地址感到满意.另外,还有local(t)符号_ChildSetLabel,它是offset(0x9dbd7)我无法透露使用dyld().
我希望能够以编程方式做到这一点的分辨率(不gobjdump,nm,otool,或任何其他外部程序).是否有"简单"的方法来实现这一目标?上面提到的工具的源代码包含所需的代码,但我想知道是否有更直接的东西.
域:解决方案只适用于OS X 10.8或更高版本的x86_64 MachO二进制文件.
澄清:我很乐意弄清楚当前偏移的绝对偏移(由ASLR引起)显然不是静态的.但我也很高兴找出相对于该库开头的偏移量,该库保持静态(直到重新编译).从"库中的地址"到"地址空间中的地址"的部分非常简单:
off_t sym_offset_child_set_label = ANSWER_TO_THIS_QUESTION("_ChildSetLabel");
Dl_info info;
void *abs_volume_eject = dlsym(RTLD_DEFAULT, "NodeVolumeEject");
void *abs_child_set_label = NULL;
if (dladdr(abs_volume_eject, &info)) {
abs_child_set_label = (void *)((char *)info.dli_fbase + sym_offset_child_set_label);
/* abs_child_set_label now points to the function in question */
}
Run Code Online (Sandbox Code Playgroud)
这是,只要_ChildSetLabel和NodeVolumeEject相同的共享库足够.因此,ASLR不是问题.
另一种可能性(我最终使用的是)Apple的私有CoreSymbolication框架:
void *resolve_private(const char *symbol_owner, const char *symbol_to_resolve)
{
task_t targetTask;
int err = task_for_pid(mach_task_self(), getpid(), &targetTask);
if (err) {
fprintf(stderr, "couldn't get my Mach task\n");
return NULL;
}
CSSymbolicatorRef targetSymbolicator;
targetSymbolicator = CSSymbolicatorCreateWithTaskFlagsAndNotification(targetTask,
kCSSymbolicatorTrackDyldActivity,
^(uint32_t notification_type, CSNotificationData data) {
});
if(CSIsNull(targetSymbolicator)) {
fprintf("CSSymbolicatorCreateWithTaskFlagsAndNotification failed\n");
return NULL;
}
__block CSSymbolOwnerRef symbolOwner = kCSNull;
CSSymbolicatorForeachSymbolOwnerWithNameAtTime(targetSymbolicator,
symbol_owner,
kCSNow,
^(CSSymbolOwnerRef owner) {
symbolOwner = owner;
});
if (CSIsNull(symbolOwner)) {
CSRelease(targetSymbolicator);
fprintf("CSSymbolicatorForeachSymbolOwnerWithNameAtTime failed\n");
return NULL;
}
__block uintptr_t p = (uintptr_t)NULL;
CSSymbolOwnerForeachSymbol(symbolOwner, ^(CSSymbolRef symbol) {
const char *symbol_name = CSSymbolGetMangledName(symbol);
if (0 == strcmp(symbol_name, symbol_to_resolve)) {
p = CSSymbolGetRange(symbol).location;
}
});
CSRelease(targetSymbolicator);
if ((uintptr_t)NULL == p) {
fprintf("symbol not found\n");
return NULL;
} else {
return (void *)p;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1382 次 |
| 最近记录: |